式波botを作る

普段はほとんどPHPしか使わないのでperlの勉強も兼ねてtwitterbotを作りました。
題材はユーロ空軍のエース、式波・アスカ・ラングレー大尉です。
http://twitter.com/asuka_jp

機能概要

1.基本的に何を言われてもバカにする

2.質問されても答えない

3.謝ったら怒る

4.ちょっとデレる

5.たまに関連情報をつぶやく

6.自動でフォローする

技術的なところ

1の機能については自分宛の発言を拾って、その発言のMD5をとってゴニョゴニョしてます。
発言パターンはいくつか用意しています。
2〜4の機能については正規表現で判定してセリフを出し分けてるだけです。
このあたりのコードは発言内容がバレるので公開しません、その程度のものです。。。
5の機能は公式のRSSを取得しています。
劇場版公開後なのであまり更新されませんが。
コードは以下のようになっています。
Net::Twitterを使っているので発言部分は他の機能と同じです。

#!/usr/bin/perl

use strict;
use Net::Twitter;
use LWP::Simple;
use XML::RSS;
use Encode;
use utf8;
use File::stat;
use HTTP::Date;
use Digest::MD5;
use Data::Dumper;

use constant BASE_DIR => 'PATH';

my $twit = Net::Twitter->new(username => 'USERNAME', 
                             password => 'PASSWORD'
                         );

my @items = &get_info();
if($#items+1 > 0) {
    foreach my $item (@items) {
        my $post = 'エヴァ関連情報: ';
        $post .= $item->{title} . ' ' . $item->{link};
        my $res = $twit->update($post);
    }
}

sub get_info {
     my $url = 'http://extr.b-ch.com/eva_news/rss/index.rdf';
     my $cache = BASE_DIR . '/cache/' . Digest::MD5::md5_hex($url);
     my $lastmod = -e $cache ? stat($cache)->mtime : 0;
     my $status = LWP::Simple::mirror($url, $cache);
     my @items;

     if(is_error($status)) {
         die ("rss not found...\n");
     }elsif(is_success($status) && $status != RC_NOT_MODIFIED) {
         my $rss = XML::RSS->new;
         $rss->parsefile($cache);

         foreach my $item (@{$rss->{items}}) {
             my $time = HTTP::Date::str2time($item->{dc}->{date});
             if($time > $lastmod) {
                 push(@items, $item);
             }else {
                 next;
             }
         }    
     }
     return @items;
}

6の機能は以下のようにして実装しました。
friendsに存在せずfollowersに存在するidをフォローしています。

sub auto_follow {
    my $friends = $twit->friends;
    my $followers = $twit->followers;

    if(defined($friends) && defined($followers)) {
        my @friend_list;
        my @follower_list; 

        foreach my $friend (@{$friends}) {
            push(@friend_list, $friend->{id});
        }
        foreach my $follower (@{$followers}) {
            push(@follower_list, $follower->{id});
        }

        my $lc = List::Compare->new(\@friend_list, \@follower_list);
        foreach my $id ($lc->get_Ronly) {
            $twit->create_friend($id);
        }
    }
}

細かいところは後でまとめたいと思います。

(追記) たまにundefが返ってくるようなのでautofollowを修正
(追記) 関連情報の要素数カウントが間違っていたので修正