Blog記事の更新をサーチエンジンなどに通知するXML RPCをPHPで実装する方法を紹介します。
まず、weblogUpdates.pingの仕様。
http://www.xmlrpc.com/weblogsCom
weblogUpdates.ping (weblogname, weblogurl, changesurl=weblogurl, categoryname="none") returns struct
ちなみに、weblogUpdates.extendedPingというpingより多くの必須パラメータがあるインターフェイスも存在する。
pingで事足りるのでpingだけを実装。
http://weblogs.com/api.html#5
PHPでXML-RPCを扱うためには、PEARのXML_RPC2を使うのが便利。APIの設計は綺麗で使いやすい。
以下にコード書いておきます。
<?php require_once('XML/RPC2/Client.php'); $blog_title = 'おれのブログ'; $blog_url = 'https://matsu.teraren.com/'; $url_array = array( 'http://www.google.com/webmasters/tools/ping' ,'http://search.yahooapis.com/SiteExplorerService/V1/ping' ,'http://www.bing.com/webmaster/ping.aspx' ,'http://submissions.ask.com/ping' ); $options = array( 'prefix' => 'weblogUpdates.' ); $call_option = array( $blog_title , $blog_url ); foreach($url_array as $url){ try{ $client = XML_RPC2_Client::create($url, $options); $result = $client->remoteCall___('ping', $call_option); if($result['flerror']){ // goo returns error but message says success. if(strpos($result['message'], 'Thanks for the ping.') === false){ throw new UnexpectedValueException($result['message']); } } }catch(UnexpectedValueException $e){ trigger_error($url."\n\n".print_r($e, true), E_USER_NOTICE); }catch(XML_RPC2_Exception $e){ trigger_error($url."\n\n".print_r($e, true), E_USER_NOTICE); } }
注意
- pingサーバは使えなくなる場合が多いので、例外はしっかりハンドリングしておく。半年前の厳選20サーバ中、半分以上が存在していない状態でした。
- レスポンスのフォーマットが仕様通りじゃない
- ブログタイトルにマルチバイトを含むときはUTF-8に変換して送る処理を入れてね。または、UTF8で書く。
Comments