ご注意!
ここでご紹介しているスクリプトは、Twitter API の仕様変更により現在は動作しません!(2010/09/06)
twitter apiでフォローされたらそのメールをsmtpサーバーでキックして、フォロー返し&お礼を送信するbotを作成した。
当初は、cronでやっていたのだが、フォロワー一覧を取得するためのAPIがとても不安定だったのと、複数アカウントに対応するのに負荷を軽減したかったので、メールでキックする方法に変更した。
ちなみに、昨日の時点ではGoogle app engineを使おうと思ったのだが、あっさり気が変わった。
smtpサーバーの設定
今回はpostfixを使用した。
/etc/postfix/main.cfなどで正規表現を使ったエイリアスを設定するのがポイント。
詳細は省きます。
ソース(Perl)
標準入力から渡されたメールをパースして、ユーザー名、フォロワーなどを取得して、フォロー返し&お礼を送信する。
今回はフォローメール以外は何もしていないが、標準入力で渡されたメールをsendmailにパイプで渡せば転送できるような気がする。(スパムフィルターには引っかかるかも。)
複数アカウントに対応していますので、user01という記述がある当たりを修正してください。
あと、スパマーをフォローしないようにタイムゾーンでチェックしていますが、これでは不十分だと思いますので、今後工夫が必要ではないかと思います。
#!/usr/bin/perl -wT
binmode(STDOUT, ":utf8");
use strict;
use warnings;
use Encode;
use Net::Twitter;
use MIME::Parser;
# Config
my %user;
$user{'user01'} = 'pass';
$user{'user02'} = 'pass';
$user{'user03'} = 'pass';
my $tmp = '/tmp';
my $msg = '@%s フォローありがとうございます!よろしくお願いいたします。';
my $twt_clientname = 'thanksbot';
my $twt_clientver = '0.1';
my $twt_clienturl = 'http://www.theta.ne.jp/';
# end config
my @mail = <STDIN>;
my $parser = new MIME::Parser;
$parser->output_dir($tmp);
my $entity = $parser->parse_data(join("", @mail));
my $header = $entity->head;
# get the $uid
my $uid = $header->get("X-Twitterrecipientscreenname");
chomp $uid;
# get the mail type
my $type = $header->get('X-TwitterEmailType');
chomp $type;
if ($type ne 'is_following') {
exit;
}
# get the sender
my $sender = $header->get('X-Twittersenderscreenname');
chomp $sender;
my $twt = Net::Twitter->new(
username => $uid,
password => $user{$uid},
clientname => $twt_clientname,
clienturl => $twt_clienturl,
useragent => $twt_clientname,
source => $twt_clientname,
clientver => $twt_clientver,
);
my $stat = $twt->show_user($sender);
my %st = %$stat;
if ($st{'time_zone'} eq 'Tokyo' || $st{'time_zone'} eq 'Osaka') {
my $exts = $twt->friendship_exists($uid, $sender);
if (!$exts) {
my $post = sprintf($msg, $sender);
$post = decode_utf8($post);
if ($twt->create_friend($sender)) {
$twt->update($post);
}
}
}
exit;
もう少しエラー処理とかした方がいいんでしょうけどね。ご愛嬌です。