bombtterで爆発させた犯人を推理する迷探偵botを改修した

@meitantei_botを約1年ぶりに改修した。

仕様

  1. bombtter_rawのRSSを取得
  2. bombtter_rawの発言から爆発したかどうか判定
  3. 爆発していたら犯人と爆発対象物を抽出
  4. 抽出したらtwitterにpost

以上のことを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になってウザがられるかもしれないので。