kgsの対局結果をtweetするbot(その3)
Web::Scraperを使うとものすごく簡単にhtmlから情報が拾えることがわかったので、怪しげな正規表現を使うのをやめて、書き直してみた。
Web::Scraperの使い方については下記のページが非常に役に立った。
http://e8y.net/mag/013-web-scraper/
とくに、Web::Scraperについてくる、'scraper'というコマンド*1とFireBugの組み合わせは非常に強力。
use strict; use warnings; use Web::Scraper; use LWP::Simple; use LWP::UserAgent; use URI; #kgsの対局記録ページ my $base_url='http://www.gokgs.com/gameArchives.jsp?user='; #ユーザー名 my $user = '(拾いたいユーザー名)'; #見に行くページ my $uri = URI->new($base_url.$user); #スクレーパの設定。XPathで最新対局を指定する my $scraper = scraper { process '/html/body/table/tr[2]/td[2]','white' => 'TEXT'; process '/html/body/table/tr[2]/td[3]','black' => 'TEXT'; process '/html/body/table/tr[2]/td[5]','time' => 'TEXT'; process '/html/body/table/tr[2]/td[6]','type' => 'TEXT'; process '/html/body/table/tr[2]/td[7]','status' => 'TEXT'; process '/html/body/table/tr[2]/td/a','address' => '@href'; }; #スクレーパを動かす my $result = $scraper->scrape($uri); #短縮URLを作る(140字対策) my $url = 'http://tinyurl.com/api-create.php?url='.$result->{address}; my $ua = LWP::UserAgent->new(); my $req = HTTP::Request->new('GET', $url); my $res = $ua->request($req); my $short = $res->content; #tweetを作る my $body = "KGS log bot(for test)\nW:$result->{white}-B:$result->{black}($result->{type})\nstart:$result->{time}(GMT)\nstatus:$result->{status}\n$short";
あとは、$bodyをtweetする。
私のような素人にも、こういうことができるのは、Webのおかげである。ありがたいことであるなぁ*2。