Blogger更新時にPing送信する方法は?

かなり昔からこのBlogger使ってブログを書いてるわけだが、国内のアメブロやlivedoorブログなどと比べても、どうも機能が今ひとつ。物足りない。



Bloggerを運営してるのはご存知Google社。
「どうした、Google?」というのが正直な感想。

Google MapやGmail、Google Earth、さらにAndroid携帯など、革新的なサービス(ソフトウェア)をバンバン世に送り出しているのだが、このBloggerを見ているとどうやらGoogleというのは、技術的な先進性はあっても、ユーザ重視のいわゆる「サービス」を発展/改善させるのは苦手な様子。

仕事で多少Googleとも絡みもあるが、やはり「ユーザサポート」的な部分はGoogleの弱みの1つではある。

・・で、通常の国内ブログでは当たり前に付いている機能「Ping送信」。
これは、意外と知られていない機能だが、ブログを更新した際に様々なサイトに送られる信号。この信号を受け取ったサイト(Pingサーバ)は、これを合図にそのブログのフィードを取得し、ブログ情報を最新のものへと更新する。

RSSリーダーなどに仮にブログが登録されていれば、常に最新情報が表示されることになるので、ブログのアクセスアップには欠かせない機能なのだ。

しかし・・・なんとなんと、Bloggerにはこの大事な機能が付いていない。
ほんまにいけてない。。。

正確に言えば、1サイトだけPing送信される。
Bloggerの[設定]-[基本]の中に「ブログの検索を検索エンジンに許可しますか?」という項目がある。説明文にも書いてあるが、これを「はい」に設定することで、「Weblogs.com」というサイトにのみPing送信される。



しかし、この「Weblogs.com」、海外サイトなので、国内サイトには基本通知されない。
この辺がほんとユーザに不親切。

ちなみに、「FeedBurner」というフィード情報を管理するサイトがあり、GoogleがFeedBurnerを買収したことあって、Bloggerではこのサイトを使ってフィードを作成することを推奨してるわけだが、ここに登録して下図の[集客支援]-[Pingショット]を設定することで、ブログが誰かのRSSリーダーに登録されている場合、しっかりとFeedBurnerが更新情報を通知してくれるようになる。


しかし、所詮は「Weblogs.com」と「FeedBurner」2つだけ。しかも「FeedBurner」はあくまでフィード登録した人へ通知してくれるだけ。国内ブログ検索サイトへの通知が無いと、このブログ検索サイトから、更新された(最新の)ブログを検索してくるユーザのアクセスが見込めない。

そこで、自分でPing送信する方法を考えてみる。

まぁ、えらそうなことを言っても、一番下の【参考サイト】に記載した「GoogleのBloggerで自動で更新ping~」のブログ記事を参考にさせてもらったんだけどね。
(大変助かりました。ありがとうございます!!)

この参考ブログにも書いてあるが、前提条件がある。
しかも結構ハードル高め。
まず「Unix環境のサーバ」があること。この時点でかなりハードルが高くなる。
また、perl言語がある程度わかること、CRON設定の意味がわかること。
この2つでハードルは異様に高くなり、おそらく普通の人ではこの時点でアウト(笑)
全くわからないという方は、大変申し訳無いがあまり参考にはならないと思う。

しかし、とりあえず方法だけは記載する。

私は個人的に色々実験する用のサーバを借りてて、そのサーバを使った。
ちなみにここ「VALUE DOMAIN.COM」。
SSHでもアクセスできるし、FTPでもアクセスできる。
そしてシェルやPGも動かせるし、CRON設定も出来る。

なので、この環境使って実験してみた。

まず参考ブログでダウンロードできるPGを少し修正したのが下記。

#!/usr/bin/perl

use XMLRPC::Lite;

my $logfile = “log/yourlog.log”;

my @pingservers = (
‘http://ping.feedburner.com’,
‘http://pingoo.jp/ping/’,
‘http://api.my.yahoo.co.jp/rss/ping?u=’.”http://”.$ARGV[1],
‘http://rpc.reader.livedoor.com/ping’,
‘http://ping.fc2.com’,
‘http://ping.rss.drecom.jp/’,
);
my $blogurl = “http://”.$ARGV[0];

my $waittime_first = 15;
my $waittime_other = 3;

@param = (“weblogUpdates”, $blogurl, $blogurl);
weblogUpdates->send_pings(@param);
exit();

package weblogUpdates;
use POSIX qw(strftime);

sub result {
$result->{message} = “network error”;
$result->{flerror} = -1;
return $result;
}

sub send_pings {
my $wait = $waittime_first;
shift(@_);
my $blogname = $_[0];
open(FD, “>>$logfile”);
flock(FD, LOCK_EX);
print FD $now_string, ” ping from $blogname start(“,join(“:”,@_),”)\n”;
print $now_string, ” ping from $blogname start(“,join(“:”,@_),”)\n”;
my $succ = 0;
my $total = 0;
$now_string = strftime “%a %b %e %H:%M:%S %Y”, localtime;
foreach $p (@pingservers) {
my $result = XMLRPC::Lite
-> on_fault( sub { return “weblogUpdates”; } )
-> proxy($p)
-> call(‘weblogUpdates.ping’, @_)
-> result;
print FD $now_string, ” : “,$p,” res=”,qq/$result->{message}($result->{flerror})\n/;
print $now_string, ” : “,$p,” res=”,qq/$result->{message}($result->{flerror})\n/;
$succ++ if ($result != undef && $result->{flerror} == 0);
$total++;
sleep($wait);
$wait = $waittime_other;
}
close FD;
print “ping status = $succ/$total\n”;
}

このPG1の仕様は参考ブログを見て欲しい(どれだけ手抜きしてんでしょ、俺(笑))
元のPGから、ブログURLとフィードURLを、第1パラメータ、第2パラメータで受け取るよう改造してある(URLは”http://”無しで指定)。
それと、少しPING送信先も足してある。

また、このPG1は下記のPG2から呼ばれる構造にしている。

#!/usr/bin/perl

use strict;
use LWP::Simple;
use XML::Parser;
use Date::Simple;

my @els;
my $els_count = 0;
my $hit_sw = 0;

my $blog_url = ‘http://’. ARGV[0];
my $feed_url = ‘http://’. ARGV[1];

#========================================
my $document = LWP::Simple::get($feed_url)
or die “cannot get content from $feed_url”;

my $parser = XML::Parser -> new (
Handlers => {
Start => \&sh,
Char => \&ch,
Final => \&fh,
}
);
$parser -> parse($document);
#========================================

sub sh {
my ($expat, $el, %attrs) = @_;

# “published”エレメントであればSwitch=”on”
if ($el eq ‘published’) {
$hit_sw = 1;
}
}

#========================================
sub ch {
my ($expat, $str) = @_;

# Switch=”on”ならば、文字属性(publishedの中身)を抜き出す
if ($hit_sw) {
$els[$els_count] = $str;
$els_count++;
$hit_sw = 0;
}
}
#========================================

sub fh {
my ($expat) = @_;
my @sorted_els;
my $published_day;
my $today;
my $diff;

# 時間ソートして最新日付を取得
@sorted_els = sort {$b <=> $a} @els;
$published_day = Date::Simple->new(substr($sorted_els[0], 0,10));
$today = Date::Simple->new();

# 1日以内であればping送信
$diff = $today – $published_day;

if ($diff <= 1) {
`perl XXXX.pl $blog_url $feed_url`;
}
}

こっちのPG2も第1と第2パラメータは一緒。
XML::Parserを使って、Atomフィードを受け取り、XMLを解析して、編集日(更新日ではない)を当日日付と比較して、1日以内であればPG1を実行するようにしている。
(よって、RSS1.0やRSS2.0フィードで動くかどうかは検証していない)

なお、一行目の”#!/usr/bin/perl”は自分の環境に合わせて変えること。
“XXXX.pl”も同様。最初のPG保存時に自分が付けた名前に変更すればよい。
また、「LWP::Simple」「XML::Parser」「XMLRPC::Lite」モジュールはインストール済の前提。

一応動作検証済。
1つ、Yahooサーバのみエラーとなってる。ping使えないのかな??ブラウザでURLアクセスすると成功するので。この辺り今後直していく予定。
で、CRONは、PG2が1日1回起動するよう設定。
他は、今のところ正常に稼動している。

正直こんな面倒なことせずに、Blogger自身に機能実装を期待したいのだが、今のところその兆しは無し。なので、せっかく書いてるブログが人に知られないのも若干寂しいと以前から思っていたので、今回設定してみた。

Blogger使ってて、同じように感じてる人は結構多いと思う。
多少条件が厳しいが、環境揃ってる人であれば、参考にしてもらえれば幸いである。

【参考サイト】
更新 Ping を打とう
GoogleのBloggerで自動で更新pingを送信する方法

今のところ「Blogger更新時にPing送信する方法は?」にコメントは無し

コメントを残す