ishiducaの日記 このページをアンテナに追加 RSSフィード

2010-07-22

[][][]はじめてのTwitter bot 16:19 はじめてのTwitter bot - ishiducaの日記 を含むブックマーク はてなブックマーク - はじめてのTwitter bot - ishiducaの日記 はじめてのTwitter bot - ishiducaの日記 のブックマークコメント

TwitterAPIから任意のハッシュタグのついたツイートを拾ってRTするbotを作ってみました。

巷にTwitter botは溢れているから今更な感じしますが、僕は初めて!(だから問題ない)


流れとしては

  1. TwitterAPIに検索ワードを投げる
  2. レスポンスをパースする
  3. 前回の検索で引っかかったツイートまたは、それをもとにRTしたツイートしたツイートと、それら以外のツイート(今回の検索で引っかかったツイート)を分ける
  4. 今回RTするツイートを整形する
  5. 今回RTするツイートをmemcachedに記憶する
  6. RTする

拾ってきたツイートをRTするだけだと、重複があったり、またbot自身がRTしたツイートを再度ツイートしてしまってスパムボットになってしまうので、それらを弾くためにキャッシュを使って前回までのポストを記憶しておくと楽チンです。今回は memcached を使って実装してみました。


事前にやっておくこと

  • bot用のアイコンを作っておくこと(これ重要w)
  • bot用のアカウントを取得しておく
  • bot用のアカウントで使うアプリケーション(この場合は bot.pl )用にOAuth登録をしておく(consumer key, consumer serect, access token, access token secret)
  • memcachedをインストール、起動しておく

(bot.pl)

use strict;
use warnings;
use LWP::UserAgent;
use JSON;
use OAuth::Lite::Consumer;
use Cache::Memcached::Fast;
use Encode;

my $keyword = '%23tkdhoncho';
my $user_id = 'Bot UserID';

my $cache = Cache::Memcached::Fast->new({
    servers => [ "localhost:11211" ]
});

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key    => 'Bot Consumer Key',
    consumer_secret => 'Bot Consumer Serect',
);
my $access_token = OAuth::Lite::Token->new(
    token  => 'Bot Access Token',
    secret => 'Bot Access Token Secret',
);

my $ua = LWP::UserAgent->new;
$ua->timeout(10);

my $uri = "http://search.twitter.com/search.json?q=$keyword";

my $response = $ua->get( $uri );
die $response->decoded_content unless $response->is_success;

my $result = decode_json($response->{_content});

for (@{$result->{results}}) {
    my $id = $_->{id};

    if ((! $cache->get($id)) and ($_->{from_user_id} ne $user_id)) {
        my %stat = (
            friend => $_->{from_user},
            tweet  => $_->{text},
        );

        $cache->set($id, \%stat);

        $stat{tweet} =~ s/@/!/g;
        my $tweet  = 'RT !' . $stat{friend} . '>>' . $stat{tweet};
        $tweet = substr $tweet, 0, 140;

        my $request = $consumer->gen_oauth_request(
            method => "POST",
            url    => 'http://twitter.com/statuses/update.json',
            token  => $access_token,
            params => { status => encode_utf8($tweet) },
        );
        my $response = $ua->request($request);

        die $response->status_line unless $response->is_success;
 
        warn join(" ", $id, encode_utf8($tweet)) . "\n";
    }
}

exit 0;

あとはcronを使って定期的に実行させます。

参照

追記

memcachedの導入やらcronの設定を「はじめてのTwitter bot 設定とか - ishiducaの日記 - Hatena::Group::Perl」に書きました。

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100722