Home JavaScript Greasemonkey PHP

Twitter ボットの作り方 Perl 編 (5)2009-07-26


Twitter ボットの作り方解説第 5 弾。ボットに対してのつぶやきを検索して、検索結果を返信するボットを作ってみます。
以下は、第 4 弾までの状態を前提としています。

さて、当初の予定だと Google 検索を行った結果を返すボットを作ろうとしていたのですが、Google 検索 API は公開をやめてしまっているのですね。知りませんでした…。
こういう時は Yahoo の出番という事で、代わりに Yahoo 検索の結果を返すボットを作ります。
Yahoo の様々な公開 API 群は、Google の後追いで公開を始めただけあって優れたものが多いのですが、いかんせん Google の陰に隠れがちですね。

CPAN ライブラリの追加

例によって、Yahoo 検索を便利に実行するためのライブラリが CPAN に登録されているので、インストールしておきます。
$ su -
# perl -MCPAN -e shell
cpan> install Yahoo::Search

アプリケーション ID の取得

Yahoo の検索 API を使うためには、あらかじめアプリケーション ID というものを取得する必要があります。
Yahoo のアカウントを持っていれば、簡単に取得出来るので、以下のサイトからあらかじめ取得しておきます。
Yahoo! デベロッパーネットワーク

大手のウェブサービスで API を公開している場合、「API キー」とか、「デベロッパー ID」とか、呼び方はそれぞれですが、大抵はのこアプリケーション ID のようなものが用意されています。
これらの ID は、各 API が過剰に利用されていないかを監視したり、必要に応じて利用を止めたりする目的で用意されています。
とはいえ、Yahoo 検索のケースで、1日あたり 5000 回とかなので、普通の個人が利用する分には制限についてさほど気にする必要はありません。

設定ファイルの準備

今回作成するボットは、第 3 弾で作った特定ワードに返信するボットと、基本的な作りは一緒です。
設定には前述のアプリケーション ID を追加し、最後のつぶやきの管理には、sinceId を使います。

config.yml
username: "your_twitter_user_name"
password: "your_twitter_password"
appId: "your_yahoo_application_id"

status.yml
sinceId: 0

実際のスクリプト

#!/usr/bin/perl

# 使用するモジュールの読み込み
use strict;
use warnings;
use Encode;
use FindBin;
use YAML::Tiny;
use Net::Twitter;
use Yahoo::Search;

# yml ファイルの読み込みと、Twitter モジュールの初期化
my $config = (YAML::Tiny->read($FindBin::Bin . '/config.yml'))->[0];
my $status = (YAML::Tiny->read($FindBin::Bin . '/status.yml'))->[0];
my $twit = Net::Twitter->new(username => $config->{'username'}, password => $config->{'password'});

# 各種設定値の取得
my $username = $config->{'username'};
my $appId = $config->{'appId'};
my $sinceId = $status->{'sinceId'};

# Twitter 検索。to: オプションでボット宛のつぶやきすべてを取得
my $response = $twit->search({q => 'to:' . $username, since_id => $sinceId});

# Twitter 検索結果を 1 件ずつ処理
for my $result ( reverse( @{$response->{'results'}} ) ) {
    my $query = Encode::encode('utf8', $result->{'text'});
    my $fromUser = $result->{'from_user'};
    my $statusId = $result->{'id'};

    # ボット宛の @ 部分を取り除く
    $query =~ s/\s*\@${username}\s*//;

    # Yahoo 検索 (最大5件、日本語圏で検索)
    my @results = Yahoo::Search->Results(
        Doc => $query,
        AppId => $appId,
        Count => 5,
        Language => 'ja'
    );

    # Yahoo 検索結果を 1 件ずつ処理
    for my $page (@results) {
        # ボットに対するつぶやきへの返信
        my $reply = '@' . $fromUser . ' ' . $page->Title . ' ' . $page->Url;
        $twit->update({status => $reply, in_reply_to_status_id => $statusId});
    }
    $sinceId = $statusId;
}

# 最後に処理したつぶやきの ID を保存
YAML::Tiny::DumpFile($FindBin::Bin . '/status.yml', {sinceId => $sinceId});

ここまで作ってきたボットの内容を理解していれば、ほとんど自明のことしか無いかと思います。
Yahoo 検索についても、Yahoo::Search という優れたライブラリがあるので、非常にシンプルに記述出来ています。

あと書き

「Twitter ボットの作り方 Perl 編」の連載はこれで終わりになります。

連載の終盤で、RSS や外部の API を利用するボットを作成しました。
今のウェブ上ではこういった情報発信が広く行われており、複数のサービスを組み合わせることで多彩なボットを作成可能です。
また、スクレイピング等の手法も組み合わせれば、まさにその組み合わせはアイディア次第。無限の可能性があると言っていいでしょう。
もちろん、一発ネタのボットで注目を集めるというのも面白いそうです。

この連載が、そんな素敵ボットを作ろうとする方の一助となれれば幸いです。


カテゴリ: Development タグ: twitter perl