Yahoo!ブログ検索に WordPress 更新を通知するスクリプト Ping to Y!J-BSC

2009年7月9日

Yahoo! ブログ検索になぜか引っかからない我がサイト。

どうやら WordPress で構築されたブログと Yahoo! ブログ検索はいまいち相性が良くないようです。

検索してみると四苦八苦されている方がたくさんいらっしゃって、その中で特に参考になりそうなのが 【まとめ】WordPress を Yahoo! ブログ検索させる方法 その10:トイレのうず/ぼやき というエントリ。

Yahoo! 側の説明にある更新通知先に素直に Ping 送ってもだめなよう ((それでもYahoo!ブログ検索にインデックスされない・・・という方へ | Kuwata’s Blog くわぶろが参考になりました))。

実際には http://api.my.yahoo.co.jp/rss/ping?u=最新記事のURL という形式じゃないとクローラが来てくれないということです。

さて、じゃあ、どうやって更新後にこの URL を叩いてやるか? 手動でやるのはばからしいので、以前 はてなアンテナに WordPress の更新を即通知する | MOMENTS で作成したスクリプトを流用してチェック時に sitemap.xml のタイムスタンプが5分以内だったら該当URLにアクセスしてやればいいやという形で解決。

ヘッダに RSS1.0 のリンクも埋め込んで、スクリプトもとりあえず動いてはいるのですが、実際に検索結果が出るまでは成功したかどうかが分からないのが辛いところですね。しばらくしたら検索してみようっと。

使用した Perl スクリプトは続きを読むの後に。

ping2yj-bsc.pl

Google (XML) Sitemaps Generator for WordPress で生成した sitemap.xml を適当に読み込んで最新記事のURLを決め打ちしています。生成するプラグインのバージョンやパーマリンクの構成によってはうまく動かない可能性があります。

#!/usr/bin/perl
use strict;
use Readonly;
use LWP::Simple;

Readonly::Scalar my $SITEMAP => './sitemap.xml'; #sitemal.xmlへのパスを適宜編集
Readonly::Scalar my $LOG     => './accessresult.txt';

open my $FH,'<',$SITEMAP;
my @URL;
my $count;
while(<$FH>){
  my $line = $_;
  if($line=~/<loc>(.*)<\/loc>/) {
    push @URL,$1;
    last if ($count++ > 5); #URLを適当数拾ったらループを抜ける
  }
}
close($FH);
#最新記事のパーマリンクは配列の2番目に格納されている(1番目はブログトップのURL)
my $URL = "http://api.my.yahoo.co.jp/rss/ping?u=".$URL[1];

my $result = get($URL);
die "Couldn't get it!" unless defined $result;
open my $OUT,'>',$LOG; #スクリプトのアクセス結果を accessresult.txt として同じ場所に保存しておきます
print $OUT $result;
close($OUT);
exit;

sitemap.xml のタイムスタンプ比較は別のスクリプトで行っていて、私の場合は、現在の時刻から5分以内に更新された場合はこのスクリプトを実行するようにしています。

このスクリプト単体で処理する場合は、タイムスタンプのチェックの処理を組み込めば動くと思います。あとは cron に登録して適当な間隔で実行すれば OK ですね。

実行結果は

Refresh requested: https://www.u-1.net/2009/07/08/1852/

Blog Search: Successfully refresh requested
My Yahoo! RSS reader: Refresh requested.
About "Blog Search", see "http://blog-search.yahoo.co.jp/"

となっているので、通知はちゃんとしてますね。クローラもすぐに来てるのでこれでだめなら別の原因かなあ。

登録されないのはなぜ!?

んー、クローラも来てるし、ちゃんと RSS1.0 の情報へリダイレクトさせてそれを読んでるはずなのに反映されませんねえ。しばらく様子見で行くしかないかな。