Twitterでザーギンbotはじめました

マドワルド・ザーギン (magwald_xargin) on Twitter

ジョセフbotに続いて、ザーギンbotも作ってみました。
基本的なところはジョセフbotと同じですが、たまにジョセフに対して@replyで話しかけます。ジョセフbotもそれに対して@replyを返す為、併せてフォローしていただくと二人の噛み合ない会話が楽しめます。
それに伴いジョセフbotのスクリプトも多少改変しました。たまにザーギンbotに対してreplyを飛ばします。

また、そのままだと自動反応で延々と会話が続いてしまうので、bot宛の@replyのみ別に作動するように切り分け、in_reply_to_status_idの付いていない投稿にのみ反応するようになっています(最初に送る@replyが相手botへの特定のpostに対するものではないので)。

postの内容はジョセフbot同様、今のところ本編中にある台詞のみですが、そのうち気が向いたらジョセフに対する@replyでオリジナル台詞も追加するかもしれません。

Twitter Botの参考資料など

やっぱりある程度は勉強しておいた方が出来る事も増えるわけで。と言っても自分もPHPやxmlに関してはまだほんの一端を齧っただけなのでまだまだ勉強中ではありますが、目下参考にしている書籍やらサイトやらを自分用のメモ兼ねて纏めておきます。多少なりともbotの作り方の参考になれば幸い。

PHP関連

・サイト

PHPの公式マニュアル日本語版。色々と解説サイトや書籍はあれど、正確さの上では本家本元が一番との定評アリ。
PHPマニュアル

でも多少分かりにくいところはあったり、そもそも基本的な事を勉強するにはどこから手をつけたらいいか分からなかったりするので、ある程度分かりやすく噛み砕いて解説しているサイトや本と併用するのがいいかもしれない。

PHP入門&TIPS – phpspot
基本的な事を分かりやすく解説しているサイト。正規表現やPHP5、MySQLに関するtipsもあり。

・書籍

[tmkm-amazon]4774125024[/tmkm-amazon]

持ってる本の中でも使用頻度が格段に高いのがこれ。自分が持っているのは改定前のバージョンですが、常に手元に置いて「こういう処理やるのにどんな関数があるかなー?」ということを調べたい時に目次を探したりする時に重宝しています。版が小さくて取り回しがしやすいのもよく使う理由の一つかと思われます。

[tmkm-amazon]479733245X[/tmkm-amazon]

「PHPポケットリファレンス」は逆引き事典として使うにはいいけど、基本的な事を一から勉強するには少々使いにくいかもしれない。
分かりやすさの上で言ったらこっちの方が優しいかな。

Twitter API関連

・サイト

公式によるTwitter APIの仕様書。TwitterのAPIの仕様を調べるにはここが一番正確で情報も早いかと思われます。
Twitter API Documentation(英語)

日本語訳もあります。
Twitter API 仕様書 日本語訳

・書籍

↑の日本語訳仕様書サイトの中の人が書いた書籍。多少情報は古いけど、基本的な事は変わっていないので日本語訳のサイトと併せて読むと分かりやすいかも。
ただ問題は絶版になってて入手が困難になってるということ。唯一あったamazonじゃ結構なぼったくり価格になってるし。加筆修正版が再販されたりしないだろうか。

[tmkm-amazon]4861671949[/tmkm-amazon]

XML関連

・サイト

Twitter APIに使われるxmlというものが一体どういうもんなのかを理解しておけば色々と便利。
PHP 開発者のための XML: 第 1 回 PHP での XML を 15 分で学ぶ

phpによるxmlデータの処理の仕方について。
PHP での SimpleXML 処理
PHP を使用して Twitter を RSS に変換する

・書籍

…実はまだ持ってない。つーかお勧めの本とかあったら教えてください。

cron関連

これも知らない。というか本はもとより解説サイトも見つからねぇ!(涙
ぐぐって出てくるのはUNIX関連のサイトばっかりで親切な初心者向けリファレンスというのが見つからないし、本もこれまた見つからない。使うとしたらターミナルから直接コマンド打ち込んで使うcrontabよりはレンタルサーバーのコントロールパネルから操作する方だろうけど、うちで借りてる鯖についてたマニュアルはこれまた不親切極まりなくて全く分からなかった(笑

ちなみにMacOSXには最初からapacheもPHPもバンドルされているので、Macユーザーであればレン鯖借りなくても自分のマシンだけでbotを動かす事も可能だったりする。crontabの設定もCronnixという専用のソフトがあったりするし。その代わりMac立ち上げていない時は動かせないけど。
apacheを動かすにはシステム環境設定の共有メニューで「Web共有」にチェック入れるだけでいいんだけど、PHPを動かすにはrootログインしてhttpd.confを弄ったりしないといけないので、そこがちと面倒で敷居が高いかもしれない。

ジョセフbotをTwitterの重複つぶやきブロックに対応

最近、twitterでは直近10postと同じ内容を投稿しようとするとduplicate textエラーが出るという規制が導入されたようなので(Twitter、重複つぶやきをブロック開始)、その対策バージョンです。

例によって同時にソースコードも公開しております。
最近投稿された10件分のpostを記録し、それと同じ内容のpostをしない仕様になっております。よってその性質上、botの発言内容ファイルには11件以上のpost内容が入っている必要があるので、それより少ない場合は増やしてからお使いください。

新たに追加されたlastlog.txtが最新10件分を記録するファイルになっています。本体と同じディレクトリにアップロードした後、パーミッションを666に変更してください。
既にver.1.0を使っている人はlastlog.txtファイルに最近のbotの発言10件分をコピーして格納しておくといいと思います。その場合は文字コードをUTF-8に変更するのをお忘れなく。
また、記録しておくpostの数を適宜調整すれば、同じ内容を短期間の間に繰り返すということを阻止できるかもしれません。$lastmax = 10;のところの数字を変更してください。

Twitter Post ver.1.1

<?
/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Twitter Post ver.1.1

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

$username = "アカウント";
$password = "パスワード";
$logfile = "bot.txt";
$lastlog = "lastlog.txt";	// 最後の10post分を記録するファイル
$lastmax = 10;	// $lastlogに記録しておくpostの件数

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

$baalu = file($lastlog);
if(count($baalu) < count($andromarius)){
$lastpost = file_get_contents($lastlog);
$i = 0;
while(preg_match("/$andromarius[$i]/u", $lastpost)){
$i++;
}
}
else{
echo "Error: postさせる文章は".$lastmax."件以上記録してください。";
}
$message = $andromarius[$i];

$fp = fopen($lastlog, "w");
fputs($fp, $message);
for ($j=0;$j<$lastmax-1;$j++) {
fputs($fp, $baalu[$j]);
}
fclose($fp);

$params = "status=". rawurlencode($message);
$url = "http://twitter.com/statuses/update.xml?";
$fp = fopen($url.$params, 'r', false, stream_context_create(array(
	"http" => array(
		"method" => "POST",
		"header" => "Authorization: Basic ". base64_encode($username. ":". $password)
	)
)));

$result = "";

while(!feof($fp)){
	$result .= fgets($fp);
}

fclose($fp);
?>

Twitterのジョセフbotに返信機能が付きました

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

Twitter Reply ver.1.0

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

https://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のパス、そして最後の緑文字が動かしたいスクリプトになる。色の違う文字の間には半角スペースを入れること。
赤文字と青文字の部分はサーバーによって設定が違うので、そこらへんは使う環境に合わせて調べていただきたい。

Twitterでジョセフbotはじめました

Twitterの方でジョセフbotというものを作ってみました。
一定時間ごと(現在では3時間に1回)に作中の台詞をpostするだけのプログラムです。
ちなみに現段階では未完成で、話しかけられてもreplyを返すことができず、台詞も一部しか搭載できてません(現段階では2話、9話、23話、24話のみ)。
(reply機能追加しました。台詞もほとんど追加完了しています)

reply機能は某所で公開されていたソースコードを試してみたのですが、どういうわけだかcronでの定期実行がうまく動かず、無茶な動かし方をしようとしたところ暴走しましたorz。これは参考にしたソースコードが悪かったというよりも、中途半端に改変したのが悪かったのかもしれません。
ブラウザ経由で動かした時には上手いこと動いたのですが、cronでphpファイルを定期的に実行させようとした時に限ってエラーが出て動きませんでした。なんでだ。

ひとまず現段階でのソースコードを公開しておきます。大元のソースはこちらのページを参考にさせていただきました。

Twitter Post ver.1.0

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

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

$username = "twitterユーザー名";
$password = "twitterパスワード";
$logfile = "bot.txt";

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

$message = $lines[0];

$params = "status=". rawurlencode($message);
$url = "http://twitter.com/statuses/update.xml?";
$fp = fopen($url.$params, 'r', false, stream_context_create(array(
	"http" => array(
		"method" => "POST",
		"header" => "Authorization: Basic ". base64_encode($username. ":". $password)
	)
)));

$result = "";

while(!feof($fp)){
	$result .= fgets($fp);
}

fclose($fp);
?>

これが一体何をするもんかっちゅーと、「設定したtwitterアカウントに決められた文章をpostする」というプログラムで、つまりphpの動くレンタルサーバーに置いてやったら、アクセスされる度にランダムで1回postするというもの。
基本的な手順としては大体こんな感じになります。

  1. twitterにbot用のアカウントを作成する。
    キャラbotの場合は名前欄にキャラ名を入れたり、プロフィール欄に「○○のbotです」みたいな説明文を入れたり、アイコンをそのキャラの画像にしてみたり色々カスタマイズしてみると宜しいかと思います。
    とりあえず今はアカウントだけ作っておけば、アイコンの変更とかは後からゆっくりやっても可。
  2. 上記のzipファイルをダウンロードして解凍し、「twitter_post.php」の以下の行の””の中身を先ほど作ったtwitterのユーザー名とパスワードに書き換えて保存。

    $username = “twitterユーザー名”;
    $password = “twitterパスワード”;

  3. 「bot.txt」をテキストエディタで開き、botに喋らせたい内容を一行ずつ書いていって保存。一行につきpost一つ分の内容になるので、一行が140文字を越えないように注意。

    ※twitter_post.php、bot.txt共に文字コードはUTF-8、改行コードはLFで保存してください。

  4. 上記のファイル2つをphpの使えるサーバーにアップロードする。
    無料サーバーでも、xrea.comとかland.toとか@PAGES等ではphpが使用可能。
  5. twitter_post.phpのパーミッションに実行権限を与える。
    サーバーによって違うかもしれませんが、とりあえず755にしておけば間違いはないはず…

あとはアップロードしたtwitter_post.phpにアクセスしてやれば、そのたびにbotがランダムで発言するわけですが、何もしなくても一定時間事に喋らせたい場合はもう一手間必要になります。
ちなみに自分が借りている80code.comではphpも4と5が使い分けられる上にcronも使用可能という安い割に至れり尽くせりなサーバーなのですが、生憎現在は新規登録を停止している様子です。

cronが使えないレンタルサーバーの場合は、cron-job.orgというサービスを使うのがいいかと思います。指定したurlに指定した時間ごとにアクセスしてくれる大変便利なサービスなのですが、ドイツ語のサイトなのでこのへんのページを参考に登録してください。
cron タスクの設定 【 Cron-job.org の利用】

cronが使える場合は、管理画面のどっかにこんな感じのフォームがあるはずなので、以下のような感じで入力します。

曜日 コマンド
0 */3 * * * php -f /var/www/hogehoge/public_html/twitter_post.php

コマンドの欄にはファイルの絶対パスを放り込めば動くと思っていたのですが、実はそれだけでは動きません。PHPを動かしたいときは絶対パスの前に「php -f 」というのを付けてあげると動くようです。
一時間に一度発言させたい場合はフォームの「分」のところに0〜59の数値を、それ以外の時間のところには「*」と入れてください。3時間に1度の場合は「時」のところを「*/3」にすれば、3時間おきに発言するようになります。
この赤字の部分はphpファイルへの絶対パスを入れる必要があるわけですが、サーバーによって違うのでお使いの環境に合わせて変更してください。

ちなみに自分が説明するまでもなく、ぐぐれば参考になるページは色々と出てきます。はてなブックマークに色々と放り込んでおいたので、参考にしてみてください。