bombtterで爆発させた犯人を推理する迷探偵botを改修した
@meitantei_botを約1年ぶりに改修した。
仕様
以上のことをcronで10分おきに回してます。
ソース
#!/usr/bin/perl # ---------------------------------------------------------------------- use strict; use warnings; use utf8; use XML::Feed; use URI::Fetch; use URI; use Jcode; use DateTime; use Net::Twitter; # twitter アカウント my $username = 'username'; my $password = 'password'; # 最後に更新した時刻を調べるのにファイルを使う ( via Plagger::Rule::Fresh ) my $FRESH_PATH = "./update_time"; my $now = time; my $mtime = (stat($FRESH_PATH))[9]; if ($mtime) { utime $now, $now, $FRESH_PATH or die("$FRESH_PATH: $!"); } else { open my $fh, ">", $FRESH_PATH or die("$FRESH_PATH: $!"); close $fh; $mtime = (stat($FRESH_PATH))[9]; } my $mtime_dt = DateTime->from_epoch( epoch => $mtime ); # bombtter_rawのRSSを拝借する my $rss_url = URI->new('http://twitter.com/statuses/user_timeline/16804530.rss'); my $res = URI::Fetch->fetch($rss_url) or die URI::Fetch->errstr; my $rss_content = $res->content; my $feed = XML::Feed->parse(\$rss_content) or die XML::Feed->errstr; # twitter の準備 my $twit = Net::Twitter->new(username => $username, password => $password); for my $entry ($feed->entries) { if(DateTime->compare($entry->issued, $mtime_dt) == 1) { my $entry_content = $entry->content->body; $entry_content =~ s/^bombtter_raw:\s+//xms; # 爆発したかの判定 if($entry_content =~ /^1,/) { # 犯人の抽出 my $st = index( $entry_content, '|' ); my $ed = rindex( $entry_content, '/' ); $st++; my $of_name = substr( $entry_content, $st, $ed-$st ); # 爆発対象の抽出 $st = rindex( $entry_content, '|' ); my $bomb = substr( $entry_content, $st+1 ); my $status = sprintf("%sを爆発させた犯人は %s です。\n", $bomb, $of_name); $twit->update( $status ); sleep 5; printf("%s %s\n",$entry->issued, $mtime_dt); printf("$status\n"); } } else { last; } } sub url_encode($) { my $str = shift; $str = Encode::encode('utf8',$str); $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; $str = Encode::decode('utf8',$str); return $str; }
まとめ
bombtter_rawを元にしてるので的中率は100%だと思う(bombtter_rawのフォーマットが変わらなければ
何の捻りもないただの文字列整形botになってしまったような…。
あと、犯人に@をつけないようにした。
@をつけるとreplyになってウザがられるかもしれないので。