2 // $Id: trackback.php,v 1.2 2004/10/10 12:49:56 henoheno Exp $
4 * PukiWiki TrackBack ¥×¥í¥°¥é¥à
5 * (C) 2003, Katsumi Saito <katsumi@jo1upk.ymt.prug.or.jp>
8 * http://localhost/pukiwiki/pukiwiki.php?FrontPage ¤ÈÌÀ³Î¤Ë»ØÄꤷ¤Ê¤¤¤È
9 * TrackBack ID ¤Î¼èÆÀ¤Ï¤Ç¤¤Ê¤¤
11 * tb_get_id($page) TrackBack Ping ID¤ò¼èÆÀ
12 * tb_id2page($tb_id) TrackBack Ping ID ¤«¤é¥Ú¡¼¥¸Ì¾¤ò¼èÆÀ
13 * tb_get_filename($page) TrackBack Ping ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ
14 * tb_count($page) TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ // pukiwiki.skin.LANG.php
15 * tb_send($page, $data) TrackBack Ping Á÷¿® // file.php
16 * tb_delete($page) TrackBack Ping ¥Ç¡¼¥¿ºï½ü // edit.inc.php
17 * tb_get($file, $key = 1) TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
18 * tb_get_rdf($page) ʸ¾ÏÃæ¤ËËä¤á¹þ¤à¤¿¤á¤Îrdf¤ò¥Ç¡¼¥¿¤òÀ¸À® // pukiwiki.php
19 * tb_get_url($url) ʸ½ñ¤òGET¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿TrackBack Ping URL¤ò¼èÆÀ
20 * class TrackBack_XML XML¤«¤éTrackBack Ping ID¤ò¼èÆÀ¤¹¤ë¥¯¥é¥¹
21 * == Referer Âбþʬ ==
22 * ref_save($page) Referer ¥Ç¡¼¥¿Êݸ(¹¹¿·) // pukiwiki.php
25 // TrackBack Ping ID¤ò¼èÆÀ
26 function tb_get_id($page)
31 // TrackBack Ping ID ¤«¤é¥Ú¡¼¥¸Ì¾¤ò¼èÆÀ
32 function tb_id2page($tb_id)
34 static $pages, $cache = array();
36 if (isset($cache[$tb_id])) return $cache[$tb_id];
38 if (! isset($pages)) $pages = get_existpages();
40 foreach ($pages as $page) {
41 $_tb_id = tb_get_id($page);
42 $cache[$_tb_id] = $page;
44 if ($_tb_id == $tb_id) return $page;
47 return FALSE; // Not found
50 // TrackBack Ping ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ
51 function tb_get_filename($page, $ext = '.txt')
53 return TRACKBACK_DIR . encode($page) . $ext;
56 // TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ
57 function tb_count($page, $ext = '.txt')
59 $filename = tb_get_filename($page, $ext);
60 return file_exists($filename) ? count(file($filename)) : 0;
63 // TrackBack Ping Á÷¿®
64 function tb_send($page, $data)
66 global $script, $trackback;
68 if (! $trackback) return;
70 // ½èÍý¼Â¹Ô»þ´ÖÀ©¸Â(php.ini ¥ª¥×¥·¥ç¥ó max_execution_time )
71 if (ini_get('safe_mode') == '0') set_time_limit(0);
73 $data = convert_html($data);
75 // convert_html() ÊÑ´¹·ë²Ì¤Î <a> ¥¿¥°¤«¤é URL Ãê½Ð
76 preg_match_all('#href="(https?://[^"]+)"#', $data, $links, PREG_PATTERN_ORDER);
78 // ¼«¥Û¥¹¥È($script¤Ç»Ï¤Þ¤ëurl)¤ò½ü¤¯
79 $links = preg_grep("/^(?!".preg_quote($script,'/')."\?)./", $links[1]);
82 if (! is_array($links) || empty($links)) return;
84 $r_page = rawurlencode($page);
85 $excerpt = strip_htmltag(convert_html(get_source($page)));
89 'title' => $page, // ¥¿¥¤¥È¥ë¤Ï¥Ú¡¼¥¸Ì¾
90 'url' => "$script?$r_page", // Á÷¿®»þ¤ËºÆÅÙ¡¢rawurlencode ¤µ¤ì¤ë
91 'excerpt' => mb_strimwidth(preg_replace("/[\r\n]/", ' ', $excerpt), 0, 255, '...'),
92 'blog_name' => 'PukiWiki/TrackBack 0.1',
93 'charset' => SOURCE_ENCODING // Á÷¿®Â¦Ê¸»ú¥³¡¼¥É(̤´ûÄê)
96 foreach ($links as $link) {
97 // URL ¤«¤é TrackBack ID ¤ò¼èÆÀ¤¹¤ë
98 $tb_id = tb_get_url($link);
99 if (empty($tb_id)) continue; // Trackback is not supported
101 $result = http_request($tb_id, 'POST', '', $putdata);
102 // FIXME: ¥¨¥é¡¼½èÍý¤ò¹Ô¤Ã¤Æ¤â¡¢¤¸¤ã¡¢¤É¤¦¤¹¤ë¡©¤À¤·¤Ê¤¡...
106 // TrackBack Ping ¥Ç¡¼¥¿ºï½ü
107 function tb_delete($page)
109 $filename = tb_get_filename($page);
110 if (file_exists($filename))
114 // TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
115 function tb_get($file, $key = 1)
117 if (! file_exists($file)) return array();
120 $fp = @fopen($file, 'r');
121 set_file_buffer($fp, 0);
124 while ($data = @fgetcsv($fp, 8192, ',')) {
126 $result[rawurldecode($data[$key])] = $data;
134 // ʸ¾ÏÃæ¤Ë trackback:ping ¤òËä¤á¹þ¤à¤¿¤á¤Î¥Ç¡¼¥¿¤òÀ¸À®
135 function tb_get_rdf($page)
139 if (! $trackback) return '';
141 $r_page = rawurlencode($page);
142 $tb_id = tb_get_id($page);
143 // $dcdate = substr_replace(get_date('Y-m-d\TH:i:sO', $time), ':', -2, 0);
146 $_script = get_script_uri(); // Get absolute path
150 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
151 xmlns:dc="http://purl.org/dc/elements/1.1/"
152 xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
154 rdf:about="$_script?$r_page"
155 dc:identifier="$_script?$r_page"
157 trackback:ping="$_script?tb_id=$tb_id" />
163 // ʸ½ñ¤òGET¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿TrackBack Ping url¤ò¼èÆÀ
164 function tb_get_url($url)
166 // ¥×¥í¥¥·¤ò·Ðͳ¤¹¤ëɬÍפ¬¤¢¤ë¥Û¥¹¥È¤Ë¤Ïping¤òÁ÷¿®¤·¤Ê¤¤
167 $parse_url = parse_url($url);
168 if (empty($parse_url['host']) || via_proxy($parse_url['host']))
171 $data = http_request($url);
172 if ($data['rc'] !== 200) return '';
174 if (! preg_match_all('#<rdf:RDF[^>]*>(.*?)</rdf:RDF>#si', $data['data'],
175 $matches, PREG_PATTERN_ORDER))
178 $obj = new TrackBack_XML();
179 foreach ($matches[1] as $body) {
180 $tb_url = $obj->parse($body, $url);
181 if ($tb_url !== FALSE) return $tb_url;
187 // Ëä¤á¹þ¤Þ¤ì¤¿¥Ç¡¼¥¿¤«¤é TrackBack Ping url¤ò¼èÆÀ¤¹¤ë¥¯¥é¥¹
193 function parse($buf, $url)
197 $this->tb_url = FALSE;
199 $xml_parser = xml_parser_create();
200 if ($xml_parser === FALSE) return FALSE;
202 xml_set_element_handler($xml_parser, array(& $this, 'start_element'),
203 array(& $this, 'end_element'));
205 if (! xml_parse($xml_parser, $buf, TRUE)) {
206 /* die(sprintf('XML error: %s at line %d in %s',
207 xml_error_string(xml_get_error_code($xml_parser)),
208 xml_get_current_line_number($xml_parser),
215 return $this->tb_url;
218 function start_element($parser, $name, $attrs) {
219 if ($name !== 'RDF:DESCRIPTION') return;
221 $about = $url = $tb_url = '';
222 foreach ($attrs as $key=>$value) {
228 case 'DC:IDENTIFIER':
231 case 'TRACKBACK:PING':
236 if ($about == $this->url || $url == $this->url) {
237 $this->tb_url = $tb_url;
241 function end_element($parser, $name) {}
244 // Referer ¥Ç¡¼¥¿Êݸ(¹¹¿·)
245 function ref_save($page)
249 if (! $referer || empty($_SERVER['HTTP_REFERER'])) return;
251 $url = $_SERVER['HTTP_REFERER'];
254 // ¼«¥µ¥¤¥ÈÆâ¤Î¾ì¹ç¤Ï½èÍý¤·¤Ê¤¤
255 $parse_url = parse_url($url);
256 if (empty($parse_url['host']) || $parse_url['host'] == $_SERVER['HTTP_HOST'])
259 // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤¹þ¤ß²Äǽ¤«¤Î³Îǧ
260 if (! is_dir(TRACKBACK_DIR)) die(TRACKBACK_DIR.': No such directory');
261 if (! is_writable(TRACKBACK_DIR)) die(TRACKBACK_DIR.': Permission denied');
263 // Referer ¤Î¥Ç¡¼¥¿¤ò¹¹¿·
264 if (ereg("[,\"\n\r]", $url))
265 $url = '"' . str_replace('"', '""', $url) . '"';
267 $filename = tb_get_filename($page, '.ref');
268 $data = tb_get($filename, 3);
269 $d_url = rawurldecode($url);
270 if (! isset($data[$d_url])) {
271 // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤Ï͸ú)
272 $data[$d_url] = array(UTIME, UTIME, 0, $url, 1);
274 $data[$d_url][0] = UTIME;
277 $fp = fopen($filename, 'w');
278 if ($fp === FALSE) return 1;
279 set_file_buffer($fp, 0);
282 foreach ($data as $line) {
283 fwrite($fp, join(',', $line) . "\n");