[Akiary/Weblog Like Style With Akiary]
XML-RPC§更新Pingの送信

isnot.jp/wiki [Permalink] [編集] [差分]

最終更新:2007-01-22 14:11:38

更新Pingの送信

更新Pingとは、ブログ(Weblog)などを更新したときに、公開されているPingサーバーに対してそのことを通知することをいいます。Pingサーバーはたくさん送られてくる更新Pingを元に、更新情報を時間順並べて公開したり、収集したデータ(メタデータ)を再配信したりします。メッセージはXML-PRCで、「weblogUpdates.ping」というAPIで決められた形式で送ります。一部の公開Pingサーバーでは、weblogUpdates.pingを拡張した(追加のパラメータを付加した)メッセージを受け付けるようです。

更新Pingというほかにも、「Update Ping」などといわれることもあるようです。

※トラックバック(Trackback Ping)と混同されることがあります。技術的には異なるものです。

examples.

各パラメータ詳細

仕様

It takes two required parameters, both strings, and two optional parameters, also strings.

The first is the name of the weblog, the second is its URL.

The third, changesurl, is the url of a page to be checked for changes.

The fourth, categoryname, is the name of a category of pings, allowing the weblogs.com interface to be used to track RSS feeds, European weblogs, or whatever.

Weblogs.Com XML-RPC interfaceより)

Optional Parameters (non-optional when using the extended ping interface):

# the url of the page to be checked for changes

# the name of the category of pings OR the URL of an RSS, RDF, or Atom feed (when using the extended ping interface)

Weblogs.com: API Interfaceより)

抄訳

2つの必須パラメータ(ともに文字列)と、2つの任意のパラメータ(こちらも、ともに文字列)がある。はじめのひとつはweblog(サイト)の名前で、2番目はそのURLである。3番目の「changesurl」とは、更新をチェックするするためのページを示すURLである。4番目の「categoryname」とは、通知先のカテゴリー名である。(〜あとは省略。)

補足説明

一番基本的な2パラメータの例で考えると、“サイトが更新された”ことだけを通知するようになっていて、具体的にどのコンテンツが追加(あるいは修正、削除)されたのかは示していません。収集する側が必要に応じてHTMLやRSSを別に取得して解析するなどはよく行われますが、それは更新Pingの仕様に含まれない独自の(個別の)機能ということになります。

「changesurl」について。2番目のパラメータで与えるURLは、例えば「アンテナ」のようなリンクリストを生成するとして、そこからユーザーが訪れることになるURLです。しかしそのURLが実はそれはフレーム分割を定義するだけのページ(更新によって変化しない)であるとか、年齢の確認と同意を促すページであったりとか、必ずスプラシュページを見せたいだとか、いろいろな事情がありえます。そのためにあるのが、changesurlで、実質的に更新されたコンテンツを取得できるURLを指定します。(フレームの中のページであるとか。)

さて「categoryname」はどうか。通知した情報を収集した側が作るリンクリストは、単純に最新のものから時系列逆順に100件だけ並べものかもしれません。あるいは掲載するサイトの数が多い場合は、カテゴリー別に分けているかもしれません。そういったときは4番目のパラメータを見て分類することが考えられます。

「weblogUpdates.extendedPing」というRPC名を使う場合には、3番目4番目のパラメータも必須となります。

拡張インターフェイスにおいては、4番目のパラメータとしてRSS(もしくはAtom feed)のURIを送ることができます。(Example Extended Ping XML-RPC Request

※2005年4月にWeblogs.Comは、blo.gsの拡張インターフェイスに似たRSS付きのPingに対応しました。(Weblogs.Com support for RSS pinging_

個人的見解

changesurlの(過激なときはweblogurlさえも)パラメータを拡大解釈して、更新したときに個別の記事URL(Permalink)ごとにPingを送るといった考えがあります。しかしながらそれはweblogUpdates.pingの仕様を逸脱しているのもだと私は考えます。それをするためには別のRPC名を定義するべきでしょう。(上のexamples.ではそういった派生仕様も挙げています。)

これは例えば、一度に3つの記事を追加したとしても3回通知するのは冗長であり、1回で足りるという考え方に基づいています。更新を知ったユーザーは、いつもの巡回先であれば前回から追加された部分(その人にとっての未読部分……昨日の更新は見逃していたかもしれない。)はひと目で見抜けるでしょうし、初めてのサイトなら(気に入ればですが)1つといわず次々と記事を読むことでしょう。逆に同じサイトの更新を3回チェックするハメになって無駄な労力を使ったと感じることもあるかもしれない。通知された側(収集する側)で更新の詳細内容を知りたければ、RSSなりを(1回だけ)取得したうえでデータベースをアップデートすればいいというのが本来の仕様意図でしょう。

この仕様が定義されたときに一番使われていた方法は、「BLOGROLL」と呼ばれる、「お気に入りサイトのリストを更新順に並べ替えたもの」を提供するサービスでした。これには記事のタイトルは必要ありませんでした。

その後にいわゆる「ブログ検索」のサービスが台頭して来ましたが、そちらでは多少事情が違ったようです。更新通知はあくまでもクローリングのトリガーでしかなくて、実際に欲しいのは具体的な更新されたコンテンツと、そのPermalinkです。

歴史的経緯

日本国内ではMovable Typeが広く紹介されるようになるにつれて、利用が広がりました。当初は「weblogUpdates.ping」「Update Ping」「更新のときのPing」とか呼び方もいろいろありましたが、そのうちに更新Pingがという言い方が受け入れられるようになったようです。

更新Pingなどといっても、その存在をほとんど意識することなくブログを書いている人々がほとんどではないでしょうか。一方でサービスを作る、提供する側にとっては今でも意義あるものと思います。Webサービスを提供する側の連携が広く行われた事例として画期的であったと思います。

RSSの配信とともに、単純なWebの「次の技術」が利用される先例になったのではないでしょうか。

参考コード

以下に参考のためにコードの断片を載せておきます。(もとはPerl5.6で使ってました。)Pingに限らず、PerlでXML-RPCクライアントを実装する参考になるかなと思います。ご利用はご自由に。updatesping_examplecode.pl

 #!/usr/bin/perl -w
 use strict;
 use Jcode;
 use XMLRPC::Lite;

XMLRPC::Liteは、SOAP::Liteモジュールをインストールすると、ついてきます。

 my $site_uri = 'http://www.example.com/user/blog/';
 my $site_name = 'my_blog_name';

サイトの情報を設定する部分。必要に応じて、クエリーや設定ファイルなどから受け取った値を当てはめます。

 # Ping Server => XML-RPC Interface URI
 my %ping_server_uri = (
     'ping.bloggers.jp' => 'http://ping.bloggers.jp/rpc/', 
     'BlogPeople' => 'http://www.blogpeople.net/servlet/weblogUpdates', 
     'Bulkfeeds' => 'http://bulkfeeds.net/rpc', 
     'cocolog' => 'http://ping.cocolog-nifty.com/xmlrpc', 
     'goo BLOG' => 'http://blog.goo.ne.jp/XMLRPC', 
     'debug' => 'local', 
 );
 
 # Select servers to send update ping
 my @ping_servers = ('ping.bloggers.jp', 'Bulkfeeds');

Pingサーバーの選択。ここではping.bloggers.jpとBulkfeedsを送信先に選んでいます。'debug'のみを選択すると、外部にPingを送信しません。ローカルエコーモードで動作します。

 my %mtime;
 my $all_results = '';
 if (&check_mtime()) {
     foreach my $ping_server_name (@ping_servers) {
         my $result = &send_ping(
             rpc       => $ping_server_uri{$ping_server_name}, 
             blog_name => Jcode::convert($site_name, 'utf8', 'euc'),
             blog_url  => $site_uri, 
         );
         $all_results .= &as_string($result);
     }
 } else {
     $all_results = "Aborted ping.";
 }
 
 print scalar localtime(time()), qq(<br />\n);
 print qq(Ping: @ping_servers<br />$all_results);

送信部分と結果の表示。送る前に、「Pingを連射」したり「空更新で通知」したりを防ぐよう、チェックしています。

以下はサブルーチン。

 sub check_mtime {
     # 30 min. check
     return undef if ((time() - $mtime{'blog'})     > 1800);
     return undef if ((time() - $mtime{'lastping'}) < 1800);
     return 1;
 }

サイト(Weblog、日記)を更新した時間、最後にPing送信した時間を、あらかじめ%mtimeに格納してあることとしています。30分を基準に。

 # &send_ping(rpc => $, blog_name => $, blog_url => $);
 sub send_ping {
     my %arg = @_;
     my $rpc_uri = $arg{rpc};
     my $blog_name = $arg{blog_name};
     my $blog_url = $arg{blog_url};
 
     if ($rpc_uri !~ /^http/) {
         return {
             flerror => 0, 
             message => 'local echo mode', 
             name => $blog_name, 
             uri  => $blog_url, 
         }
     }
 
     # send ping
     my $result = eval {
         XMLRPC::Lite
             ->proxy($rpc_uri)
             ->call(
                 'weblogUpdates.ping', 
                 $blog_name, 
                 $blog_url, 
             )
             ->result;
     };
     if ($@) {
         return $@;
     }
 
     return $result;
 }

実際に更新Pingを送る部分。ローカルエコーモードは、デバック用を兼ねています。

 sub as_string {
     my $v = shift;
     if (not ref $v) {
         return $v;
     } elsif (ref $v eq 'SCALAR') {
         return $$v;
     } elsif (ref $v eq 'ARRAY') {
         return join("<br />\n", @$v);
     } elsif (ref $v eq 'HASH') {
         my $ret = '';
         foreach (sort keys %$v) {
             $ret .= "$_ => $v->{$_}<br />\n";
         }
         return $ret;
     } else {
         return undef;
     }
 }

受け取った結果を、文字列に直す部分。

ライセンス

GPLもしくは修正Artistic Licenseにより利用が可能です。

参考

「ぶろっぐぴんぴん」は、サイトの更新時に更新PINGが送れないBlogシステムや日記システムをお使いの方のための無料のWindowsとMacのデスクトップ・アプリケーションです。一度に複数の更新PINGサーバに更新を通知することができます。この機能はログイン後、左側のメニューにある「サービス&オプション」から利用できます。

コメント

[TrackBack]weblogUpdates.ping の拡張メモ【from blog.bulknews.net

weblogUpdates.ping の第3引数に、最新記事の permalink をいれたらどうか、と思いました。現状だと、受信した Ping サーバ側が、

っていう長い道のりで最新記事の URL が取得できる。しかもどっちかが非同期になってると、それが最新という確信はないわけで。(続き…)

posted at: 2004-08-19 01:36:03

[TrackBack]Ping Server について【from BLOG 導入

(1)更新Ping 更新Pingとは、Weblogなどを更新したときに、公開され...(続き…)

posted at: 2004-09-22 16:01:52

[TrackBack]PERLでPING送信する 【from Moovle

トラックバックPINGとweblogUpdates.pingってのは、別なんですね、どうりでエラーが返ってくるはずでした(続き…)

posted at: 2004-12-20 01:03:26

[TrackBack]更新PING送信先を追加【from memo-mania

http://blog.livedoor.jp/tocky816/archives/50014764.html

posted at: 2005-10-09 01:14:06

[FrontPage]

いしだなおと it@isnot.jp