2 // $Id: trackback.php,v 1.17 2004/07/09 23:47:48 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 (array_key_exists($tb_id,$cache))
38 return $cache[$tb_id];
42 $pages = get_existpages();
44 foreach ($pages as $page)
46 $_tb_id = tb_get_id($page);
47 $cache[$_tb_id] = $page;
49 if ($_tb_id == $tb_id)
54 return FALSE; // ¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç
57 // TrackBack Ping ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ
58 function tb_get_filename($page,$ext='.txt')
60 return TRACKBACK_DIR.encode($page).$ext;
63 // TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ
64 function tb_count($page,$ext='.txt')
66 $filename = tb_get_filename($page,$ext);
67 return file_exists($filename) ? count(file($filename)) : 0;
70 // TrackBack Ping Á÷¿®
71 function tb_send($page,$data)
73 global $script,$trackback;
80 // ½èÍý¼Â¹Ô»þ´ÖÀ©¸Â(php.ini ¥ª¥×¥·¥ç¥ó max_execution_time )
81 if (ini_get('safe_mode') == '0') set_time_limit(0);
83 $data = convert_html($data);
85 // convert_html() ÊÑ´¹·ë²Ì¤Î <a> ¥¿¥°¤«¤é URL Ãê½Ð
86 preg_match_all('#href="(https?://[^"]+)"#',$data,$links,PREG_PATTERN_ORDER);
88 // ¼«¥Û¥¹¥È($script¤Ç»Ï¤Þ¤ëurl)¤ò½ü¤¯
89 $links = preg_grep("/^(?!".preg_quote($script,'/')."\?)./",$links[1]);
92 if (!is_array($links) or count($links) == 0)
97 $r_page = rawurlencode($page);
98 $excerpt = strip_htmltag(convert_html(get_source($page)));
102 'title' => $page, // ¥¿¥¤¥È¥ë¤Ï¥Ú¡¼¥¸Ì¾
103 'url' => "$script?$r_page", // Á÷¿®»þ¤ËºÆÅÙ¡¢rawurlencode ¤µ¤ì¤ë
104 'excerpt' => mb_strimwidth(preg_replace("/[\r\n]/",' ',$excerpt),0,255,'...'),
105 'blog_name' => 'PukiWiki/TrackBack 0.1',
106 'charset' => SOURCE_ENCODING // Á÷¿®Â¦Ê¸»ú¥³¡¼¥É(̤´ûÄê)
108 foreach ($links as $link)
110 // URL ¤«¤é TrackBack ID ¤ò¼èÆÀ¤¹¤ë
111 $tb_id = tb_get_url($link);
112 if (empty($tb_id)) // TrackBack ¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤
116 $result = http_request($tb_id,'POST','',$putdata);
117 // FIXME: ¥¨¥é¡¼½èÍý¤ò¹Ô¤Ã¤Æ¤â¡¢¤¸¤ã¡¢¤É¤¦¤¹¤ë¡©¤À¤·¤Ê¤¡...
121 // TrackBack Ping ¥Ç¡¼¥¿ºï½ü
122 function tb_delete($page)
124 $filename = tb_get_filename($page);
125 if (file_exists($filename))
131 // TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
132 function tb_get($file,$key=1)
134 if (!file_exists($file))
140 $fp = @fopen($file,'r');
141 set_file_buffer($fp, 0);
144 while ($data = @fgetcsv($fp,8192,','))
147 $result[rawurldecode($data[$key])] = $data;
155 // ʸ¾ÏÃæ¤Ë trackback:ping ¤òËä¤á¹þ¤à¤¿¤á¤Î¥Ç¡¼¥¿¤òÀ¸À®
156 function tb_get_rdf($page)
158 global $script,$trackback;
165 $r_page = rawurlencode($page);
166 $tb_id = tb_get_id($page);
167 // $dcdate = substr_replace(get_date('Y-m-d\TH:i:sO',$time),':',-2,0);
172 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
173 xmlns:dc="http://purl.org/dc/elements/1.1/"
174 xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
176 rdf:about="$script?$r_page"
177 dc:identifier="$script?$r_page"
179 trackback:ping="$script?tb_id=$tb_id" />
185 // ʸ½ñ¤òGET¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿TrackBack Ping url¤ò¼èÆÀ
186 function tb_get_url($url)
188 // ¥×¥í¥¥·¤ò·Ðͳ¤¹¤ëɬÍפ¬¤¢¤ë¥Û¥¹¥È¤Ë¤Ïping¤òÁ÷¿®¤·¤Ê¤¤
189 $parse_url = parse_url($url);
190 if (empty($parse_url['host']) or via_proxy($parse_url['host']))
195 $data = http_request($url);
197 if ($data['rc'] !== 200)
202 if (!preg_match_all('#<rdf:RDF[^>]*>(.*?)</rdf:RDF>#si',$data['data'],$matches,PREG_PATTERN_ORDER))
207 $obj = new TrackBack_XML();
208 foreach ($matches[1] as $body)
210 $tb_url = $obj->parse($body,$url);
211 if ($tb_url !== FALSE)
219 // Ëä¤á¹þ¤Þ¤ì¤¿¥Ç¡¼¥¿¤«¤é TrackBack Ping url¤ò¼èÆÀ¤¹¤ë¥¯¥é¥¹
225 function parse($buf,$url)
229 $this->tb_url = FALSE;
231 $xml_parser = xml_parser_create();
232 if ($xml_parser === FALSE)
236 xml_set_element_handler($xml_parser,array(&$this,'start_element'),array(&$this,'end_element'));
238 if (!xml_parse($xml_parser,$buf,TRUE))
240 /* die(sprintf('XML error: %s at line %d in %s',
241 xml_error_string(xml_get_error_code($xml_parser)),
242 xml_get_current_line_number($xml_parser),
249 return $this->tb_url;
251 function start_element($parser,$name,$attrs)
253 if ($name !== 'RDF:DESCRIPTION')
258 $about = $url = $tb_url = '';
259 foreach ($attrs as $key=>$value)
267 case 'DC:IDENTIFIER':
270 case 'TRACKBACK:PING':
275 if ($about == $this->url or $url == $this->url)
277 $this->tb_url = $tb_url;
280 function end_element($parser,$name)
286 // Referer ¥Ç¡¼¥¿Êݸ(¹¹¿·)
287 function ref_save($page)
291 if (!$referer or empty($_SERVER['HTTP_REFERER']))
296 $url = $_SERVER['HTTP_REFERER'];
299 // ¼«¥µ¥¤¥ÈÆâ¤Î¾ì¹ç¤Ï½èÍý¤·¤Ê¤¤
300 $parse_url = parse_url($url);
301 if (empty($parse_url['host']) or $parse_url['host'] == $_SERVER['HTTP_HOST'])
306 // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤¹þ¤ß²Äǽ¤«¤Î³Îǧ
307 if (!is_dir(TRACKBACK_DIR))
309 die(TRACKBACK_DIR.': No such directory');
311 if (!is_writable(TRACKBACK_DIR))
313 die(TRACKBACK_DIR.': Permission denied');
316 // Referer ¤Î¥Ç¡¼¥¿¤ò¹¹¿·
317 if (ereg("[,\"\n\r]",$url))
319 $url = '"'.str_replace('"', '""', $url).'"';
321 $filename = tb_get_filename($page,'.ref');
322 $data = tb_get($filename, 3);
323 $d_url = rawurldecode($url);
324 if (!array_key_exists($d_url,$data))
326 // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤Ï͸ú)
327 $data[$d_url] = array(UTIME,UTIME,0,$url,1);
329 $data[$d_url][0] = UTIME;
332 if (!($fp = fopen($filename,'w')))
336 set_file_buffer($fp, 0);
339 foreach ($data as $line)
341 fwrite($fp,join(',',$line)."\n");