読者です 読者をやめる 読者になる 読者になる

bombtterをインスパイアしまくったzerotterを作った

twitter perl

某ゼロっぽいbombtterクローンであるところのzerotterを作ってみました.tetsuwo_botのインスパイアでもあります.友達と話していて思いついたのでとりあえず書いてみた感じです.

bombtterがすごくがんばってくれているおかげで,クローンを作るのは異常に簡単でした.完成したのが以下のスクリプトでcronでまわしています.

use strict;
use warnings;
use utf8;
use Net::Twitter;
use XML::Feed;
use URI::Fetch;
use URI;
use DateTime;

my $SERIF = [
    ["このゼロが命じる… ", "を爆破せよ!"],
    ["全力で",              "を爆破せよ!"],
    ["今ここに",            "の爆発を宣言する!"],
    ["そうだな… ",         "は…… 爆発しろっ!"],
];

# 最後に更新した時刻を調べるのにファイルを使う ( 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のRSSを拝借する
my $rss_url = URI->new('http://twitter.com/statuses/user_timeline/14152694.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 $twitter
    = Net::Twitter->new(username=>'zerotter', password=>'PASSWORD');

for my $entry ($feed->entries) {
    # 爆発させる対象を取得
    my $entry_content = $entry->content->body;
    $entry_content =~ s/^bombtter:\s+//xms;
    $entry_content =~ s/\s*が爆発しました。\s*$//xms;
    my $bombee = $entry_content;

    # セリフをランダムで作る
    my $serif = $SERIF->[rand() * scalar(@$SERIF)];

    # まだ発言していなければ発言
    if(DateTime->compare($entry->issued, $mtime_dt) == 1) {
        $twitter->update( $serif->[0] . $bombee . $serif->[1] );
        sleep 1;
    }
    else {
        last;
    }
}

$SERIFを適当にいじると,簡単にセリフを足したり変えたりできます.bombtterクローンを作るのはbombtterのおかげで非常に簡単なので,習作にどうでしょうか.あと,追加のゼロのセリフも募集しています.

てか,そろそろもうちょっとまじめなプログラムをかかないとなぁ.