ブログブームもすっかり下火となり、今更という感じではあるのですが、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を使うとブログ以外のサイトでも自分のページ情報をブログデータと同様に扱うことが出来てしまうため、検索サイト側で様々な規制を行っているようです。
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();
}
}
}?>