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;
?>