BlogSurfのRSS取得プログラムをPOEで書き直す。
BlogSurfのRSS取得プログラムをPOEを使って書き直してみた。
POEとは、
multitasking and networking framework for perl
な、もので、非同期・ノンブロックなプログラムを書くときに非常に便利なフレームワークです。
これで、LivedoorとかJugemの様に重たいサーバがあった場合のRSS取得がスムーズになるハズ。
書いたプログラムの概要はこんな感じ。
負荷対策のようなものを考えないとな。あとは。
#!/usr/bin/perl
use strict;
use POE qw(Component::Client::HTTP);
use HTTP::Request;
$|++;
POE::Component::Client::HTTP->spawn(
Agent => '***/1.10',
Alias => 'ua',
Timeout => 60
);
POE::Component::Client::HTTP->spawn( Alias => 'ua' );
sub __changes_xml{
return "http://ping.bloggers.jp/changes.xml?last=310&filter=^plaza.rakuten.co.jp";
}
sub __set_request{
my($url)=@_;
return HTTP::Request->new(GET=>$url);
}
#ping.bloggers.jpからchanges.xmlをゲット
sub _start{
my $kernel = $_[KERNEL];
$kernel->post(
"ua" => "request",
"parse_changes",
&__set_request(&__changes_xml)
);
}
sub parse_changes{
my $response=$_[ARG1]->[0];
return 0 unless $response && $response->is_success;
my $changes = $response->contentからURLリストを抜き出す
foreach my $url (@$changes){
#print "Changes : " . $url,"\n";
$_[KERNEL]->post(
"ua" => "request",
"parse_blog",
&__set_request($url)
);
}
}
sub parse_blog{
my $response=$_[ARG1]->[0];
return 0 unless $response && $response->is_success;
my $url = $response->contentからRSS AutoDiscovery
return 0 unless $url;
$_[KERNEL]->post(
"ua" => "request",
"parse_rss",
&__set_request($url)
);
}
sub parse_rss{
my $response=$_[ARG1]->[0];
return 0 unless $response && $response->is_success;
RSSを処理
}
POE::Session->create(
package_states => [ main => [ "_start","parse_changes","parse_blog","parse_rss"] ]
);
POE::Kernel->run();
exit;
参考
NDO::Weblogの記事「Shibuya.pm でデモした POE
による pingbot のソース」
CPANのPOEとPOE::Component::Client::HTTP