更新Pingを発行できるように修正する

先日、このブログがGoogleのブログ検索で引っかからないとぼやいたところ、藤野 氏より「いや、更新pingが打てないのはブログじゃないよね」的なごく当たり前の指摘を受けたので対応してみた。

このブログについて

このブログ自体はChalowというツールを使って作ってるのだけど、今までの経験からコメントとかトラックバックなんかのかっこ良さげな機能は使われないと判断して削っておりました。
※ どうせコメントとかもないし

ただ、確かに更新Pingくらい打てないとGoogleなんかで記事が検索できるようになるまで半日かかるとか泣けてくる自体に。

で調べたところ、Chalowの製作者のブログにこんな発言が。

基本的に chalow は「HTMLコンバータ」。変換と公開を同時にやってる人っ  
て意外と多いのかもしれないけど、変換と公開のタイミングがいっしょで  
あることは仮定してません。私は別タイミングだし[2004-05-17-5]。  
まあ、ともかく私としては、chalow本体でPING打つってのもなあ、と思う  
ので放置です。
[Weblogツール三種の神器](http://chalow.net/2004-08-10-4.html)  

<<

このブログもDropboxにアップされたChangelogを定期的に取得して生成しているので「生成のタイミング != 記事が新規登録されたタイミング」になってしまいChalow本体にPing送信機能を突っ込むと無駄打ち空打ちが続いてしまうわけです。

基本方針

前項のような理由から、以下のような方針
・更新Pingを空撃ち無駄打ちしない
Chalow自体の機能として実装しない

さて、どうしたものかと考えたところ、RSSのバックアップを取っておいて新しく吐き出したRSSとDiffが違ってたら更新Pingを送るようなスクリプトを書けばいいんじゃなかろうかという結論に相成りました。

下準備

Chalowの吐き出すRSSについて

で、そういう事が可能なのかと下調べのために吐き出しているRSSを眺めたところ、RSS自体の更新日が毎回生成した日時になっていたので最新記事の更新日に変更。  
そうしないと、生成するたびにRSSの内容が変わってしまうから

類似例について

と言ってもちょっと調べると類似例が大量に出てきたので、それを参考に。  
[cl.pocari.org - Google Blog Search に ping を送る Perl スクリプト](http://cl.pocari.org/2006-10-10-2.html)

XMLRPC::Liteのインストールについて

っとその前にXMLRPC::Liteをインストールしようとして散々っぱら怒られたのでそれは別記  
[2011-07-12-1]

試しにPingserverを準備した

本当に送られているかどうか分からないので、とりあえずPHPで参考までに準備してみた。  
※ と言っても、サンプル置いてパーミッションを出しただけ  
[2011-07-12-3]

作った

使い方。blog_tmpは、ChalowでHTMLを吐き出しているディレクト
$ /path/to/publishPing.pl /path/to/chalow/blog_tmp/index.rdf

|perl|
#!/usr/local/bin/perl

use strict;  
use warnings;  
use XMLRPC::Lite;  
use File::Compare;  
use File::Copy;  
use Error qw(:try);

my $file = shift(@ARGV);

## 更新通知用のサイト情報  
my @parameters = (  
  'そうだ車輪と名付けよう 3rd',  
  'http://www.atyks.org/blog/',  
  'http://www.atyks.org/blog/',  
  'http://www.atyks.org/blog/index.rdf'  
);

## 更新Ping送信用URL(複数)  
my %endpoints = (  
  "google"                => {"method" => "weblogUpdates.extendedPing", "url" => 'http://blogsearch.googlh.co.jp/ping/RPC2' } ,  
  "test"                  => {"method" => "weblogUpdates.ping",         "url" => 'pingserver-url'} ,  
);

## 更新の有無を判断するためのRSSのパスとバックアップファイル用のSuffix

my $sfx = "_bak";

if( compare($file , $file . $sfx) ) {  
  ## 前回の実行時からRSSの内容が変更されていれば登録されたPingサーバに更新通知を行う  
  foreach my $title ( sort keys %endpoints)  {  
    my $endpoint = $endpoints{$title};  
    my $result;

    try {  
      $result = XMLRPC::Lite  
        -> proxy($endpoint->{"url"})  
        -> call($endpoint->{"method"}, @parameters)  
        -> result;

    }  
    catch Error with {  
      $result = {"message" => "", "flerror" => 1};  
    };

    if( $result ){  
      print qq/success $title $result->{message} stat:$result->{flerror}\n/  
    }  
    else{  
      print qq/failed $title $result->{message} stat:$result->{flerror}\n/  
    }

  }

}  
else {  
  ## no Diff, no Action  
}

## 最後にRSSを更新する。これで2度打ちを防ぐ  
copy($file , $file . $sfx);

exit;

||<

結論

あれ?動いていると思うんだけど、なんかリアルタイムに収集されているような気がしないな。
なんか勘違いしているかも
だめじゃん

追記 at 2011/07/21

無事、Googleのブログ検索の対象になった様子、更新した後に時間を開けずに検索対象になった。

おそらく要因は以下の二つ
・この時期で作成した更新PingGoogleに送るようにしたこと
Googleのブログ検索にここ登録したこと
※ 主に2点目を忘れていたのがネックだったような気がする