風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

cronを使わずにmentionに反応するbotを作ってみる(EasyBotter+さくらレンタルサーバ)

背景

Twitterで、順次「返信または@関連を受信」(mention受信)した場合などにも、メール通知が来る機能が追加されている*1

メール通知 が告知なく機能追加されていた件 - Togetterまとめとか見ると随分嫌がられているみたいだが、これはデフォルトで有効になっているためにアカウントによらずある日突然際限無くメール通知が来るようになってしまった、というのが問題なのであって、機能そのものは使い方によっては有効に使えるのではないか?

つまり、

  • cronで定期的にポーリングしなくても、メール通知をトリガにして、bot等を反応させることが出来る。
  • メール通知はmentionされてから短時間で届くので、分単位で監視するcronよりも素早く返信を返せる。

ということで、とりあえず、EasyBotterを、メール受信時に特定処理を実行可能なさくらのレンタルサーバ上で動かしている環境で試してみた。

なお(少なくとも現状では)いろいろな制限があるので注意のこと。

設定

前提条件

あらかじめ、さくらのレンタルサーバ上でEasyBotterの「自動フォロー返し」「@で話しかけられたときにリプライ」機能が正常に動作していること。

また、文中では、

さくらのアカウント sample
EasyBotterのインストール先 /home/sample/www/easybotter/
Twitter(bot)のアカウント(screen_name) sample_bot
Twitter(bot)の旧メールアドレス old@olddomain.com
新規作成メールアドレス eb_address@sample.sakura.ne.jp

としているので、自分の環境に併せて適宜読み替えること。

1. follow/mention時用のPHPファイルを用意

follow.php

<?php
chdir(dirname(__FILE__));
require_once("EasyBotter.php");
$eb = new EasyBotter();
$response = $eb->autoFollow();

reply.php

<?php
chdir(dirname(__FILE__));
require_once("EasyBotter.php");
$eb = new EasyBotter();
$response = $eb->reply(2,"data.txt","reply_pattern.php");

のような二つのファイル(follow.php、reply.php)を(UTF-8・改行コードLFで)作成し、bot.phpと同じディレクトリ(例:/home/sample/www/easybotter/)に転送しておく。
reply.phpの$response = $eb->reply(...)の行は、自分のbot.phpに記述してあるものと同じにしておくこと。

2. メールアドレスの作成
  1. さくらのレンタルサーバ上に、Twitterからのメール通知を受信する専用のメールアドレス(例:eb_address)を新規に作成
  2. 当該アドレスの設定で[追加]ボタンを押し、現在bot用のTwitterアカウントに設定してあるメールアドレス(例:old@olddomain.com)を指定した後、「○転送専用にする」にチェック
3. .mailfilterの編集

/home/アカウント名/MailBox/作成したメールアドレス名/

(例:/home/sample/MailBox/eb_address/)にある.mailfilterというファイルを確認する。正しく作成出来ていれば、

cc "!old@olddomain.com"
exit

のようになっているはずなので、これを、

cc "!old@olddomain.com"
if ( /^[Ff]rom:.*follow-.*@postmaster\.twitter\.com/ && (1) )
{
to "| /usr/local/bin/php -f /home/sample/www/easybotter/follow.php"
}
else
if ( /^[Ff]rom:.*mention-.*@postmaster\.twitter\.com/ && (1) )
{
to "| /usr/local/bin/php -f /home/sample/www/easybotter/reply.php"
}
exit

のように修正して保存する。
このとき、.mailfilterのパーミッションが600になっていることを確認すること。

4. Twitter(bot用アカウント)のメール通知設定変更
  1. ユーザ情報の設定画面で、メールアドレスのところを、新規に作成したアドレス(例:eb_address@sample.sakura.ne.jp)に書き替え、[保存する]ボタンを押す。
  2. メール通知の設定画面で、「□返信または@関連を受信」及び「□誰かが私をフォロー開始」にチェックが入っていることを確認、入っていなければチェックして、[保存する]ボタンを押す。
  3. 旧メールアドレス(例:old@olddomain.com)宛に、「Twitterでの連絡用メールアドレスを確認してください、sample_bot」のようなメールが届くので、メール中のリンク(URLがhttp://twitter.jp/account/confirm_email/sample_bot/〜になっているもの)をクリックして、確認作業を完了する。
5. botの動作確認
  1. (botとは別の)適当なTwitterアカウント(例:誰か(@foo))で、botのアカウント(例:sample_bot)をフォローする
  2. 旧メールアドレス(例:old@olddomain.com)宛に、「誰か(@foo)が Twitter であなたをフォローしました!」というメールが届くことを確認する。
  3. bot(例:sample_bot)が、誰か(@foo)をフォロー返ししたことを確認する。
  4. 適当なTwitterアカウント(例:誰か(@foo))から、bot宛にmention(「@sample_bot 適当な文言」)を送る。
  5. 旧メールアドレス(例:old@olddomain.com)宛に、「誰か(@foo)が Twitter であなたのユーザー名を含むツイートを投稿しました!」というメールが届くことを確認する。
  6. botが、当該mentionに対して、返信することを確認する。
6. .mailfilterから転送設定を削除(必要に応じて)

旧メールアドレス(例:old@olddomain.com)宛にいつまでもメール通知が届き続けるのが鬱陶しい場合などは、botの動作確認後、.mailfilterから、

cc "!old@olddomain.com"

の行を削除して保存しなおせば転送されなくなる。

制限と独り言など

あなたにとって最もふさわしい場合にのみ、メール通知を送信するように努めています。例えば、あなたがフォローしているユーザーがあなたのツイートをリツイートしたり、あなたがツイートの中で言及したユーザーがあなたのツイートに対して返信した場合は、あなたにメール通知をお送りします。全てのリツイート、返信、お気に入りについてメール通知を受信する訳ではありません。その内容があなたに関係性が高いと判断した場合にのみ、メール通知を送るようにしています。
強調部分は当方にて修飾。

Updating your email preferences | Twitter Help Center

あの〜、関連性の高さを勝手に判断しないで欲しいというか……。
機能を有効にしている場合には、何も考えずに機械的に通知して欲しい……。


つまり、

  • 「返信または@関連を受信」した場合であっても、必ずしもメール通知があるわけではなく、Twitter側の判断によって通知があったりなかったりする。

ということ、らしい。

当方が試したところでは、

  • フォローしていないアカウントからのmentionについては、メール通知が届かない(届きにくい?)→なので、bot等で自動応答させる場合は、自動フォロー返し機能が必須。
  • 例えば、フォロー→リムーブ→フォローのようにした場合、2度目のフォロー時にはメール通知が届かない(っぽい)→(botのアカウントから)手動フォローが必要となるケースがある。
  • フォローしている人からのmentionであっても、メール通知が届かないケースがある(短い間隔でmentionを送ったり、とか。今一、条件が絞れない…)。

ということで、これだけに頼ると取りこぼしも結構出そうな感じ。

既存のcron駆動と平行して動かしておけばよいのかな、とも思うが、EasyBotterでしっかり排他制御されているかどうか(例えばメール通知で駆動している最中にcron駆動が割込んだらどうなるか)については未知数なので、保証の限りでは無い。
まぁ、もとから保証なんてないけれども。試す場合はあくまで自己責任にて。ちなみに当方はEasyBotterは試しに使ってみただけで常用しているわけではないので、何か尋ねられても答えられないと思う……。

一応、

botclub_t (@botclub_t) | Twitter

が、現在メール通知駆動のみで動作しているので、どんな感じか試したい方は、フォローした上で、mentionを送ってみればよいかも。

*1:ちなみに当方のメインアカウント@furyuteiではまだこの設定は有効になっていない。→2011/06/01頃に有効になった模様。