Twitterのジョセフbotにreply機能を付けてみました。
twitter上で@joseph_jobsonで話しかけると、ランダムで何か返信します。
例によってソースコードを公開しているので、ご自由にお使いください。

Twitter Reply ver.1.0

<?
/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Twitter Reply ver.1.0

http://palemag.kazeki.net/blog/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */

$username = "アカウント";
$password = "パスワード";
$logfile = "reply.txt";
$tmpfile = "tmp.txt";

$tmp = file($tmpfile);
if(count($tmp)>0){
$since_id = "since_id=".$tmp[0];
}
$mentions = "http://".$username.":".$password."@twitter.com/statuses/mentions.xml?".$since_id;

$xml = simplexml_load_file($mentions);
if($tmp[0] < $xml->status[0]->id){

$lines = file($logfile);
srand(time());
shuffle($lines);

$update = "http://twitter.com/statuses/update.xml?";

for ($i=0; $i<count($xml); $i++) {
$id = $xml->status[$i]->id;
$screen_name = "@".$xml->status[$i]->user->screen_name;
$name = $xml->status[$i]->user->name;
$text = $xml->status[$i]->text;

if(preg_match("/おやす|お休/u",$text)){
$content = "………zzz";
}
elseif(preg_match("/おはよ|お早/u", $text)){
$content = "状況は?";
}
elseif(preg_match("/林檎|リンゴ|りんご/u", $text)){
$content = "ありがとう。$name";
}
else{
$content = $lines[0];
}

$message = $screen_name." ".$content;
$params = "status=". rawurlencode($message)."&in_reply_to_status_id=".$id;
$result = file_get_contents($update.$params , false, stream_context_create(array(
	"http" => array(
		"method" => "POST",
		"header" => "Authorization: Basic ". base64_encode($username. ":". $password)
	)
)));
}

$fp = fopen($tmpfile, "w");
fputs($fp, $xml->status[0]->id);
fclose($fp);
}
?>

特徴

  • 前回の実行時のbot宛のreplyの記録を残し、新着replyがあった時にはそれ以降のreplyに対してのみ返信します。プログラム実行時にbot宛のreplyが無い時には処理をスキップするので安心。
  • in_reply_status_idを指定する事により、返信先のpostに対して「○○宛」というリンクが貼られる為、元発言が参照しやすくなっております。
  • pear等のライブラリの類は一切未使用で分かりやすくなっております。
    いや自分がpearのインストールが上手く行かなくて躓いたので、そういうの使ってないスクリプトが欲しかっただけです。
  • PHP5専用です。PHP4以下の環境では作動しません。

使い方

  1. zipファイルを解凍。twitter_reply.php、reply.txt、tmp.txtの3つのファイルが出てくる。
  2. twitter_reply.phpのユーザー名とパスワードを変更し、reply.txtに返信させたい内容を一行ずつ記入する。
    返信内容の本文中に$nameと入れると、投稿時にその部分が相手の名前に置き換わる。

  3. アップロードしたら以下のファイルのパーミッションを変更する。
    twitter_reply.php …755
    tmp.txt …666
  4. あとは前の記事と同じようにcronを設定する。

また、今回はreplyに特定の語句が含まれていると専用の台詞を返す機能を試験的に実装しています。
真ん中のあたりにこんな感じのソースがあるので、適宜変更して使ってください。

if(preg_match("/おやす|お休/u",$text)){
$content = "………zzz";
}
elseif(preg_match("/おはよ|お早/u", $text)){
$content = "状況は?";
}
elseif(preg_match("/林檎|リンゴ|りんご/u", $text)){
$content = "ありがとう。$name";
}
else{
$content = $lines[0];
}

1行目〜3行目、4行目〜6行目、7行目〜9行目でそれぞれ一セットになっています。最初の一塊の場合はbot宛のreplyの中に「おやす」「お休」という文字が含まれていた場合、「……zzz」というreplyを返します。
パターンを増やしたい場合は4行目〜6行目のelseifから}までをコピーして次の行に貼り付けてください。
当該機能を使わない場合は上記の部分のコードを削除し、代わりに以下の一行を入れてください。

$content = $lines[0];

ちなみにcron経由で動かした時に上手く行かなかった原因としては、コマンドが宜しくなかった模様。前の記事に書いたコマンドでも動く事は動きますが、あれだけではサーバーのデフォルトであるPHP4として実行してしまっていた模様。その結果としてPHP5から実装された関数であるsimplexml_load_fileが上手く作動せず、エラーを起こしてしまっていたらしいです。
エラー出さないようにPHP5として動かすには、php -f の代わりに以下のコマンドを使うといいようです。


cd /var/www/home/users/public_html/twitter_bot; /usr/local/php5/bin/php twitter_reply.php

cdはUNIXコマンドでディレクトリを指定するという意味で、その次の青文字が異動先であるスクリプトの入ったディレクトリの絶対パス、その次の赤文字がphp5のパス、そして最後の緑文字が動かしたいスクリプトになる。色の違う文字の間には半角スペースを入れること。
赤文字と青文字の部分はサーバーによって設定が違うので、そこらへんは使う環境に合わせて調べていただきたい。

関連する投稿: