« 井上裕美子の中国短編小説集『公主帰還』を読んだ | Main | W-ZERO3 Ad[es] で使っている Twitter クライアント »



Wed, 14 Apr 2010

さくらのレンタルサーバで Twitter bot を動かす

Posted at Wed, 14 Apr 2010 in computer::web

私のタイムラインには人間だけじゃなくてbotがたくさん混ざっているのですが、自分でもなんとなく作りたくなったので作ってみることにしました。
主な手順としてはざくっとこんな感じです。

Twitterアカウントを取得

ひとつのメールアドレスで複数のアカウントは取得できないので GMail のエイリアス機能を使いました。example+twitter@gmail.com みたいなアドレスです。もちろん Bot 専用のメールアドレスを用意してもいいと思います

Bot用スクリプトをダウンロード

pha さんによる「プログラミングができなくても作れるTwitter Botの作り方 からスクリプトをダウンロードしてこれを使いました。最新版の 2.0x系を使用しています。今のところこのスクリプトが一番有名でHowtoも多いのではないかと思います。もっと簡単な方法として、 ボットジェネレーター を利用する、という方法もあるようですが、こちらは使ったことがありません。

データの用意

Botが呟くデータを用意します。今回は小説のキャラクターのBotだったので文庫本に付箋を貼ってセリフを打ち込みました。なんだかんだでこの工程に一番時間がかかっています。
また、Bot の挙動についてもこのへんで決定しておく必要があります。ただ呟くだけ、タイムラインに反応する、@ つきで話しかけられたら返事をする、など。
pha さんのスクリプトの場合は、「用意したテキストからランダムに発言する」「用意したテキストを順番につぶやく」「@ つきではなしかけられた場合にリプライを返す」「タイムラインを取得してリプライを返す」の4パターンの挙動が設定可能です。リプライの場合には反応するキーワードとそれに対応する答えをセットで決めておくことができます。
Bot がリプライを返すようにする場合、Bot をフォローしてくれそうな層(今回の場合だと同じ小説の別のキャラクターのBotをフォローしているユーザなど)があらかじめ想定できる場合には、そういった人たちが Bot になにを話しかけたりしているか調べてみたりすると参考になるかもしれません。
http://search.twitter.com/ で to:(screen_name) と入力するとどんなふうに Bot にはなしかけられているかを見ることができます。

データファイルについては先述のサイトに詳細があるのでそちらを参照してください。

OAuth認証用のアプリケーションの登録とキーの取得

今回使ったスクリプトは OAuth の認証が必要になるものなので、「Consumer key」「Consumer secret」「 Access Token」「Access Token Secret」の4つのキー(+Botのscreen_name=ユーザ名)が必要になります。このうち「Consumer key」「Consumer secret」は、Botを動かしているスクリプトごとに固有となり、「 Access Token」および「Access Token Secret」が、アカウントごとに固有文字列になります。pha さんのところでも取得できますし(その場合発言元が EasyBotterになります)、少し頑張って PHP+OAuthでTwitter - SDN Project などを参考にして自分でOAuth用のスクリプトを設置して設定しても良いと思います。と書くと少し大げさですが、実際は拍子抜けするぐらい簡単にOAuthスクリプトが設置可能です。

Bot用スクリプトの設置

pha さんのサイトに書いてある説明を見ながら設置を行いますが、1.0系の説明が少し混ざっていたりするので適時応用させることが必要です。とりあえず展開したファイルをフォルダごと全部FTPなどでサーバに転送して、bot.php だけ実行権限を 705 とかに変更しました。
さくらのCronでしか動かさないというのであれば公開できるところに置いておく必要はない(実行権限を与える必要もおそらくない)のですが、Google App の Cron で動かす場合やブラウザ経由で手動で動かすときのために、WWW からアクセスできる場所に設置しておいたほうが便利だと思います。ただしURLを知られるとむやみやたらと Bot が喋りだすということになりかねないので、その辺は適時自衛が必要だと思います(わかりにくいディレクトリにファイルをおく、スクリプトをいじって決められた時間以外はツイートしないようにする、Basic 認証をかけておく、etc)
http://~/bot.php をブラウザで叩いて、投稿に成功しました、というメッセージが出れば設置は完了です。

Cron(定期実行)の設定

このままだと手動で Bot の URL にアクセスしたときにしか Bot が呟かないので、定期的に呟くためと、リプライを行うために Cron の設定を行います
レンタルサーバのスタンダードプランだと5つまでCronの設定がコントロールパネルから可能です。
設定については「さくらインターネットのCRON設定を可能な限り簡単に解説したい 」なんかがわかりやすいと思うので参考にしてください。

この Bot はリプライを返すのですが、プログラム側で条件分岐するのも面倒だったので、rep.php というphpファイルを新しく作って、ランダム投稿および自動フォロー返しをする本体 bot.php とは別々に動かしています。

rep.php の中身はこれだけです。

<?php

require_once("EasyBotter.php");
$eb = new EasyBotter();
$response = $eb->reply(6,"data.txt","reply_pattern.php");

基本的に bot.php を1時間に2回、rep.php を6分おきに動かしています。さくらのレンタルサーバでの Cron の最短実行間隔は不明ですが、2分とか3分でもいけるのではないかと思います。このアカウントは後述するあらったーやローカルクライアントでも参照しているのであえて間隔をあけてあります。
Cron の設定では実行コマンドで、bot.php を設置したフォルダに移動してから php で実行しているところがポイント。cd での移動がないとライブラリが読み込めず、Bot が動作しない模様です。

通常発言の設定

実行コマンド
cd /home/~/botを設置したフォルダ ; /usr/local/bin/php -q bot.php > /dev/null
実行日時
月、日、時がそれぞれ「*」、分が「22,50」
曜日
全ての曜日にチェック

リプライの設定

実行コマンド
cd /home/~/botを設置したフォルダ ; /usr/local/bin/php -q rep.php > /dev/null
実行日時
月、日、時がそれぞれ「*」、分が「3,9,15,21,27,33,39,45,51,57」。
曜日
全ての曜日にチェック

分の設定は6分おきなら「*/6」とかで構わないのですが、毎時0分にいろんなBotの発言がタイムラインにどばっと流れるという現象が自分のタイムラインで起きていて、そのタイミングを回避しようとした結果こんなことになっています。

テスト

設置してからしばらくはアカウントに鍵をかけて非公開にして運用テストをしている人もいるようです。が、まぁお遊びBotなのでこのへんは適当に。私は試験運用ですとBotのプロフィールにのせて最初からずっと公開アカウントで運用しています。

Bot説明サイトを作成

Bot の説明と Twitter 以外の窓口(中の人あてのフォームメールやメールアドレス)があったほうがいいと思うのでそのための Web ページを用意しています。これは Wiki で簡単に作りました。DM を Bot にとばせばたしかに中の人には届くのですが、そのために Bot をフォローしなくてはいけない、というのはなんだか面倒くさい気がしたので。

その他

どんなことを話し掛けられているか、というのをあらったー を使ってメールで知らせてもらっています。これを見てリプライの内容を増やしたりしています。このサービスだとプロテクトのユーザの発言も知ることができます。「基本的には2分おきにAPIを参照」しているようです。
また、リムーブされたときに知らせてくれるQwitter というサービスがあるのでこれも併用しています。このサービスはリムーブされる直前の発言を知らせてくれるため、これを知るために使っています。Bot なのでどんなタイミングでどんな返信を返すか完全は把握しきれない(というか、そのほうが「らしい」と思うのであえてそういったランダムな要素をいれている)というのがその理由です。

« 井上裕美子の中国短編小説集『公主帰還』を読んだ | Main | W-ZERO3 Ad[es] で使っている Twitter クライアント »