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