rssping送信方法

ブログブームもすっかり下火となり、今更という感じではあるのですが、rsspingをphpで実現するプログラム例を紹介します。

ライブラリとしては、pearライブラリの”Net_URL“と”XML_RPC“が必要になります。pearライブラリとはphp用に開発されたオープンソースのライブラリ群です。phpのインストールされているサーバ上で

% pear list

などと入力すると現在利用可能なpearライブラリ群が表示されます。

【例】

% pear list
Installed packages:
===================
Package        Version State
Archive_Tar    1.1     stable
Console_Getopt 1.2     stable
DB             1.6.2   stable
FirePHP        0.0.1   devel
HTTP           1.2.2   stable
Mail           1.1.3   stable
Net_SMTP       1.2.6   stable
Net_Socket     1.0.1   stable
PEAR           1.3.2   stable
SQLite         1.0.3   stable
XML_Parser     1.0.1   stable
XML_RPC        1.1.0   stable

今回利用するXML_RPCがリストに存在しない場合は

# pear install XML_RPC

とすれば、自動的にダウンロード&インストールが実施されます。

pearについての詳細はこちらを参照下さい。

材料が準備できたら、送信プログラムの説明です。

rsspingとは、ブログ検索などを提供するwebサイトが用意するPINGサーバと呼ばれる受付サーバに「自分のサイトの情報が更新されたのでデータを拾いに来てください!」とお願いするためのものです。

通常のwebサイトロボット(googlebotなど)が周期的に巡回してきて、検索インデックスに登録されていきますが、ブログなどの更新頻度の高いものは検索エンジンに通知して「早く来て~」と能動的に伝える必要があります。

rsspingを使うとブログ以外のサイトでも自分のページ情報をブログデータと同様に扱うことが出来てしまうため、検索サイト側で様々な規制を行っているようです。

Yahoo!ブログ検索の検索結果に表示されるには

Googleブログ検索の更新通知APIについて 

ping送信はxmlデータをpostで送る方式が一般的です。送信には下記の情報が必要になります。

RPCエンドポイント(rssping先のURL):(例)http://api.my.yahoo.co.jp/RPC2

メソッド名:weblogUpdates.ping(ほとんどこれでOKのようです)

自分のサイト名:(例)ガイドミー

サイトのURL:(例) http://guideme.jp/searchnews.php

送信後、pingサーバから以下のようなメッセージが返ってきたら、ひとまずリクエストが受け付けられたことになります。

<methodResponse>
<params>
<param>
<value><struct>
<member><name>flerror</name>
<value><boolean>0</boolean></value>
</member>
<member><name>message</name>
<value><string>Thanks for the ping</string></value>
</member>
</struct></value>
</param>
</params>
</methodResponse>

flerrorのレスポンスが1の場合、送信データに何かしらの問題があることになります。

以下、簡単なサンプルプログラムを紹介します。

【コマンドラインからのrssping送信サンプル】

下記の例ではプログラムはEUC-JPで書かれています。


#!/usr/local/bin/php -q
<?php
require_once(“Net/URL.php”);
require_once(“XML/RPC.php”);
{
        $servers = array(
1 => array(“url”=>”http://api.my.yahoo.co.jp/RPC2”,             “method”=>”weblogUpdates.ping”),
2 => array(“url”=>”http://blogsearch.google.co.jp/ping/RPC2”,   “method”=>”weblogUpdates.extendedPing”),
3 => array(“url”=>”http://rpc.technorati.jp/rpc/ping”,          “method”=>”weblogUpdates.ping”),
);
        $targets = array(
“1”     => array(
                        “name”=>”ガイドミー:トレンドチェック”,
                        “url” =>”http://guideme.jp/searchnews.php”,
                        “rssurl”=>”http://feed.guideme.jp/rss/top20.xml”,
                        ),
“2”     => array(
                        “name”=>”ガイドミー:トレンドニュース”,
                        “url” =>”http://guideme.jp/kwdnews.php”,
                        “rssurl”=>”http://feed.guideme.jp/rss/kwdnews.xml”,
                        ),
);
    

      $TIMEOUT = 3;     

   foreach($servers as $key=>$val){
                $server_url = $val[url];
                $method     = $val[method];

                $url = new Net_URL($server_url);
                print $server_url.”\n”;
                foreach($targets as $k=>$v){
                        print $v[url].”\n”;
                        $msg = new XML_RPC_Message(
                                $method,
                                array(
                                        new XML_RPC_Value(mb_convert_encoding($v[name], “UTF-8”, “EUC-JP”)),
                                        new XML_RPC_Value($v[url])
                                )
                        );
                        if ($method == “weblogUpdates.extendedPing”){
                                $msg = new XML_RPC_Message(
                                        $method,
                                        array(
                                                new XML_RPC_Value(mb_convert_encoding($v[name], “UTF-8”, “EUC-JP”)),
                                                new XML_RPC_Value($v[url]),
                                                new XML_RPC_Value($v[url]),
                                                new XML_RPC_Value($v[rssurl])
                                        )
                                );
                        }
                        $cli = new XML_RPC_Client($url->path, $url->host);
                        //$cli->setDebug(1);
                        $resp = $cli->send($msg, $TIMEOUT);
                        print $resp->serialize();
                }
        }
}?>