2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: amazon.inc.php,v 1.7 2004/12/25 02:28:06 henoheno Exp $
4 // Id: amazon.inc.php,v 1.1 2003/07/24 13:00:00 ´×¼Ë
6 // Amazon plugin: Book-review maker via amazon.com/amazon.jp
9 // 2004 PukiWiki Developer Team
10 // 2003 ´×¼Ë <raku@rakunet.org> (Original author)
12 // Thanks: To reimy and PukiWiki Developers Team.
15 // * 2004/04/03 PukiWiki Developer Team (arino <arino@users.sourceforge.jp>)
16 // - replace plugin_amazon_get_page().
17 // - PLUGIN_AMAZON_XML 'xml.amazon.com' -> 'xml.amazon.co.jp'
18 // * 0.6 URL ¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢No image ¤òɽ¼¨¡¢²èÁüÇÛÃ֤ʤɽ¤Àµ¡£
19 // ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¸Æ¤Ó½Ð¤·Êý¤ò½¤Àµ¡£
20 // ASIN ÈÖ¹æÉôʬ¤ò¥Á¥§¥Ã¥¯¤¹¤ë¡£
21 // ²èÁü¡¢¥¿¥¤¥È¥ë¤Î¥¥ã¥Ã¥·¥å¤Ë¤è¤ë®ÅÙ¤ÎÂçÉý¥¢¥Ã¥×¡£
22 // * 0.7 ¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼À¸À®¤Î¥Ç¥Ð¥Ã¥°¡¢Ç§¾ÚÌäÂê¤Î°ì±þ¤Î¥¯¥ê¥¢¡£
23 // * 0.8 amazon Á´¾¦ÉʤβèÁü¤òɽ¼¨¡£
24 // ¥¢¥½¥·¥¨¥¤¥È ID ¤ËÂбþ¡£
25 // * 0.9 RedHat9+php4.3.2+apache2.0.46 ¤Ç²èÁü¤¬ÅÓÃæ¤Þ¤Ç¤·¤«Æɤ߹þ¤Þ¤ì¤Ê¤¤ÌäÂê¤ËÂн衣
26 // ÆüËܸì¥Ú¡¼¥¸¤Î²¼¤Ë¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼¤òºî¤í¤¦¤È¤¹¤ë¤Èʸ»ú²½¤±¤·¤Æºî¤ì¤Ê¤¤ÌäÂê¤Î²ò·è¡£
27 // ½ñÀҤǤʤ¯ CD ¤Ê¤É¡¢ASIN Éôʬ¤¬Ä¹¤¯¤Æ¤â¥¿¥¤¥È¥ë¤ò¤¦¤Þ¤¯½¦¤¦¤è¤¦¤Ë¤¹¤ë¡£
28 // ¼Ì±Æ¤Î¤ß¼è¤ê¹þ¤à¤Î¤Ç¤Ê¤±¤ì¤Ð¡¢B000002G6J.01 ¤È½ñ¤«¤º B000002G6J ¤È½ñ¤¤¤Æ¤â¼Ì±Æ¤¬½Ð¤ë¤è¤¦¤Ë¤¹¤ë¡£
29 // ASIN ¤ËÂбþ¤¹¤ë¥¥ã¥Ã¥·¥å²èÁü/¥¥ã¥Ã¥·¥å¥¿¥¤¥È¥ë¤ò¤½¤ì¤¾¤ìºï½ü¤¹¤ëµ¡Ç½Äɲá£
30 // proxy Âбþ(»î¸³Åª)¡£
31 // proxy ¼ÂÁõ¤Î²áÄø¤Ç°ìÈ̥桼¥¶¤Î¤¿¤á¤Î AID ¤Ï¤Ê¤¯¤È¤â¼«Æ°À¸À®¤µ¤ì¤ë¤³¤È¤¬¤ï¤«¤ê¡¢ºï½ü¤·¤¿¡£
32 // * 1.0 ¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼¤Ç¤Ê¤¯¡¢¥ì¥Ó¥å¡¼¤È¤¹¤ë¡£
33 // ²èÁü¤Î¥¥ã¥Ã¥·¥å¤òºï½ü¤¹¤ë´ü¸Â¤òÀߤ±¤ë¡£
34 // ¥¿¥¤¥È¥ë¡¢¼Ì±Æ¤ò Web Services ¤Î XML ¥¢¥¯¥»¥¹¤ÎÊýË¡¤Ë¤è¤Ã¤Æ get ¤¹¤ë¤³¤È¤Ç»þ´Ö¤òû½Ì¤¹¤ë¡£
35 // ¥ì¥Ó¥å¡¼¥Ú¡¼¥¸À¸À®¤Î¥¿¥¤¥ß¥ó¥°¤Ë¤Ä¤¤¤ÆÃí¤òÆþ¤ì¤ë¡£
36 // * 1.1 ÊÔ½¸À©¸Â¤ò¤«¤±¤Æ¤¤¤ë¾ì¹ç¡¢Éô³°¼Ô¤¬¥ì¥Ó¥å¡¼¤òºî¤í¤¦¤È¤·¤Æ¡¢¥Ú¡¼¥¸¤Ï¤Ç¤¤Ê¤¤¤¬ ASIN4774110655.tit ¤Ê¤É¤Î¥¥ã¥Ã¥·¥å¤¬¤Ç¤¤ë¤Î¤ò²ò·è¡£
37 // ²èÁü¤ÎºÇ¸å¤¬ 01 ¤Î¾ì¹ç¡¢image ¤òºï½ü¤¹¤ë¤È noimage.jpg ¤È¤Ê¤Ã¤Æ¤·¤Þ¤¦¥Ð¥°¤ò½¤Àµ¡£
38 // 1.0 ¤ÇƳÆþ¤·¤¿ XML ¥¢¥¯¥»¥¹¤Ï¹â®¤À¤¬¡¢ÊÖ¤¹²èÁü¾ðÊ󤬥¦¥½¤Ê¤Î¤Ç¡¢09 ¤¬¤À¤á¤Ê¤é 01 ¤ò¥È¥é¥¤¤¹¤ë¡¢¤Ç»ÃÄêŪ¤Ë²ò·è¡£
43 // * Ãøºî¸¢¤¬´ØÏ¢¤¹¤ë°Ù¡¢www.amazon.co.jp ¤Î¥¢¥½¥·¥¨¥¤¥È¥×¥í¥°¥é¥à¤ò³Îǧ¤Î¾å¤´ÍøÍѲ¼¤µ¤¤¡£
44 // * ¥ì¥Ó¥å¡¼¤Ï¡¢amazon ¥×¥é¥°¥¤¥ó¤¬¸Æ¤Ó½Ð¤¹ÊÔ½¸²èÌ̤Ϥ⤦½ÐÍè¤Æ PukiWiki ¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢
45 // Ãæ»ß¤¹¤ë¤Ê¤éÁ´Ê¸¤òºï½ü¤·¤Æ¥Ú¡¼¥¸¤Î¹¹¿·¥Ü¥¿¥ó¤ò²¡¤¹¤³¤È¡£
46 // * ²¼¤Î PLUGIN_AMAZON_AID¡¢PROXY ¥µ¡¼¥Ð¤ÎÉôʬ¡¢expire ¤ÎÉôʬ¤òŬÅö¤ËÊÔ½¸¤·¤Æ»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤(¾¤Ï¤½¤Î¤Þ¤Þ¤Ç¤â Ok)¡£
49 /////////////////////////////////////////////////
52 // Amazon associate ID
53 //define('PLUGIN_AMAZON_AID',''); // None
54 define('PLUGIN_AMAZON_AID','');
56 // Expire caches per ? days
57 define('PLUGIN_AMAZON_EXPIRE_IMAGECACHE', 1);
58 define('PLUGIN_AMAZON_EXPIRE_TITLECACHE', 356);
60 // Alternative image for 'Image not found'
61 define('PLUGIN_AMAZON_NO_IMAGE', './image/noimage.jpg');
67 define('PLUGIN_AMAZON_SHOP_URI', 'http://www.amazon.co.jp/exec/obidos/ASIN/');
69 // Amazon information inquiry (dev-t = default value in the manual)
70 define('PLUGIN_AMAZON_XML', 'http://xml.amazon.co.jp/onca/xml3?t=webservices-20&' .
71 'dev-t=GTYDRES564THU&type=lite&page=1&f=xml&locale=jp&AsinSearch=');
75 define('PLUGIN_AMAZON_SHOP_URI', 'http://www.amazon.com/exec/obidos/ASIN/');
77 // Amazon information inquiry (dev-t = default value in the manual)
78 define('PLUGIN_AMAZON_XML', 'http://xml.amazon.com/onca/xml3?t=webservices-20&' .
79 'dev-t=GTYDRES564THU&type=lite&page=1&f=xml&locale=us&AsinSearch=');
83 /////////////////////////////////////////////////
85 function plugin_amazon_init()
87 global $amazon_aid, $amazon_body;
89 if (PLUGIN_AMAZON_AID == '') {
92 $amazon_aid = PLUGIN_AMAZON_AID . '/';
95 -ºî¼Ô: [[¤³¤³ÊÔ½¸¤Î¤³¤È]]
105 // ¤Þ¤º¡¢¤³¤Î¥ì¥Ó¥å¡¼¤ò»ß¤á¤ë¾ì¹ç¡¢Á´Ê¸¤òºï½ü¤·¡¢¥Ú¡¼¥¸¤Î[¹¹¿·¥Ü¥¿¥ó]¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡ª(PukiWiki ¤Ë¤Ï¤â¤¦ÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹)
106 // ³¤±¤ë¤Ê¤é¡¢¾å¤Î¡¢[[¤³¤³ÊÔ½¸¤Î¤³¤È]]Éôʬ¤ò³ç¸Ì¤ò´Þ¤á¤Æºï½ü¤·¡¢½ñ¤Ä¾¤·¤Æ¤¯¤À¤µ¤¤¡£
107 // ¤ªÌ¾Á°¡¢Éôʬ¤Ï¤´¼«Ê¬¤Î̾Á°¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£»ä¤À¤È¡¢´×¼Ë¡¢¤Ç¤¹¡£
108 // **¤ªÁ¦¤áÂоݡ¢¤è¤ê¾å¤Ï¡¢¿·¤·¤¤¹Ô¤òÄɲ䷤ʤ¤¤Ç¤¯¤À¤µ¤¤¡£Ìܼ¡ºîÀ®¤Ë»ÈÍѤ¹¤ë¤Î¤Ç¡£
109 // //¤Ç»Ï¤Þ¤ë¥³¥á¥ó¥È¹Ô¤Ï¡¢ºÇ½ªÅª¤ËÁ´Éô¥«¥Ã¥È¤·¤Æ¤¯¤À¤µ¤¤¡£Ìܼ¡¤¬Àµ¾ï¤ËºîÀ®¤Ç¤¤Ê¤¤²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
114 function plugin_amazon_convert()
116 global $script, $vars, $asin, $asin_all;
118 if (func_num_args() == 0) { // ¥ì¥Ó¥å¡¼ºîÀ®
119 $s_page = htmlspecialchars($vars['page']);
121 $s_page = $vars['refer'];
124 <form action="$script" method="post">
126 <input type="hidden" name="plugin" value="amazon" />
127 <input type="hidden" name="refer" value="$s_page" />
129 <input type="text" name="asin" size="30" value="" />
130 <input type="submit" value="¥ì¥Ó¥å¡¼ÊÔ½¸" /> (ISBN 10 ·å or ASIN 12 ·å)
135 } elseif (func_num_args() < 1 || func_num_args() > 3) {
138 $aryargs = func_get_args();
140 $align = strtolower($aryargs[1]);
141 if ($align == 'clear') return '<div style="clear:both"></div>'; // ²þ¹ÔÁÞÆþ
142 if ($align != 'left') $align = 'right'; // ÇÛÃÖ·èÄê
144 $asin_all = htmlspecialchars($aryargs[0]); // for XSS
145 if (is_asin() == FALSE && $align != 'clear') return FALSE;
147 if ($aryargs[2] != '') { // ¥¿¥¤¥È¥ë»ØÄ꤫¼«Æ°¼èÆÀ¤«
148 $title = $alt = htmlspecialchars($aryargs[2]); // for XSS
149 if ($alt == 'image') {
150 $alt = plugin_amazon_get_asin_title();
151 if ($alt == '') return FALSE;
153 } elseif ($alt == 'delimage') {
154 if (unlink(CACHE_DIR . 'ASIN' . $asin . '.jpg')) {
155 return 'Image of ' . $asin . ' deleted...';
157 return 'Image of ' . $asin . ' NOT DELETED...';
159 } elseif ($alt == 'deltitle') {
160 if (unlink(CACHE_DIR . 'ASIN' . $asin . '.tit')) {
161 return 'Title of ' . $asin . ' deleted...';
163 return 'Title of ' . $asin . ' NOT DELETED...';
165 } elseif ($alt == 'delete') {
166 if ((unlink(CACHE_DIR . 'ASIN' . $asin . '.jpg') && unlink(CACHE_DIR . 'ASIN' . $asin . '.tit'))) {
167 return 'Title and Image of ' . $asin . ' deleted...';
169 return 'Title and Image of ' . $asin . ' NOT DELETED...';
173 $alt = $title = plugin_amazon_get_asin_title(); // ¥¿¥¤¥È¥ë¼«Æ°¼èÆÀ
174 if ($alt == '') return FALSE;
177 return plugin_amazon_print_object($align, $alt, $title);
180 function plugin_amazon_action()
182 global $vars, $script, $edit_auth, $edit_auth_users;
183 global $amazon_body, $asin, $asin_all;
185 $asin_all = htmlspecialchars(rawurlencode(strip_bracket($vars['asin'])));
188 $retvars['msg'] = '¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼ÊÔ½¸';
189 $retvars['refer'] = $vars['refer'];
190 $retvars['body'] = plugin_amazon_convert();
194 $s_page = $vars['refer'];
195 $r_page = $s_page . '/' . $asin;
196 $r_page_url = rawurlencode($r_page);
199 if ($edit_auth && (! isset($_SERVER['PHP_AUTH_USER']) ||
200 ! array_key_exists($_SERVER['PHP_AUTH_USER'], $edit_auth_users) ||
201 $edit_auth_users[$_SERVER['PHP_AUTH_USER']] != $_SERVER['PHP_AUTH_PW'])) {
202 header('Location: ' . get_script_uri() . '?cmd=read&page=' . $r_page_url);
204 $title = plugin_amazon_get_asin_title();
205 if ($title == '' || preg_match('/^\//', $s_page)) {
206 header('Location: ' . get_script_uri() . '?cmd=read&page=' . encode($s_page));
208 $body = '#amazon(' . $asin_all . ',,image)' . "\n" . '*' . $title . "\n" . $amazon_body;
209 plugin_amazon_review_save($r_page, $body);
210 header('Location: ' . get_script_uri() . '?cmd=edit&page=' . $r_page_url);
216 function plugin_amazon_inline()
219 global $asin, $asin_ext, $asin_all;
221 list($asin_all) = func_get_args();
223 $asin_all = htmlspecialchars($asin_all); // for XSS
224 if (! is_asin()) return FALSE;
226 $title = plugin_amazon_get_asin_title();
230 return '<a href="' . PLUGIN_AMAZON_SHOP_URI . $asin . '/' . $amazon_aid . 'ref=nosim">' . $title . '</a>' . "\n";
233 function plugin_amazon_print_object($align, $alt, $title)
236 global $asin, $asin_ext, $asin_all;
238 $url = plugin_amazon_cache_image_fetch(CACHE_DIR);
240 if ($title == '') { // ¥¿¥¤¥È¥ë¤¬¤Ê¤±¤ì¤Ð¡¢²èÁü¤Î¤ßɽ¼¨
241 $div = '<div style="float:' . $align . ';margin:16px 16px 16px 16px;text-align:center">' . "\n";
242 $div .= ' <a href="' . PLUGIN_AMAZON_SHOP_URI . $asin . '/' . $amazon_aid . 'ref=nosim">' .
243 '<img src="' . $url . '" alt="' . $alt . '" /></a>' . "\n";
244 $div .= '</div>' . "\n";
246 $div = '<div style="float:' . $align . ';padding:.5em 1.5em .5em 1.5em;text-align:center">' . "\n";
247 $div .= ' <table style="width:110px;border:0;text-align:center"><tr><td style="text-align:center">' . "\n";
248 $div .= ' <a href="' . PLUGIN_AMAZON_SHOP_URI . $asin . '/' . $amazon_aid . 'ref=nosim">' .
249 '<img src="' . $url . '" alt="' . $alt .'" /></a></td></tr>' . "\n";
250 $div .= ' <tr><td style="text-align:center"><a href="' .
251 PLUGIN_AMAZON_SHOP_URI . $asin . '/' . $amazon_aid . 'ref=nosim">' . $title . '</a></td>' . "\n";
252 $div .= ' </tr></table>' . "\n" . '</div>' . "\n";
257 function plugin_amazon_get_asin_title()
259 global $asin, $asin_ext, $asin_all;
261 if ($asin_all == '') return '';
263 $nocache = $nocachable = 0;
265 $url = PLUGIN_AMAZON_XML . $asin;
267 if (file_exists(CACHE_DIR) === FALSE || is_writable(CACHE_DIR) === FALSE) $nocachable = 1; // ¥¥ã¥Ã¥·¥åÉԲĤξì¹ç
269 if (($title = plugin_amazon_cache_title_fetch(CACHE_DIR)) == FALSE) {
270 $nocache = 1; // ¥¥ã¥Ã¥·¥å¸«¤Ä¤«¤é¤º
271 $body = plugin_amazon_get_page($url); // ¤·¤«¤¿¤Ê¤¤¤Î¤Ç¼è¤ê¤Ë¤¤¤¯
273 $body = mb_convert_encoding($body, SOURCE_ENCODING, 'UTF-8');
274 preg_match('/<ProductName>([^<]*)</', $body, $tmpary);
275 $title = trim($tmpary[1]);
277 // preg_match('#<ImageUrlMedium>http://images-jp.amazon.com/images/P/[^.]+\.(..)\.#', $body, $tmpary);
278 // if ($tmpary[1] != '') {
279 // $asin_ext = $tmpary[1];
280 // $asin_all = $asin . $asin_ext;
284 if ($title == '') return '';
286 if ($nocache == 1 && $nocachable != 1) plugin_amazon_cache_title_save($title, CACHE_DIR); // ¥¿¥¤¥È¥ë¤¬¤¢¤ì¤Ð¥¥ã¥Ã¥·¥å¤ËÊݸ
290 // ¥¿¥¤¥È¥ë¥¥ã¥Ã¥·¥å¤¬¤¢¤ë¤«Ä´¤Ù¤ë
291 function plugin_amazon_cache_title_fetch($dir)
293 global $asin, $asin_ext, $asin_all;
295 $filename = $dir . 'ASIN' . $asin . '.tit';
298 if (! is_readable($filename)) {
300 } elseif (PLUGIN_AMAZON_EXPIRE_TITLECACHE * 3600 * 24 < time() - filemtime($filename)) {
304 if ($get_tit) return FALSE;
306 if (($fp = @fopen($filename, 'r')) === FALSE) return FALSE;
307 $title = fgets($fp, 4096);
308 // $tmp_ext = fgets($fp, 4096);
309 // if ($tmp_ext != '') {
310 // $asin_ext = $tmp_ext;
314 if (strlen($title) > 0)
320 // ²èÁü¥¥ã¥Ã¥·¥å¤¬¤¢¤ë¤«Ä´¤Ù¤ë
321 function plugin_amazon_cache_image_fetch($dir)
323 global $asin, $asin_ext, $asin_all;
325 $filename = $dir . 'ASIN' . $asin . '.jpg';
328 if (! is_readable($filename)) {
330 } elseif (PLUGIN_AMAZON_EXPIRE_IMAGECACHE * 3600 * 24 < time() - filemtime($filename)) {
335 $url = 'http://images-jp.amazon.com/images/P/' . $asin . '.' . $asin_ext . '.MZZZZZZZ.jpg';
337 if (! is_url($url)) return FALSE; // URL ·Á¼°¥Á¥§¥Ã¥¯
338 $body = plugin_amazon_get_page($url);
340 $tmpfile = $dir . 'ASIN' . $asin . '.jpg.0';
341 $fp = fopen($tmpfile, 'wb');
344 $size = getimagesize($tmpfile);
347 if ($body == '' || $size[1] <= 1) { // Ä̾ï¤Ï1¤¬Ê֤뤬ǰ¤Î¤¿¤á0¤Î¾ì¹ç¤â(reimy)
348 // ¥¥ã¥Ã¥·¥å¤ò PLUGIN_AMAZON_NO_IMAGE ¤Î¥³¥Ô¡¼¤È¤¹¤ë
349 if ($asin_ext == '09') {
350 $url = 'http://images-jp.amazon.com/images/P/' . $asin . '.01.MZZZZZZZ.jpg';
351 $body = plugin_amazon_get_page($url);
353 $tmpfile = $dir . 'ASIN' . $asin . '.jpg.0';
354 $fp = fopen($tmpfile, 'wb');
357 $size = getimagesize($tmpfile);
361 if ($body == '' || $size[1] <= 1) {
362 $fp = fopen(PLUGIN_AMAZON_NO_IMAGE, 'rb');
363 if (! $fp) return FALSE;
365 while (! feof($fp)) {
366 $body .= fread($fp, 4096);
371 plugin_amazon_cache_image_save($body, CACHE_DIR);
377 function plugin_amazon_cache_title_save($data, $dir)
379 global $asin, $asin_ext, $asin_all;
381 $filename = $dir . 'ASIN' . $asin . '.tit';
383 $fp = fopen($filename, 'w');
391 function plugin_amazon_cache_image_save($data, $dir)
393 global $asin, $asin_ext, $asin_all;
395 $filename = $dir . 'ASIN' . $asin . '.jpg';
397 $fp = fopen($filename, 'wb');
405 function plugin_amazon_review_save($page, $data)
407 global $asin, $asin_ext, $asin_all;
409 $filename = DATA_DIR . encode($page) . '.txt';
411 if (! is_readable($filename)) {
412 $fp = fopen($filename, 'w');
420 function plugin_amazon_get_page($url)
422 $data = http_request($url);
423 return ($data['rc'] == 200) ? $data['data'] : '';
429 global $asin, $asin_ext, $asin_all;
432 if (preg_match('/^([A-Z0-9]{10}).?([0-9][0-9])?$/', $asin_all, $tmpary) == FALSE) {
436 $asin_ext = $tmpary[2];
437 if ($asin_ext == '') {
440 $asin_all = $asin . $asin_ext;