あ、ええと、まずは年明けましたのでおめでとうございました。
このたび休暇を30日から3日までの5日間頂きましたので全ての時間をEasyBotter、つまりはツイッターの自動bot作成に充てております。
頭ん中メルヘンな2次元なので腐った方向…にはまだまだ乙女すぎるだろこいつ、みたいな感じです。
さて、まずは『プログラミングができなくても作れるTwitter botの作り方
』様の、バージョンを最新で。(現在2.05)
参考にしているのは…沢山。
EasyBotter非公式wiki
様
銀さんのbot~不完全~
様
プログラミングを始める10の理由
様
サルにも分かる正規表現入門
様
この他にも分からない事はググって探してるんですが今お気に入り登録できてるのはこの位です。
利用しているHPはSiteMix(サイトミックス)様
利用しているcronはGAE-cron様
自分で開設して取得するも自分以外の人が登録出来ていないと言う…まだほったらかしにしてます。
今はまだ出番なし。
…で。
今現在進んでぶち当たっている壁は、時間別にリプライパターン、TLポストを変えていく。(TLリプは時間に関係なくするのでそのままで。)
まぁ要するに、朝おはようって言ったら『おはよう』夜おはようって言ったら『はぁ?おはよう?』な感じで返事してくれる式。TLだったら朝昼晩。
EasyBotter自体の記述でそのまま手動で叩いて動いたので、if分岐とかswitch分岐をリプライファイルとかTLポストファイルにぶち込んで使ってみよう!
って事でここでプログラミングを始める10の理由様からソースを丸ごとコピペ!
まずリプライ反応からってんで書いてある通りボット名とパスワードとdata.txtのフルパスと、stristrからpreg_matchに変更と、//nで反応語句囲ってぽん、と特に他は変更しないままbot.phpをブラウザ実行。
TL上に反応する語句がないよ!だけが表示。
あるぇ?
@が付くものがなくなったら、@に反応する語句がないよ!ってだけが表示。
正常に動いてる事には動いている、らしい?
エラーが出ないんだから、そうだよね…コードが間違ってたらサーバーエラーになりましたし。
もしかして、これOAuth認証系が関係してる…のか?
それとも$***=array();は$data=array();でしか反応しない様になっているのか…?
そういう記述がないか調べるも、プログラムなんて中途半端にしか分からない!と言うより齧った程度なんでほとんど知らないが正しい。
分からないからググるけど、ググってこのざまだよ。
EasyBotterをOAuthな記述に…?いやでもこれ最新のだし。
―――ここからコピペ―――
$username = "botの名前";
$password = "****";
$filename = "/home/member/…/data.txt";//フルパス。
//ここ重要!コピペミスってました!すみません!以前のコピペで動かない人はこの1行をこの場所に入れて下さい!
$host = "http://twitter.com/statuses/mentions.xml
"; //返信一覧
$fp = @fopen($filename,'rb') or die("ファイルが開けません");
flock($fp, LOCK_EX);
$line = fgets($fp, 64);
fclose($fp);
//保存しておいたステータスid取得。このid以降の返信を読み込む。なかったり読み込めなかったら最新1件
if(!empty($line)){
$last_id=$line;
$host .="?since_id=".$last_id;
}
else{
$host .="?count=1";
}
//cURLセッションを初期化する…ここらへんはおなじみ
$ch = curl_init();
////オプションを設定する
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
//
////cURLセッションを実行する
$result = curl_exec($ch);
//
////cURLリソースを閉じ、システムリソースを解放する
curl_close($ch);
//XML文字列をオブジェクトに代入する
$XML = simplexml_load_string($result);
//ここからが変わったところ。以前保存したid以降、複数リプライある場合whileで処理。
//新しい程配列のキーが若いので、減算子を使う(for文でもできるんじゃ…)
$i = count($XML)-1;
$j = 0;
while($i >= $j) {
$var = $XML->status[$i]->text;
$com = ereg_replace("\@$username", "", $var);
$reply_name = $XML->status[$i]->user->screen_name;
$name = $XML->status[$i]->user->name;
//ゴチャゴチャするので、返信のセリフ組み合わせはユーザー定義関数で。
$message = serif($reply_name,$name,$com);
//そのままポストの関数へ…
tweet($message ,$username,$password);
$i--;
}
//最終発言リプライのidを保存してる部分。先頭を調べて…
$string = $XML->status[0]->id;
//空じゃなかったら書き込み
if(!empty($string)){
$dat = (string)$string;
file_put_contents($filename,$dat,LOCK_EX);
}
//これでメインの処理は終わり
//セリフ生成のユーザー定義関数
function serif($reply_name,$name,$com){
//配列を用意して…
$uranai=array("大吉","中吉","小吉","末吉","吉","凶",);←他にもいくつか追加してはいるんだけど…。
$janken=array("ぐー","ちょき","ぱー");
//スクリーンネームに@を付ける
$reply_name = "@$reply_name";
//特定語句に反応する部分
if(preg_match ($com, "/占い|占って|うらな/u")){
$key = array_rand($uranai);
$post = $uranai[$key];
$return = $reply_name." ".$name."さんの運勢…".$post;
}
else if(preg_match ($com, "/じゃんけん|じゃーんけーん/u")){
$key = array_rand($janken);
$post = $janken[$key];
$return = $reply_name." ".$name."さん、勝負だ!じゃんけん…".$post;
}
else{
//このままだと鸚鵡返し。色々工夫してみて下さい
$return = $reply_name." ".$com;
}
//戻り値
return $return;
}
//ポスト部分の関数
function tweet($message ,$username,$password)
{
$message =urlencode($message);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://twitter.com/statuses/update.xml');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "status=$message ");
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$buffer = curl_exec($ch);
curl_close($ch);
}
―――終了―――
とまぁ記述はしてみたんだ。丸々コピーだから記述間違いはない。
何がいけないのかさっぱりだ。
気になる所としたら、これを入れずに$data = arrary( って記述のファイルでは動いたという部分と、それが無かったらう動かねーよって言ってる人がいた、現にこのソースにはどこにも見当たらないからそれなのかなぁ…でもでもそれで動いてる人いるんだよね。
でもそれって一から記述を書いてってることだから私みたいにただ単にぶち込めば良いってもんじゃないということだろうか。
勉強もせずにいきなりハイレベルな記述書こうなんてお門違いだ諦めろって?
と言うかこれEasyBotter用じゃねーよってやつなんだろうか。
用意するプログラムとか違ったもんなあ。
でもこれ入れてる人はちらほら見かけるのだけど…。
form.phpも良い感じで設置出来たしちゃんと手動で動くし…。
色々仮説を立てて試すも何ともまぁ勉強不足が祟って…。
一応EasyBotter.phpの中をじっくり観察してると$data = arrary(ってあるから、そこから関連付け出来てるのかな?
ならこっちのファイルからEasyBotter.phpに接触できるように何らかの記述を足さなければいけない、と言う事?
えーとform.phpの方はバージョン1.04から引っ張ってきたから、
if(isset($_POST["submit"])){
require_once("EasyBotter.php");
$eb = new EasyBotter();
$message = $_POST["message"];
$response = $eb->setUpdate(array("status"=>$message));
$result = $eb->showResult($response);
}
で、ずばっと15~6行位からこれに書き換えて実行できた。
require_once("EasyBotter.php");
$eb = new EasyBotter();
らへん重要?リプライファイルにこれ要るのかなぁ…一応bot.phpとは関連付け出来てるんだし、ちょっとググる。
require_onceは一回だけファイルを読み込むらしい。
全く関連付けされていないから読み込んで接触した、と言う事?
あと$が付いた単語は$aはbの事ですよーみたいに思ってる。
だから$eb は new EasyBotter();の事ですよ、みたいに解釈してる。
そこからの記述は良く分からないけど、そこをリプ用に変更したらイケるんじゃないかとか素人が思ってる。
そんな感じ。
今の所はこんな所で躓いてるけど、ここを乗り切ったらあとは簡単だと思うんだ!(((
このスイッチ分岐が成功すれば、きっと他のも大丈夫だ!
インクルードとかしてパターンファイル増やすとか改造出来ないし、ファイル増やすの面倒だし、一個ずつのファイルで全て管理した方が何かと便利だよねって私の勝手な意見だけども、その分間違ったら何処が違うのかって探すの大変そうだけど…フォルダで管理するよりはずっと楽なはず!
…さて、今日はここまでです。
EasyBotterで上の記述を試している方、いらっしゃいましたら是非その説明が載っているページとか、ググり方とか教えて欲しいものです…。私が見落としているかもなのでもう一度回ってきますが…。