銀さんのbot 〜不完全〜

2010-05-17

お久しぶりですいません

12:35

お久しぶりですいません。

銀次です。


トリック新作ほぼ見逃しました。

クライマックス寸前で気づくなんて…


とりあえず、生きてます

1年くらいちょっとbotに専念できない状況です。

クソどうでもいい理由なんですが、

就職活動とりこぼした授業と研究という…

すいません、なんか

現在もNNT(内々定ではなく無い内定)で俺たちの戦いは続くッみたいな感じであばばばばば


私情で申し訳ないのですが、この戦いが終わるまでbotの管理だけしていきたいと思います。基本。

NNTからANTになりたいものです。

2010-02-13

スペースが入っても反応できるソース

05:51

あいずさんに非常に参考になるソースを貼っていただいたので、メモします

else if(stristr($com, "つ")){

if(preg_match("/煙草|たばこ|タバコ/u",$com) > 0){

$key = array_rand($tabako);

$post = $tabako[$key];

$return =$reply_name." ".$post;

}

}


このソースで

・「煙草たばこタバコ」など表記を変えても認識するようにしたい

・「つ煙草 どうぞ」など、スペースが入っても機能するように。

・「つ煙草」だけでも機能するようにしたい

ということができるそうです。


ということは…おかげでソースが整理できそうです!

今までひらがな、カタカナ、半角カタカナで分けていたのを、

これでかなりすっきりさせることができそう!


あいずさん、本当にありがとうございます!



追記

blackcatさんがコメント欄に「気をつけないといけない例」を書いてくださっています!


たばこをあげる以外の時、「煙草は体に悪いから気をつけた方が良いよ」などというようなリプライをしてもたばこをあげた反応が返ってくるそうです。

その場合を考慮した対処法が書かれているので、そちらもぜひ参考にしてくださいねー!


blackcatさんありがとうございました!

blackcatblackcat 2010/02/14 23:39 このソースだと時々「あれ?」と思う場合があるので
気をつけないといけない例を挙げておきますね。

確かに「つ煙草」「つたばこ」「つタバコ」でも反応しますが、
「煙草は体に悪いから気をつけた方が良いよ」と声をかけられても
反応してしまいます。
このソースは1行目でリプライ文の中に「つ」があり、
更に、文章中に「煙草、たばこ、タバコ」があれば
反応するという意味です。

もしも「つ煙草」と「つ」と「煙草」の間にスペースが
入って欲しくないのであれば、

else if(preg_match("/つ(煙草|たばこ|タバコ)/u",$com)){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

で、同じ煙草の表記ゆれに対応し、且つ「つ」が煙草と
くっついてなければ反応しません。

また、リプライ文の文章に「つ煙草」があり、
尚且つ「どうぞ」がリプライのどこでも良いから「つ煙草」の
後ろにあれば特定の返事をする、という場合は

else if(preg_match("/つ(煙草|たばこ|タバコ).*(どうぞ)/u",$com)){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

となります。これらは正規表現というものです。
以下に貼ったリンクが正規表現の使い方が(個人的には)
わかりやすかったので参考にどうぞ。

サルにもわかる正規表現入門
http://www.mnet.ne.jp/~nakama/

blackcatblackcat 2010/02/14 23:43 先ほどのコメントのソース、全部}が1つずつ
余計についてますね。。
気をつけてください。申し訳ありません・・・

silverbotsilverbot 2010/02/15 15:18 ご指摘ありがとうございます!
追記で書かせていただきました。
正規表現の詳しくてわかりやすい解説リンクまで貼っていただき、本当に感謝感謝です!

59san59san 2010/02/15 23:02 横入り失礼します。
bot遊びをしているうちに、自分でも作ってみたいという欲望から
ここに辿り着きました。
初心者の私でもとても分かりやすくて、とてもありがたいです。

質問させてください。
時報botのようなものを作っているのですが、
”台詞”の中身をリアルタイムの時間を教えてくれるようにするにはどうしたらいいんでしょうか?
”もう○時か・・・。早く寝ろよ”などの台詞を反応させたいのです。色々調べてみましたが、分かりませんでした。
ソースもいじってみましたが、うまく反応させられませんでした。

超初心者な質問かもしれませんが、ご教授おねがいします。

59san59san 2010/02/17 23:03 すみません。自己解決しました。失礼しました。

これからも参考にさせていただきます。

2010-01-21

ありがとうございます…!ありがとうございます…!

01:45

不本意ながらちょいちょいと忙しさが加速していく今日この頃です。


ご質問して頂いたコメントに答えてくれた皆様、本当にありがとうございます。

1つ目のありがとうございます…!はこれです。


2つ目のありがとうございます…!は相棒botが充実してきたことです。

相棒リストがパンパン!

嬉しい!

ニヤニヤしちゃう!



質問コメントをしてくださった方へ

すぐに答えられなくてごめんなさいです…。

2010-01-04

cronがグレました

11:32

新年早々cronがグレました。

私はなんとかcronを見つけることができ、前よりも返事ができるようになりました。

たまたま見つけることができたので、ラッキーとしか言いようがありません。


私がどのcronを使っているかご質問なさるのはご遠慮くださいませ。

本当はここ使ってるよ!と言いたいのですが、今回のようになっては困りますので…w

応援しかできないことが何より悔しい。

書けよ、ケチくせーな!と思うかもしれませんが…ごめんなさい。

もにもに 2010/01/04 14:59 はじめまして。此方をいつも拝見させて頂いてます!
一応見回したのですが既存の質問であったら申し訳ないです。
botの発言の「Webで」「APIで」などの表記を変えるにはどうすれば良いのでしょうか?
カナダさんの「お前ら全員ホットケーキにしてやんよで」が可愛らしかったのでお訊ねします。
それではよろしくお願いします!

blackcatblackcat 2010/01/04 22:26 たまたま見かけたので横入りでお答えさせていただきます。
APIで、などのクライアント表記を変更するためには、
Basic認証ではなく、OAuth認証という方式に変更する必要が
あります。
現在公開されているソースのほとんどがBasic認証ですので、
それらを元に自分でソースを弄っていく必要があります。
最近はOAuth認証でpostする方法を紹介しているサイトも
随分増えましたので「OAuth + ○○(プログラム言語)」で
検索するとOAuth認証の方法とcurlを使わなくてもxmlを
取得する方法や、逆にcurlを使ってpostする方法など色々な
方法が出てきますので、もにさんが使用していらっしゃる
サーバーなどと照らし合わせてカスタマイズしていくと
良いと思いますよ。

OAuth認証のためのソースもサーバーの仕様などによって
使えるものや使えないもの、自分でカスタマイズする
必要のあるものなどがあるようです。慣れるまでは大変ですが
取得とpostがうまくいけば後は楽です。
頑張ってください。

もにもに 2010/01/08 13:32 遅くなり申し訳ありません!
ご丁寧な解説有難うございました!
これから調べてみようと思います、今一度有難うございました!

どこかの人どこかの人 2010/01/11 17:22 初めまして。最近ボットの存在を知り、こちらで公開されてるソースを元に製作を始めた者です。
分かりやすい説明のお陰で今現在順調に動いています。
ですが投稿時間設定でつまずいて泥まみれなので質問させて頂きます。
問題のボットは朝7時起床、夜11時就寝という設定です…説明が難しい為ソースコピペで失礼します
このソースで通常、起床、昼時の発言はきちんと投稿されますが、就寝の部分だけ投稿されません。
0時以降は設定通り黙りますが、夜11時台でも通常のメッセージが投稿され、なんじゃこらという状態です…
発言もきちんと記述してあるのでやはり時間設定にまちがいがあるのかなと…
それと夜10時に就寝メッセージを投稿し、11時以降は喋らないという場合の記述方法もご教授いただけると嬉しいです
ちなみに一時間に一回発言するだけのボットなので30分以前以降〜の部分は削りました。
※ソース
$now_g = date('G');
$now_i = date('i');
if (preg_match("/^[0-6]{0,1}$/",$now_g)){
$now_g = 'sleep';
};

switch(true){
case $now_g == 'sleep' ://睡眠中
$plist = array();
break;
case ($now_g == '7')://起床
$plist = $mes['rand2'];
break;
case ($now_g == '12')://昼時
$plist = $mes['rand4'];
break;
case ($now_g == '23')://就寝
$plist = $mes['rand3'];
break;
default :
$plist = $mes['rand1'];//通常
break;
};

うらうら 2010/01/14 16:52 こうしたらスッキリするのでは?

$now_g = date('G'); // 時 0〜23の範囲
switch(true){
case ($now_g < 7) //0〜6時
break;
case ($now_g == 7): //7時
$plist = $mes['rand2'];
break;
case ($now_g == 12): //12時
$plist = $mes['rand4'];
break;
case ($now_g == 23): //23時
$plist = $mes['rand3'];
break;
default: //8〜11時、13〜22時
$plist = $mes['rand1'];
break;
}

律 2010/01/14 21:52 はじめまして!
こちらのサイトを知り、同じサーバーを借りて同じ方法でupしているのですが、bot.phpを開くと以下のエラーが出ます(require_onceのフルパスの一部、ユーザーとパスのみ伏せました)。
ちなみにTwitter.phpを開くと真っ白です。

$now_g = date('G'); $now_i = date('i'); if (preg_match("/^[1-6]{0,1}$/",$now_g)){ $now_g = 'sleep'; }; switch(true){ case $now_g == 'sleep' : $plist = array(); break; case ($now_g == '0')&&($now_i >= '30') : $plist = $mes['rand2']; break; case ($now_g == '7')&&($now_i <= '30') : $plist = $mes['rand1']; break; default : $plist = $mes['rand']; break; }; if(! empty($plist)){ $key = array_rand($plist); $post = $plist[$key]; } //Service_Twitter險ュ螳 require_once "/usr/local/www/****/++++++/public_html/+++++++/Twitter.php"; //蛻・縺ォ繝輔Ν繝代せ縺倥c縺ェ縺上※繧ゅ>縺�s縺ァ縺吶′縲√ヵ繝ォ繝代せ縺ョ譁ケ縺檎「コ螳溘°縺ィ諤昴>縺セ縺吶 $user = '***'; $pass = '*****'; $st =& new Services_Twitter($user,$pass); if(! $st->setUpdate($post) ){ die('ERROR'); } ?>

なにがおかしくてこのようなエラーが出るのでしょうか?
ログもあさってみたのですが同じエラーの方はいらっしゃらないようでしたので…。
もしお分かりでしたら御指摘いただければ幸いです。

律 2010/01/14 22:03 連投失礼致します。
上記のエラーの原因は突き止めました。
しかし今度はbot.phpを開くと広告のみが表示され、EROORもなにも出てきません。
何が原因でしょうか?
ソースを晒しておきます(何のbot作ろうとしているかわかってしまうかもしれませんが…)。

< ?php

include_once '/usr/local/www/++++++/*******/public_html/++++++++/Twitter.php';

$mes['rand'] = array("動かないで" , "私には――重さがない" , "胸ばかり見て、いやらしい" ,"優しさなんて欲しくないの" ,"私が欲しいのは、沈黙と無関心だけ" ,"戦争を、しましょう" ,"優しさも、敵対行為と見做すわよ" ,"胸ばかり見て、いやらしい" ,"私みたいなキャラのこと、ツンデレって言うんでしょう?" , "一番駄目な奴は一番愚かなだけなのに" , "あなた一人を哀れんでも、世界から戦争はなくならない" , "わたしのこと、きっと、守ってね" , "勘違いしないでね。別に私は、あなたに気を許したというわけではないのよ"); //通常のランダムpost
$mes['rand1'] = array("お早う" , "もう朝なのね" , "起きたくないわ、まだ眠いのよ" , "私が起きたのだから、あなたもさっさと起きなさい" ); //起床
$mes['rand2'] = array("そろそろ眠いわ" , "夜更かしはお肌の天敵なのよ" , "おやすみなさい" , "星がきれいだわ" ); //就寝前


$now_g = date('G');
$now_i = date('i');

if (preg_match("/^[1-6]{0,1}$/",$now_g)){
$now_g = 'sleep';
};

switch(true){
case $now_g == 'sleep' :
$plist = array();
break;

case ($now_g == '0')&&($now_i >= '30') :
$plist = $mes['rand2'];
break;

case ($now_g == '7')&&($now_i <= '30') :
$plist = $mes['rand1'];
break;

default :
$plist = $mes['rand'];
break;
};


if(! empty($plist)){
$key = array_rand($plist);
$post = $plist[$key];
}

//Service_Twitter設定


require_once "/usr/local/www/++++++++/************/public_html/++++++/Twitter.php";


//別にフルパスじゃなくてもいいんですが、フルパスの方が確実かと思います。


$user = '*******';
$pass = '********';
$st =& new Services_Twitter($user,$pass);

if(! $st->setUpdate($post) ){
die('ERROR');
}

?>

silverbotsilverbot 2010/01/22 02:24 もにさん
私は教えて貰ったのはポストの部分だけOAuthにする方法です。
まだBasicにほとんど頼っているので、OAuthに完全移行できるソースを見つけたならそちらを使った方がいいと思います。

blackcatさん
ご丁寧に説明して頂き、本当にありがとうございます。
すごく助かりました。
コメントも参考にさせていただきます!

どこかのひとさん
うらさんが解決方法を書いてくださっているので、そちらに書き変えてみてくださいー!

うらさん
解決方法書いていただき、ありがとうございます!
私も参考にさせていただきます。

律さん
bot.phpを実行したところERRORが出ました。(夜中2時実行)
エラーも出てないので、ソースは大丈夫だと思うんですが…
var_dump系がないと何も表示されません。
でも、なくても大丈夫です。
bot.phpには必要ないです。
投稿されているなら大丈夫です。

どこかの人どこかの人 2010/01/23 10:46 うら様、silverbot様、丁寧なお返事をありがとうございます。
お礼が大変遅れてしまい、申し訳ないです
うら様がご教授下さったソースで早速試してみましたが
時間指定周辺にエラーが出てしまい、何が何やらな状況です…
$now_g = date('G');
$now_i = date('i');
if (preg_match("/^[0-6]{0,1}$/",$now_g)){
$now_g = 'sleep';};
以上の部分も削除してうら様のソースを入れるという事でFAでしょうか?
だとしたらもうお手上げですね…
コロンの打ち忘れなど修正も試してみましたが変わらずエラーのままでorz
こちらの理解力の不足で申し訳ないです。
※ソース
$now_g = date('G'); //0〜23時の範囲

switch(true){
case ($now_g < 7): //0〜6時
break;
case ($now_g == 7): //7時
$plist = $mes['rand2'];
break;
case ($now_g == 12): //12時
$plist = $mes['rand4'];
break;
case ($now_g == 23): //23時
$plist = $mes['rand3'];
break;
default: //8〜11時、13〜22時
$plist = $mes['rand1'];
break;
};

silverbotsilverbot 2010/01/23 17:58 エラー内容はなんでしょう?
ERRORですか、それとも構文ミスなどによるエラー文ですか。
エラー文を見てみたいなと思うので、書いていただけないでしょうか。

case ($now_g < 7): //0〜6時
break;
の部分を
case ($now_g < 7): //0〜6時
$plist=NULL;
break;
とにしてみるとかどうでしょう?

どこかの人どこかの人 2010/01/23 22:40 助言ありがとうございます!
$plist=NULL;を指定の場所に入れたら綺麗に動きました。
しかし再度$plist=NULL;を削除して実行したら…普通に投稿できました。
該当の箇所以外は弄って無いので消せばエラーが出るはずなのに何故…?謎です…きちんとアップロードも出来てる筈ですが(笑)

記憶が正しければ構文ミスのエラー文です。
確かunexpectedと…こんな感じでした
Parse error: syntax error, unexpected '}' in ほにゃらら on line 59
59の前後は先程記述した通り時間指定部分です
解決したにも関わらずこのモヤモヤは一体…

あいずあいず 2010/02/12 05:22 初めまして。こちらのブログを足掛かりにbot製作をしている者です。
定期ポストもリプライもおかげさまで順調に動くようになりました。分かりやすい説明には本当に助けられています。ありがとうございます。

お忙しいところ申し訳ありませんが、質問があります。
「つ+物」でbotに差し入れをしたいと思っています。
・「煙草、たばこ、タバコ」など表記を変えても認識するようにしたい
・「つ煙草 どうぞ」など、スペースが入っても機能するように。
・「つ煙草」だけでも機能するようにしたい

else if(stristr($com, "つ")){
if(stristr($com, "煙草")){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

これでリプライは返してくれるのですが、「つ煙草 どうぞ」など、間にスペースが入ると機能しません。
また、上のソースを、

else if(stristr($com, "つ")){
if(stristr($com, "煙草")){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

else if(stristr($com, "つ")){
if(stristr($com, "たばこ")){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

このようにいくつか繋げると全く機能しなくなります。
また、

else if(stristr($com, "つ")){
if(preg_match("/煙草|たばこ|タバコ/u",$com) > 0){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

これは「つ煙草です」ならリプライするのですが、「つ煙草」だけだとリプライしません。
スペースの問題は仕方ないのかな、とも思うのですが…。
もしよろしければお答えいただけると幸いです。

あいずあいず 2010/02/12 05:53 度々すみません。
こちらにコメントを書き込んだ後、もう一度動作確認してみたら思っていた通りに動きました…。
お騒がせして申し訳ありませんでした!
煮詰まりながらすごい勢いで動作確認しまくっていたのでbotが根を上げていたのかもしれません。
一応、動作したソースをもう一度貼らせて頂きます。

else if(stristr($com, "つ")){
if(preg_match("/煙草|たばこ|タバコ/u",$com) > 0){
$key = array_rand($tabako);
$post = $tabako[$key];
$return =$reply_name." ".$post;
}
}

これで、「つ煙草」「つ煙草です」「つ 煙草」「つ 煙草 あげる」すべてにリプライが返ってきました。

超初心者の私はこちらのブログに、本当に助けて頂いています。
ブログ運営、何かと大変とは思いますが(私のような者もいて…)これからも応援しています!

silverbotsilverbot 2010/02/14 05:41 いえいえ、全然構いませんよー
私もテストしているとよくAPI制限に引っかかって発言しないことが良くありますw
このソースは大変参考になるので記事にさせていただきます!

作った手順を書いて本当によかったですー
私のブログを参考にして頂きありがとうございました!

2009-12-19

Test OAuth update.が投稿できないあなたへ

08:52

2010年6月にBasic Authは廃止予定…なにそれこわい

つーことで遅れながらも、少しだけOAuthに手をつけてみた。


http://wolf.silk.to/labo/oauth.html

を見ればほとんどの人がすぐTest OAuth update.を投稿できます。

だがしかし、自分はほとんど勢に入んなかった。

どこで引っかかったか紹介します。



まずoauth_test.phpで引っかかるという。

もう初期段階で引っかかった。

実行したら

上の方に

Warning: array_merge() [function.array-merge]: Argument #2 is not an array in (省略)OAuth.php on line 249

が出て、下の方には

/account/verify_credentials.xml

Could not authenticate you.

が出た。


まずここで引っかかった人はOAuth.phpにある

if ($token)

$defaults['oauth_token'] = $token->key;

$parameters = array_merge($defaults, $parameters);

return new OAuthRequest($http_method, $http_url, $parameters);

$parameters = array_merge($defaults, $parameters);

$parameters = array_merge($defaults,(array)$parameters);

というように(array)を加えてください。

するとあら不思議。

上のエラーがみごと消える。


次は下のエラーを消す。

oauth_test.phpにある

$content = $to->OAuthRequest('https://twitter.com/account/verify_credentials.xml’, array(), 'GET');

のGETの位置を変える。

$content = $to->OAuthRequest('https://twitter.com/account/verify_credentials.xml’, 'GET', array());

こういうふうに。

そして、実行するとあら不思議!

下のエラーがみごと個人情報に!


実際にPHP+OAuthTwitterにPOSTするのプログラムを実行するときも

$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml",array("status"=>"Test OAuth update."),"POST");

$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"Test OAuth update."));

に直してあげてください。


少しでもお役にたてれば嬉しいです。



追記

[2009/12/16] twitterOAuth.phpのことでご指摘があったので、修正しました。この説明ではバージョン0.1.1を使っています。

紹介していただいているサイトさんでの指摘というのは、バージョン0.1.1以外(0.2.0-betaなど)を使ってしまったためにエラーが出ていると思われます。

「twitterOAuth.php」であり、「twitteroauth.php」ではありません。ご注意ください。

コピペですいません。

みなさん、バージョンに注意ですよ!

トメトメ 2009/12/19 12:49 紹介してくださってありがとうございます。
例のエラーの件ですが、oauth_test.phpは間違っていなく、ライブラリーのバージョン(私の説明では0.1.1を使っているのです)が違うことで発生してしまう問題でした。
もしよろしければそれも追記してくださると助かります。

silverbotsilverbot 2009/12/19 13:26 こんにちは、OAuthの分かりやすい説明を書いていただきありがとうございます。
おかげで、定期発言だけですがOAuthに対応できました。

了解しました!
親切に教えていただきありがとうございます。

hinassanhinassan 2009/12/28 19:45 記事のとおりに修正したらできました!

silverbotsilverbot 2010/01/22 01:50 hinassanさん
お力になれてよかったですー!

ikokoikoko 2010/04/05 12:35 こんにちは、OAuthによるポストのやり方でどうしても分からないところがあったので書き込ませていただきます。
SDN Projectさんの内容を参考に、oauth_test.phpを叩いて無事「Test OAuth update.」とポストできたのですが、そこから先へすすめません…

「PHP+OAuthでTwitterにPOSTする」のソースを定期ポストやリプライのphpへ組み込めばいいのかな…と思うのですが、どこら辺にどのように組み込めば良いのでしょうか?
一度自分で組み込んでアップし、テストしてみたのですがポストされませんでした…エラーなどは出ていません。
お忙しいかとは思いますが、お返事お願いします。

blackcatblackcat 2010/04/12 02:23 >ikokoさん
SDN Projectさんの
$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml",array("status"=>"Test OAuth update"),"POST");
の部分がpost関数です。
この、Test OAuth updateの部分にpostしたい言葉や定義を放り込めばokです。
定期ポストなら、最初の方でOAuthのkeyを開いて、
最後のpost関数部分をOAuthのpost関数に変更後、
Test OAuth updateの代わりにpostする配列を指定している定義部分を
放り込めばpostされます。

リプライはcurlの部分を全部抜いてOAuthのget、postの部分と
入れかえるだけです。
定期postの方が簡単にできるので、定期postに成功してから
リプライのphpに挑戦することをおすすめします。