WeblogUpdatePingを受信して最新エントリーの内容をひろう
作りかけですがコメントアウトした箇所でいろんな種類のFeedに対応させて結果を出力すればいいはずです。たぶん。
まだ未テスト。
<?php mb_language('Japanese'); mb_internal_encoding('UTF-8'); require_once "HTTP/Client.php"; require_once "XML/RPC/Server.php"; function getRSSLocation($html, $location){ if(!$html or !$location){ $res = "Couldn't connect your site."; return $res; }else{ preg_match_all('/<link\s+(.*?)\s*\/?>/si', $html, $matches); $links = $matches[1]; $final_links = array(); $link_count = count($links); for($n=0; $n<$link_count; $n++){ $attributes = preg_split('/\s+/s', $links[$n]); foreach($attributes as $attribute){ $att = preg_split('/\s*=\s*/s', $attribute, 2); if(isset($att[1])){ $att[1] = preg_replace('/([\'"]?)(.*)\1/', '$2', $att[1]); $final_link[strtolower($att[0])] = $att[1]; } } $final_links[$n] = $final_link; } for($n=0; $n<$link_count; $n++){ if(strtolower($final_links[$n]['rel']) == 'alternate'){ if(strtolower($final_links[$n]['type']) == 'application/rss+xml'){ $href = $final_links[$n]['href']; } if(!$href and strtolower($final_links[$n]['type']) == 'text/xml'){ $href = $final_links[$n]['href']; } if($href){ if(strstr($href, "http://") !== false){ $full_url = $href; }else{ $url_parts = parse_url($location); $full_url = "http://$url_parts[host]"; if(isset($url_parts['port'])){ $full_url .= ":$url_parts[port]"; } if($href{0} != '/'){ $full_url .= dirname($url_parts['path']); if(substr($full_url, -1) != '/'){ $full_url .= '/'; } } $full_url .= $href; } return $full_url; } } } return false; } } function getRSSEntry($feed,$entry){ if(!$feed){ $res = "Couldn't Autodiscover your Feed."; return $res; }else{ $buff = ""; $fp = fopen($feed,"r"); while ( !feof($fp) ) { $buff .= fgets($fp,4096); } fclose($fp); $parser = xml_parser_create(); xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($parser,$buff,$values,$idx); xml_parser_free($parser); /****************************** $in_item = 0; $i=0; $res = array(); $tag = array(); foreach ($values as $value) { $tag = $value["tag"]; $type = $value["type"]; $val = $value["value"]; $tag = strtolower($tag); if ($tag == "item" && $type == "open") { $in_item = 1; } else if ($tag == "item" && $type == "close") { if($entry == $title){ $res['title'] = $title; $res['link'] = $link; $res['date'] = $date; $res['tag'] = $taging; $res['description'] = $description; return $res; } $i++; $in_item = 0; } if ($in_item) { switch ($tag) { case "title": $val = mb_convert_encoding($val,"UTF-8","JIS,UTF-8,SJIS,EUC-JP"); $title = $val; break; case "link": $link = $val; break; case "description": $val = mb_convert_encoding($val,"UTF-8","JIS,UTF-8,SJIS,EUC-JP"); $description = $val; break; case "dc:date": $val = mb_convert_encoding($val,"UTF-8","JIS,UTF-8,SJIS,EUC-JP"); $date = $val; break; case "dc:subject": $val = mb_convert_encoding($val,"UTF-8","JIS,UTF-8,SJIS,EUC-JP"); $taging[] = $val; break; } } } ***********************************/ return false; } } function weblogUpdates($msg) { for ($i = 0; $i < $msg->getNumParams(); $i++) { if ($i == 0) { $title = $msg->getParam($i); $title = $title->scalarval(); } else if ($i == 1) { $url = $msg->getParam($i); $url = $url->scalarval(); } else if ($i == 2) { $change_url = $msg->getParam($i); $change_url = $change_url->scalarval(); } else if ($i == 3) { $category = $msg->getParam($i); $category = $category->scalarval(); } } $client =& new HTTP_Client(); $client->get($url); $result = $client->currentResponse(); $html = mb_convert_encoding($result['body'], "UTF-8","JIS,UTF-8,SJIS,EUC-JP"); //エラー処理 $feed = getRSSLocation($html, $url); //エラー処理 $entry = getRSSEntry($feed,$title); //エラー処理 //ここでDBに登録したりして$resに結果を保存 if($res == "success"){ $value = new XML_RPC_Value( array( "flerror" => new XML_RPC_Value(0, "boolean"), "message" => new XML_RPC_Value("Thx 4 the pinging.")), "struct"); }else{ $value = new XML_RPC_Value( array( "flerror" => new XML_RPC_Value(1, "boolean"), "message" => new XML_RPC_Value($res)), "struct"); } return new XML_RPC_Response($value); } $map = array("weblogUpdates.ping" => array("function" => "weblogUpdates")); $server =& new XML_RPC_Server($map); exit; ?>