したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

EasyBotter2.0その2

47名無しさん:2012/02/15(水) 22:04:15
【設置鯖名】 @pages
【PHPのバージョン】Easybotter 2.05beta
【EasyBotterの改造】非公式wikiを見てリプライ、TLに特定ワードを見つけるとツイートを取得し非公式RTできるようにした
【手動】 動く
【実行】 CRON:GAE
【実行間隔】 2分間隔
ツイッターの仕様変更を知らず、非公式RTしてフォロワー全体にツイートしたつもりが返信扱いになっていました。
過去ログにin_reply_to情報を消すためにin_reply_to_status_idのいらないと思った部分を消す、とあったのですがどこがいらないのかよくわからないです。
返信扱いにしないためにはどう書き換えたらいいのでしょうか?

48名無しさん:2012/02/16(木) 10:23:40
>>47です
自己解決しました

49名無しさん:2012/02/16(木) 21:54:20
>>36
ありがとうございます。自力で頑張ってみます

50名無しさん:2012/03/23(金) 20:30:39
BOTに非公式RTをさせる方法はよく見かけるのですが、BOTに公式RTをさせることは出来るのでしょうか?
また、出来るのであれば具体的にどのような実装方法になるのでしょうか?

51名無しさん:2012/04/02(月) 01:19:13
【設置鯖名】 レン鯖名:coreserver.jp
【PHPのバージョン】5.2.5
【EasyBotterの改造】改造している
【手動】 動く/動かない(以下に説明)
【実行】 CRON:付属
【実行間隔】 60分間隔(CRON等で定期的に実行している場合)
【不明点】 (エラーメッセージがあればコピペ推奨)

http://www26.atwiki.jp/easybotter_wiki/pages/26.html#id_2f2f4d4a
こちらを見て、単語拾いを導入しましたら成功しました。
この場合、リプライを送ると、リプライを返す。
という挙動と認識しています。

自分がやりたいのは、ある一定のTLツイートの中からランダムに名詞を拾い、拾った名詞を使って、通常ツイートさせる方法が可能かどうか。
出来るのならばどこを改編したらいいのかを知りたく、質問をさせていただきます。

//■■ここから名詞拾い■■
if(strpos($text,"{ran_meishi}") !== FALSE && !empty($reply)){
//アプリケーションID
$apiKey = "***********************";
$apitweet = preg_replace("@\.?\@[a-zA-Z0-9-_]+\s@u","",$reply->text);
$apiurl = "http://jlp.yahooapis.jp/MAService/V1/parse?appid=".$apiKey."&filter=9&sentence=".$apitweet;
$apirss = file_get_contents($apiurl);
$apixml = simplexml_load_string($apirss);
//配列「meishi」を作る
$meishi = array();
// 特定の単語、指定字数以下の名詞を弾きながら配列に名詞を追加
foreach($apixml->ma_result->word_list->word as $apiitem)
{
//拾いたくない単語
if ((ereg("ダタラ|モスマン|モコイ", $apiitem->surface)==False) && (mb_strlen($apiitem->surface) > 3*2)){
$meishi[]=$apiitem->surface;
}
}
//リプライの中に名詞がない場合の単語をセット(複数設定可)
if ($meishi[0] == ""){$meishi = array("<censored>","×××","■■■");}
//名詞をランダムに選ぶ
$ran_meishi = $meishi[array_rand($meishi)];
//名詞を変換する
$text = ereg_replace("{ran_meishi}", "$ran_meishi", $text);
}

一応
if(strpos($text,"{ran_meishi}") !== FALSE && !empty($reply)){
の部分を
if(strpos($text,"{ran_meishi}") !== FALSE){

if(strpos($text,"{ran_meishi}") !== FALSE && !empty($timeline)){
に変えてみましたが、思うような挙動になりませんでした。

多分根本的に違うような気がします。

52名無しさん:2012/04/17(火) 07:06:31
【設置鯖名】 @pages
【PHPのバージョン】
【EasyBotterの改造】改改造している
【手動】 動く
【実行】 gae-cron
【実行間隔】 2分間隔
【不明点】
TL反応を取り入れようとしているのですが、1回の実行で、同じ人の発言で反応語句が含まれる投稿が複数あると、それら全てに反応してしまいます。
最新の投稿のみ(もしくはどれか1件)に反応させるようにするにはどうしたらいいでしょうか?

53名無しさん:2012/04/30(月) 15:08:46
【設置鯖名】 @pages
【PHPのバージョン】
【EasyBotterの改造】している(リプライパターン分け)
【手動】 動く
【実行】 gae
【実行間隔】 定期1時間、リプライ・TL3分

リプライ分けは出来たのですが、TL反応を分けることが出来ません。
過去ログにヒントがあるようなことをスレ内で見たのですが、@付きにTL反応させないか、特定IDをはじく方法しか見つけられませんでした。
TL反応をID別に分けるにはどうしたらいいですか?

54名無しさん:2012/05/08(火) 00:30:05
【設置鯖名】@pages
【PHPのバージョン】5以上
【EasyBotterの改造】改造していない
【手動】 動く
【実行】 GAE-cron
【実行間隔】 5分間隔(TLは1時間)
【不明点】
リプで送られてきた数と1〜10までの乱数を比較して、乱数より大きければ成功、そうでなければ失敗というリプを返したいんですが、働きません。
どうすればよいのでしょうか?

$data = array(
$rand_no = rand(1,10);
"数字([^\s、。!]+)"=> array(
if(preg_match("/^[0-9]+$/",$1)){
if($rand_no <= $1){
"成功",
} else{
"失敗",
}
} else{
"半角数字で入力してください",
}
),
);

55名無しさん:2012/05/08(火) 10:52:11
>>54
Easybotterの方をいじってみたらどうかな?
54のやり方で発展させる方法は自分はよく解らないや。
動作内容は違うけどいじる場所的にはここが参考になりそう。
http://www36.atpages.jp/scubot/adiary/adiary.cgi/scubot/06

56名無しさん:2012/05/13(日) 21:01:52
【設置鯖名】 @PAGES
【PHPのバージョン】5以上
【EasyBotterの改造】している
【手動】 動く
【実行】 Gae-Cron
【実行間隔】 10分
【不明点】 フォローはしてくれるけどリムーブしてくれない

 非公式wikiに紹介されていた半自動フォロー&半自動リムーブを導入しているのですが、
フォローだけはしてくれるのですが、リムーブ処理を行わせるワードを入れてリプライしても
reply_pettern.phpに記述した通りの反応は帰してくれるのですがリムーブしてくれません。EasyBotter.phpの記述は

//リプライパターンと照合
if(!empty($this->_replyPatternData[$replyPatternFile])){
foreach($this->_replyPatternData[$replyPatternFile] as $pattern => $res){
if(preg_match("@".$pattern."@u",$reply->text, $matches) === 1){
$status = $res[array_rand($res)];
for($i=1;$i <count($matches);$i++){
$p = "$".$i;
$status = str_replace($p,$matches[$i],$status);
}
break;
}
}
}
//パターンになかった場合はランダムに
if(empty($status) && !empty($replyFile)){
$status = $this->makeTweet($replyFile);
}
if(empty($status) || $status == "[[END]]"){
continue;
}
if(preg_match("@{.+?}@",$status) == 1){
$status = $this->convertText($status, $reply);
}
$reply_name = (string)$reply->user->screen_name;
$in_reply_to_status_id = (string)$reply->id;
switch(true){
//半自動フォロー
case stristr($status, "[[AUTOFOLLOW]]"):
$status = str_replace("[[AUTOFOLLOW]]","",$status);
$followreq = $this->consumer->sendRequest("http://twitter.com/friendships/create/$reply_name.json&quot;,array(),&quot;POST&quot;);
$re["status"] = "@".$reply_name." ".$status;
break;

//半自動リムーブ
case stristr($status, "[[AUTOREMOVE]]"):
$status = str_replace("[[AUTOREMOVE]]","",$status);
$removereq = $this->consumer->sendRequest("http://twitter.com/friendships/destroy/$reply_name.json&quot;,array(),&quot;POST&quot;);
$re["status"] = "@".$reply_name." ".$status;
break;

//その他
default:
$re["status"] = "@".$reply_name." ".$status;
}

という感じにしています。どうかご指導お願いいたします。

57名無しさん:2012/05/14(月) 22:15:30
【設置鯖名】 @page
【PHPのバージョン】EasyBotter2.05
【EasyBotterの改造】1時間に1回通常ポスト設定
【手動】 動く
【実行】 GAE-Cron
【実行間隔】 5分間隔
【不明点】
毎朝7時30分おはようポスト、23時30分おやすみポスト、日曜の朝6時に特定言葉ポストを実行させたいと思っています。
しかし時間になってもポストを実行しません。リプライとTL反応は問題なく動いています。
Cronもエラーになっておらず、wikiやスレ、ネットを「時間」「時間指定」等で検索したのですが数日間そこで煮詰まっております。
現時点でのbot.php内容は以下の通りです。どの箇所が違うのかご教授願います。

//7時〜23時の間に1時間に1度通常ポスト
if(date("G") >= 0 && !(date("G")<= 7) && date("i") <= 1){
//◆0時以上であり、7時以下ではない場合の毎時0分〜1分の間に実行(2分未満の範囲で遅い場合)
$response = $eb->postRandom("data.txt");
}
if(date("G") >= 0 && !(date("G")<= 7) && date("i") == 0 || date("i") == 59){
//◆0時以上であり、7時以下ではない場合の毎時59分か0分に実行(2分未満の範囲で早い場合)
$response = $eb->postRandom("data.txt");
}
//-----------------------------------

//◆ここから一文

//7時30分におはようポスト
if(date("G") == 7 && date("i") == 30){
$response = $eb->postRandom("morning.txt");
}

//日曜日の6時にポスト
elseif(date("D") == Mon && date("G") == 6 && date("i") == 0 ){ //日曜日の6時
$response = $eb->postRandom("sunday.txt");
}

//23時30分におやすみポスト
elseif(date("G") == 23 && date("i") == 30){
$response = $eb->postRandom("night.txt");
}

//◆ここまで一文

//-----------------------------------

//リプライ反応     
$response = $eb->reply(5,"reply_no.txt","reply_pattern.php");

//TL反応
$response = $eb->replyTimeline(5,"tl_pattern.php");

5857:2012/05/14(月) 22:44:03
すみません、先程まで試していたので日曜日指定の部分がMonのままで書き換え忘れておりました。
実際は
//日曜日の6時にポスト
elseif(date("D") == Sun && date("G") == 6 && date("i") == 0 ){ //日曜日の6時
$response = $eb->postRandom("sunday.txt");
}
となります。ただ、それでも本日実行されておりません。

59名無しさん:2012/05/15(火) 14:25:31
>>57
cron設定は『every 5 minutes』?
この場合は毎時5分でなく、前回のcronが終了してから5分後って意味だそうだから時間ズレで叩けてない可能性があるよ。
ログから何分に叩いてるかチェックしてみて。
date("i") == 0をdate("i") <= 4にして幅を持たせたらいいと思う。
あとは、http://www26.atwiki.jp/easybotter_wiki/pages/25.html参照。

60名無しさん:2012/05/15(火) 15:57:01
【設置鯖名】 @page
【PHPのバージョン】 http://ruzyus.blog136.fc2.com/blog-entry-44.html
【EasyBotterの改造】改造していない
【手動】 動く
【実行】 Free Web Cron Service
【実行間隔】 10分
【不明点】
http://ruzyus.blog136.fc2.com/blog-entry-44.html
上記のサイトでダウンロードした好感度機能つきのEasyBotterを使用しているものですが、
半自動フォローを導入したいのですが、
http://www26.atwiki.jp/easybotter_wiki/pages/26.html#id_a67a9959
のページの方法を参考にして改造してもスクリプトエラーが出ます。
誰かご指導お願いします。

6157:2012/05/15(火) 16:28:47
>>59さんありがとう御座います。
cron設定は定刻設定ではなく周期の欄にて5分となっています。
なるほど…そういったとらえ方になってしまうのですね。てっきり5分間隔と思い込んでいました。
それを踏まえて弄りたいと思います。
参照していただいたwikiページを再度読み直して頑張ります。ご教授頂きありがとう御座いました。

6259:2012/05/15(火) 21:18:40
>>61
通じたかもしれないけど日本語変だったからもう一度。
every 5 minutesは5分、10分、15分に作動するんじゃなくて
前回のcronが終了してから5分後に作動するので数秒ずつズレていく。
時間幅を持たせても処理中にタイムオーバーする可能性もあるので
そのページの脱初心者してから考える事はチェックしておくといいと思うよ。

6357:2012/05/15(火) 23:29:53
>>62さん、度々ありがとう御座います。お手数をおかけ致します。
今日書き込みを拝見した後、確かにそう考えるとジャスト指定では作動しないなと気付きました。
アドバイスのようにdate("i") <= 4と範囲を広げたら複数ツイートにはなりましたが、
ファイルの中身を1文のみにしてみたら(多少強引な方法?)きちんとツイートを致しました。
まだまだ改善点が多いので、スレとwikiを見つつ進めたいと思います。
幅が狭いという指摘が煮詰まりを解消出来ました。本当に感謝致します。

64名無しさん:2012/05/16(水) 17:04:50
【設置鯖名】@PAGES
【PHPのバージョン】5以上
【EasyBotterの改造】改造している
【手動】動かない
【不明点】
定期的にbotのプロフィールの現在地が変わるようにしたいと考えています。
http://hane.ciao.jp/medamayaki1/bot/memo14_iconname
http://d.hatena.ne.jp/bardothodol/20100526
上記を参考にtwitteroauth.php等を追加し、以下のlocation.phpを追加しました。

<?php
require_once("twitteroauth.php");
//略
// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
//場所変更
$req = $to->OAuthRequestImage('https://api.twitter.com/1/account/update_profile.json',&quot;POST&quot;,array('location' => '場所'));
?>

location.phpを叩くとbotの現在地が'場所'に変わるようにはなったのですが、
'場所'の部分を、「タイムラインで最近発言した人の現在地」に変えたいのです。
EasyBotter.phpで「タイムラインで最近発言した人の現在地」をランダムに取得するには
getRandomTweet()あたりをいじればいいのかと思うのですが、わからずに悩んでます。
また、もし現在地を取得できたらlocation.phpにもってくるにはどうすればいいのか、
少しだけでも教えていただけるとありがたいです。

65名無しさん:2012/05/16(水) 23:44:39
【バージョン】Ver2.04
【設置鯖名】 @PAGES
【PHPのバージョン】5.3.8
【手動】 動く
【実行】 GAE
【実行間隔】 15分
【不明点】 非公式RTを拾う方法がわかりません。
非公式wikiの方に書かれている「過去ログの〜」っていうのは、
前スレ>>763さんとか>>854さんのことだと思うんですが…
実際に弄ってみるとどこを消せばいいのかさっぱりです。

とりあえず363行目以降の
//RT, QTを除外する
$text = (string)$reply->text;
if(strpos($text,"RT") != FALSE || strpos($text,"QT") != FALSE){
continue;
}
と、 292行目以下
if(preg_match("@{.+?}@",$status) == 1){
$status = $this->convertText($status, $tweet);
}
がそれっぽいとおもってコメントアウトしてみたのですが結果はどうにもでした。
助言をいただけたらと思います…

6664:2012/05/17(木) 15:21:08
locationの件、自力で解決いたしました。
スレ消費失礼しました。

67名無しさん:2012/05/30(水) 16:42:39
【設置鯖名】 @PAGES
【PHPのバージョン】 5.3.10
【EasyBotterの改造】改造している
【手動】 動く
【実行】 GAE
【不明点】
1日に、これだけお気に入りに登録しましたよ!というのを表示したいのですが、うまくいきません

//特殊ポスト(特殊定期)
function postToku(){
$kurl = "http://twitter.com/statuses/user_timeline.xml?id=********&quot;;
$krss = simplexml_load_file($kurl);
$file1 = "hozon.txt";
//$fo1 = fopen($file1, 'w') or die("can't open file");

$sfv = $krss->status->user->favourites_count;
$fvstatus = file_get_contents("hozon.txt");
$fv = $sfv - $fvstatus;
//$kakikomi = $sfv;
//fwrite($fo1, $kakikomi);
//fclose($fo1);
$status = "今日は、『".$fvstatus."回』お気に入りに登録しました";

$response = $this->setUpdate(array("status" => $status));
return $this->showResult($response);
}

みたいな感じにしており
$sfvが現在のお気に入り数
$fvstatusが、昨日のお気に入り数

昨日の数をテキストデータから拾得し、減算するという感じなのですが
何故か減算する時に、そのデータが整数の"0"として計算されてしまいます
(つまり、出力は現在のお気に入り数になってしまう)
個別で、データ拾得、そのまま出力の場合はちゃんと数値を返してくれるのですが
そこに +10でも何か演算をさせると、"0"とみなされてしまいます・・・

テキストデータから出力がいけないのかと思い、いろいろ出力方法を調べて試してみたのですが
どれも結果は同じになってしまいました
現状、今の知識では手詰まりの状態です
何か少しでも良いのでご教授して頂けると嬉しいです

68名無しさん:2012/05/30(水) 22:05:53
【設置鯖名】@PAGES
【PHPのバージョン】5以上
【EasyBotterの改造】改造あり
【手動】動かない
【実行】GAE
【不明点】
マルコフ連鎖forEasyBotter(https://github.com/wktk/markov4eb)を使わせていただいてます。
マルコフ連鎖に使うツイートをTwitterの検索結果から取得したくて、エンドポイントの指定に
http://search.twitter.com/search.json?q=検索キーワード
と入れてみたのですが、bot.phpをたたくと以下のエラーが出てしまいます。

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Start tag expected, '<' not found in /略/EasyBotter.php on line 957
Warning: simplexml_load_string() [function.simplexml-load-string]: {"completed_in":0.018,"max_id":略,"max_id_str":"略 in /略/EasyBotter.php on line 957
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /略/EasyBotter.php on line 957
Warning: Invalid argument supplied for foreach() in /略/EasyBotter.php on line 542
EasyMarkov (Tweet) > 連鎖に使用できるツイートが TL にありませんでした。

EasyBotter.php内
function _getData($url){
$response = $this->consumer->sendRequest($url,array(),"GET");
$response = simplexml_load_string($response->getBody()); //←957
return $response;
}

Twitterの検索からツイートを読み込む方法がわからず行き詰ってしまいました。
分かる方いましたら少しでも助言を頂けないでしょうか。

69名無しさん:2012/06/11(月) 06:42:24
特定のIDをはじくこととID別にリプライパターンを設定することには成功しましたが
特定のクライアントには反応させないようにすることは出来ますか?
最近twittbotで定期を流す人が増えていて、IDや単語を弾くだけでは追いつかなくなってきたので…
方法をご存じの方がいましたら教えてください

70名無しさん:2012/06/12(火) 09:08:57
68さんと同じマルコフ連鎖 markov4(旧ver)を半年ぐらい前から使っております。
先日、markov4eb(新ver)に切り替えたのですが「連鎖に使用できるツイートが TL にありませんでした」と表示されてしまいます。
旧verでは問題なく上手く呟けていました。
もし何か心当たりがありましたら、ぜひ教えて下さい。

71名無しさん:2012/09/18(火) 22:07:02
>>70
@wktk の fav ったツイートから最新 30 件を読み込む
http://api.twitter.com/1/favorites.xml?count=30&amp;screen_name=wktk
だと動くけど、
@wktk の最新 30 件のツイート
http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=wktk&amp;count=30
@wktk のリスト「my-accounts」から最新 30 件
リスト名に全角文字や記号などが入っているとうまくいかないかも知れません
http://api.twitter.com/1/lists/statuses.xml?owner_screen_name=wktk&amp;slug=my-accounts&amp;per_page=30
だと動かないね。

7271:2012/09/19(水) 14:40:16
>>71を訂正する。
試したところ問題なく動いた。

73名無しさん:2012/09/25(火) 20:04:30
いろんなサイト見たりいろいろ試してみたけど
プロフィールのアイコンが変更できねぇ・・・

74名無しさん:2012/09/27(木) 02:12:50
>>73
できないサーバーもあるらしい
http://jbbs.livedoor.jp/bbs/read.cgi/internet/6629/1259689986/841-845

75名無しさん:2012/09/30(日) 18:57:54
【設置鯖名】 @page
【PHPのバージョン】5
【EasyBotterの改造】改造している
【手動】 動く
【実行】 GAE-Cron
【実行間隔】 3分間隔
【不明点】 指定時間外のtxtからポストされる

朝7時30分におはようツイート、夜0時30分におやすみツイート。
1時から7時まではツイート停止、それ以外の時間は毎時30分にランダムポスト。

require_once("EasyBotter.php");
$eb = new EasyBotter();
$minute = date("i");
$hour = date("G");
if($hour == 7 && $minute == 30 || $minute == 31){
$response = $eb->postRandom("0730.txt");
} else if($hour == 7 && $minute == 29 || $minute == 30){
$response = $eb->postRandom("0730.txt");
} else if($hour == 0 && $minute == 30 || $minute == 31){
$response = $eb->postRandom("0030.txt");
} else if($hour == 0 && $minute == 29 || $minute == 30){
$response = $eb->postRandom("0030.txt");
} else if($hour >= 1 && $hour <= 7){
$response = $eb->postRandom("");
} else if($minute == 30 || $minute == 31){
$response = $eb->postRandom("data.txt");
} else if($minute == 29 || $minute == 30){
$response = $eb->postRandom("data.txt");
}
$response = $eb->reply(3,"redata.txt","reply_pattern.php");
$response = $eb->replyTimeline(3,"tl_pattern.php");
?>

時間ちょうど(毎時0分)にツイートするbotと対になっていて、30分ごとに交互に発言させたくてこのようにしてみました。
どうにかしたいのは、夜間のツイートを止めたくて設定した1時から7時台に、0030.txtからのポストが発生すること。
(1時間ごと毎時30分にしたりしなかったり)
それ以外の時間帯のポストに、0730.txtとdate.txtが混じることです。
(ちゃんと1時間ごと毎時30分にランダムにどちらかからポストされます)
7時30分と0時30分の定時ポストは普通に発言しています。
指定しているtxt以外からポストされるのが意味がわかりません。
そもそも停止させたい1時から7時の設定部分には、毎時30分の設定を入れていません。
にもかかわらず、ちゃんと29分から31分の間にポストが入ります。
昨日今日手をつけたばかりの素人が背伸びしすぎだというのは自覚しているのですが、打開策のヒントだけでもいただけたら嬉しいです。

76名無しさん:2012/10/01(月) 00:33:52
29分から31分の間に1回ポストさせたい…ということなら非公式wikiで時間分けマスターになる為にのif文の複雑化をみて
まず最初に if($minute >= 29 && $minute <= 31){ とか if($minute > 28 && $minute < 32){ でくくって
その下にif文を入れ込んで 何時にはこの処理…と書いていったほうがミスが少ないと思う

if(条件1に 29分から31分){
if( 0時だったら ){
処理1a;
} else if( 7時だったら ){
処理1b;
}
}

こういうイメージ

7775:2012/10/01(月) 18:41:25
>>76
ありがとうございます! 目から鱗がぼろぼろ落ちました!
ああ、そうか…そうじゃん;
何か一箇所だけ見て「そうでなくてはならない」みたいな頑なな思考になっていたようです;
おかげさまでスクリプトもすっきりしました。
さっき18時半の分が無事にポストされたので、このまま様子を見ようと思います。
本当にありがとうございました。

78名無しさん:2012/10/09(火) 19:53:18
お願いします。

【バージョン】 Ver.2.05
【設置鯖名】 @PAGES
【PHPのバージョン】5.3.3
【EasyBotterの改造】改造している
【手動】 動く
【実行】 GAE-Cron
【実行間隔】 5分間隔
【不明点】定期ポストを二重投稿してしまう

二時間ごとの16分〜20分頃に一回、定期ポストをするよう設定しました。
16分〜20分と幅を持たせたのは、cronが5分間隔で、なおかつ少しずつズレていっているためです。
また、朝・昼・夕・夜・寝ている時間帯、でポストの内容を分けています。

bot.phpの記述は以下のようにしました。

<?php
require_once("EasyBotter.php");
$eb = new EasyBotter();

if(date("i") > 15 && date("i") < 21){
if(date("G") == 7){
$response = $eb->postRandom("morning.txt");
} else if(date("G") == 9 || date("G") == 11 || date("G") == 13 || date("G") == 15){
$response = $eb->postRandom("noon.txt");
} else if(date("G") == 17 ){
$response = $eb->postRandom("evening.txt");
} else if(date("G") == 19 || date("G") == 21 || date("G") == 23){
$response = $eb->postRandom("night.txt");
} else if(date("G") == 1 || date("G") == 3 || date("G") == 5){
$response = $eb->postRandom("sleep.txt");
}
}

$response = $eb->reply(5,"data.txt","reply_pattern.php");

$response = $eb->autoFollow();

?>

なのですが、この状態だと、時間が来ると
1分〜3分くらいの差で2回続けて投稿をしてしまいます。

wikiや過去スレなどを見て、以下を試してみましたが
治りませんでした。
 ・twitterが重いのでしばらく待つ
 ・とりあえずcronの間隔を長めにとってみる
 ・一旦サーバーに上げたものを削除して上げなおし、cronの設定もやりなおす

やはりphpの記述が間違っているのかと思い、悩んでみましたが
どこが間違っているのか自分では分かりません。

よろしければお力を貸してください。

79名無しさん:2012/10/12(金) 17:56:46
>>78です。

その後、何度か上げ直し&様子見を繰り返していたところ、
なぜか突然、二重投稿しなくなりました!
原因は不明なので、皆様のお役に立てないのが申し訳ないですが
そういう事例もあるということで…。
ありがとうございました。

87名無しさん:2012/10/28(日) 14:55:04
【設置鯖名】 @pages
【PHPのバージョン】5.X
【EasyBotterの改造】改造している
【手動】 完全には動かない
【実行】 GAE-CRON
【実行間隔】 3分間隔
【不明点】
ツイッターの規約が変わったので、規約に沿った書き換えをEasyBotter.phpに施し、
非公式wikiにある「特定のリプライをもらった時にのみフォローorリムーブを返す」も書き換え、
対応したのですが、何故かbot.phpで指定してないはずの「自動リプライ返し」が作動し
「特定のリプライをもらった時にのみフォローorリプライを返す」は、
フォローは返しますが、フォローに対して返信リプは無反応。
リムーブは非常に不安定で20回に1回反応する(リプライなし)位になりました。

現在は、自動リプライ返しの所は、bot.php、EasyBotter.php共にコメントアウトして
作動しないようにしてますが、「特定のリプライをもらった時にのみフォローorリムーブを返す」部分が
動かない(エラーコードも吐き出さず真っ白)為途方にくれております。

■■EasyBotter.php変更部分■■
$reply_name = (string)$reply->user->screen_name;
$in_reply_to_status_id = (string)$reply->id;
//$re["status"] = "@".$reply_name." ".$status; 元の記述
//下から追加121027
switch(true){
//半自動フォロー
case stristr($status, "[[AUTOFOLLOW]]"):
$status = str_replace("[[AUTOFOLLOW]]","",$status);
$followreq = $this->consumer->sendRequest("http://api.twitter.com/1/friendships/create.json&quot;,array(&quot;screen_name&quot; => "$reply_name"),"POST");
$re["status"] = "@".$reply_name." ".$status;
break;

//半自動リムーブ
case stristr($status, "[[AUTOREMOVE]]"):
$status = str_replace("[[AUTOREMOVE]]","",$status);
$removereq = $this->consumer->sendRequest("http://api.twitter.com/1/friendships/destroy.json&quot;,array(&quot;screen_name&quot; => "$reply_name"),"POST");
$re["status"] = "@".$reply_name." ".$status;
break;

//その他
default:
$re["status"] = "@".$reply_name." ".$status;
}
//ここまで追加

※基本的なAPIを叩くは全アドレスを変更済み。
※その他、「自動フォロー返し」の部分を全てコメントアウト。

■■bot.phpのリクエスト指定部分■■
if(date("i") % 15 == 0){$response = $eb->postRandom("data.txt");}
$response = $eb->reply(3,"tw02.txt","reply_pattern.php");

※自動フォロー返しはコメントアウト。

以上です、宜しくご指導お願いいたします。

8887:2012/10/30(火) 05:45:30
【設置鯖名】 @pages
【PHPのバージョン】5.X
【EasyBotterの改造】改造している
【手動】 動く
【実行】 GAE-CRON
【実行間隔】 3分間隔
【不明点】
上記の自動フォローと自動リムーブは、phaさんが新たに更新してくださった
新バージョンで解決しましたありがとうございました。

その後、自動フォローと、自動リムーブは上手くいったのですが、
再度、同じテストアカウントから、自動フォローをbot宛にツイートしても無反応。
通常リプライも帰ってこず。
一度WEBから先にbotをフォローして、自動フォローをテストアカウントからツイートしても無反応。

自動リムーブした後は、ブロックの様な状態で、リプライも何もできなくなるのでしょうか?

89バーバリー t シャツ:2012/11/03(土) 07:34:51
はじめまして。突然のコメント。失礼しました。
バーバリー t シャツ http://burberry.suppa.jp/

90バーバリー コート:2012/11/03(土) 08:14:18
カッコいい!興味をそそりますね(^m^)
バーバリー コート http://burberry.suppa.jp/

91名無しさん:2012/11/08(木) 18:19:46
>>88-89
そりゃ、EasyBotter2.1.1にしたのならば、
改造のソースもAPI1.1に対応すべく書き換えなければ動かないよね。

・URLがAPI1のままだからAPI1.1に書き換える。
・EasyBotter.phpのVer2.04での $reply_name は、Ver2.1.1では何に変わってるか落ち着いて見比べる。

92??? ??? ???:2012/11/16(金) 06:26:20
??????????????????????????????????????????!
??? ??? ??? http://www.guccifactorystore.com/%E3%82%B0%E3%83%83%E3%83%81-%E3%83%90%E3%83%83%E3%82%B0-%E3%82%B0%E3%83%83%E3%83%81-%E3%83%A1%E3%83%B3%E3%82%BA-%E3%83%90%E3%83%83%E3%82%B0-c-32_22.html

93名無しさん:2012/11/22(木) 00:00:43
EasyBotterの改造だと該当スレはこちらでよろしいでしょうか……
【バージョン】EasyBotter2.1.1
【設置鯖名】@page
【PHPのバージョン】5.2
【実行】手動
【手動】 動く
【不明点など】
bot同士の会話をさせたくて、非公式wikiを見ながら、
特定のアカウントに対しては、別のリプライパターンを読み込ませたい〜の改造をしているのですが
どうしてもbot用のファイルでなく、通常用のファイルからリプライを返してしまいます
bot用のphpファイル自体は、通常のリプライ用ファイルとして
手動でテストするときちんと単語に反応できてたのでそちらは間違えてないと思います
wikiの通りに下の二つを足して、○○の部分を書き換えるだけでいいんですよね…?
バージョン違いやAPIの違いでまだ変更する部分があるのならご教授願いたいです

$org_repfile = $replyPatternFile; //デフォルトのファイル名を保管

//■■特定の人には別パターン■■
$userName = (string)$reply->user->screen_name;
switch(true){
case stristr($userName, "○○bot")://botと名のつくアカウント名に対して
$replyPatternFile = "○○.php";//bot_pattern.phpを適用する
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
break;
case $userName == "abcd"://abcdというアカウント名に対して
case $userName == "efgh"://efghというアカウント名に対して
$replyPatternFile = "xxx_pattern.php";//xxx_pattern.phpを適用する
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
break;
default://それ以外
$replyPatternFile = $org_repfile; //デフォルトのパターンファイル名

94名無しさん:2012/11/22(木) 06:02:03
>>93
「スレ立てるほどじゃない〜」スレのの886から見てみれば参考になるんじゃない

95名無しさん:2012/11/22(木) 06:42:29
>>93
追記する行(複数行)の中の
$userName = (string)$reply->user->screen_name;

$userName = (string)$reply["user"]["screen_name"];
にしてみてください

バージョン2.1からこの形に切り替わっているようです
非公式wikiの該当ページ一番下、コメント欄に書き込んでくれた人があり
少なくとも当方ではこれで正常に動いています

96名無しさん:2012/11/22(木) 16:34:55
>>94>>95
すみません全部確認したはずがまだ見落としがあったようです…!
>>95さんの通りに書き換えたら無事に動きました、ありがとうございます!

97名無しさん:2012/11/25(日) 17:16:56
誘導されたのでこちらに…(だいぶ遅く)

【バージョン】 Ver.2.1べーた
【設置鯖名】 @pages
【PHPのバージョン】
【手動】 動かない
【実行】 setcronjob
【実行間隔】 30分間隔
【不明点】
マルコフ連鎖botにしようと思い設定したのですが

EasyMarkov (Tweet) > 連鎖に使用できるツイートが TL にありませんでした

と出てpostできない状態です

IDやエンドポイントもオッケーなのになぜかエラー出ちゃってググってもわからない状態です
分かる方どうかお願いします

98名無しさん:2012/11/26(月) 02:30:40
>>97
TwitterBotPHP質問スレに同じようなのが出てるんだけど、
870さんは2.1βで動いてたってあるね。
870さんと同じの使ってると思うけど対処法はそこのスレの871と872のとおり、
他にも書き換えが必要

99名無しさん:2012/11/26(月) 20:48:11
>>98
スレを見てやってみたのですが
まだ連鎖に使用できるryと出てお手上げ状態です
["user"]の他にも
["screen_name"]["text"]["in_reply_to_status_id_str"]["footer"]も書き換えたんですが謎です…



どうしたらいいんでしょうか\(^o^)/

100名無しさん:2012/12/09(日) 17:52:05

以下のスプリクトを追加したのですが自動リムーブが実行されません。何が原因でしょうか?

// 片思い自動リムーブ
function autoRemove() {
//フォロワーのidを全取得
$response = $this->getfollowerids();
$followList = array();
foreach($response as $id){$followList[] = $id;}

//フォローのidを全取得
$response = $this->getfriendsids();
$friendsList = array();
foreach($response as $id){$friendsList[] = $id;}

//片想いの人を$removeへ
$remove = array_diff($friendsList, $followList);
$remove_count = "0"; //おまじない

if ( !empty($remove) ) {
foreach($remove as $id){
$remove_count++;
//リムーブします。
$removereq = $this->consumer
->sendRequest("http://twitter.com/friendships/destroy/$id.json&quot;,array(),&quot;POST&quot;);
}
}
echo $remove_count."人をリムーブしました。";
}

function getfollowerids() {
$url = "http://api.twitter.com/1/followers/ids/[TwitterのID].xml";
return $this->_getData($url);
}

function getfriendsids() {
$url = "http://api.twitter.com/1/friends/ids/[TwitterのID].xml";
return $this->_getData($url);
}

101名無しさん:2012/12/09(日) 20:57:00
【設置鯖名】 @pages
【EasyBotterの改造】改造していない?
【手動】 動かない
【不明点】以下のスクリプトにどこか間違いがあるようなのですが、どこが違うのでしょうか?

<?php
//=============================
//EasyBotterを呼び出します
//=============================
require_once("EasyBotter.php");
$eb = new EasyBotter();

//=============================
//botの動作をこの下に記述していきます。
//PHPでは先頭に//がある行はコメント扱いなので実行しません。実行したい行の先頭の//を削除してください。
//=============================
//$response = $eb->autoFollow();
//$response = $eb->postRandom("data.txt");
//$response = $eb->postRotation("data.txt","おわり");
if(date("n") == 2 && date("j") == 14){
$response = $eb->reply(2,"Valentine_data.php","Valentine_pattern.php");
}else{
$response = $eb->reply(1,"data.php","reply_pattern.php");
//$response = $eb->replyTimeline(2,"reply_pattern.php");


/*
//===================================================
//EasyBotter 簡易マニュアル
//===================================================
////ここから下は作者による解説です。
////cronなどでこのbot.phpを実行するわけですが、動作の指定の仕方はこんな感じです。

//用意したデータをランダムにポストしたい
$response = $eb->postRandom("データを書き込んだファイル名");

//用意したデータを順番にポストしたい
$response = $eb->postRotation("データを書き込んだファイル名");

//@で話しかけられたときにリプライしたい
$response = $eb->reply(cronで実行する間隔(単位:分), "データを書き込んだファイル名", "パターン反応を書き込んだファイル名");

//タイムラインの単語に反応してリプライしたい
$response = $eb->replyTimeline(cronで実行する間隔(単位:分),"パターン反応を書き込んだファイル名");

//自動でフォロー返ししたい
$response = $eb->autoFollow();


//===================================================
//// cronを実行するたびに毎回実行するのではなく、
//// 実行する頻度を変えたい場合の例は以下のとおりです。
//// PHPのdata()の応用の仕方は以下のURLを参照ください。
//// http://php.net/manual/ja/function.date.php

//bot.phpを実行したときに毎回実行される
$response = $eb->postRandom("data.txt");

//bot.phpを実行したときに、5回に1回ランダムに実行される
if(rand(0,4) == 0){
$response = $eb->postRandom("data.txt");
}

//bot.phpを実行したときに、0分、15分、30分、45分だったら実行される
if(date("i") % 15 == 0){
$response = $eb->postRandom("data.txt");
}

//bot.phpを実行したときに、午前だったらgozen.txtのデータを、午後だったらgogo.txtのデータを使う
if(date("G") < 12){
$response = $eb->postRandom("gozen.txt");
}else{
$response = $eb->postRandom("gogo.txt");
}

//bot.phpを実行したときに、2月14日のみvalentine.txtのデータを、それ以外はdata.txtのデータを使う
if(date("n") == 2 && date("j") == 14){
$response = $eb->postRandom("valentine.txt");
}else{
$response = $eb->postRandom("data.txt");
}

//準備したテキストを順番にポストしていって、準備した中から「めでたしめでたし」が投稿されたらbotの投稿をそこで止める
$response = $eb->postRotation("data.txt","めでたしめでたし");
*/

?>

102名無しさん:2012/12/09(日) 22:26:22
>>101
初心者スレとのマルチ?

>>100
そもそもツイッターで自動リムーブはルール違反
↓ヘルプから、自動化に関するルールと留意点
https://support.twitter.com/groups/33-report-a-violation/topics/121-guidelines-best-practices/articles/237504-#

ていうのを踏まえたうえで、sendRequestのURLはAPIのバージョンがないやつだからもう使えないはず

103名無しさん:2012/12/10(月) 02:46:16
今まで[[TLH]]を使って色々呟かせていたのですが、Ver2.1.1に変更してから使えなくなってしまいました。
色々調べながら置き換え等もしてみたのですが失敗してしまいます。
Ver2.1.1でも[[TLH]]を使えるようにしたいのですが、Ver2.1.1でも使えたよって方がいましたら教えていただけないでしょうか?
よろしくお願いします。

104名無しさん:2012/12/11(火) 17:08:49
やはり自動リムーブは駄目なのですね。
一応APIのバージョンを載せて再試行してみましたがリムーブは機能しませんでした。

105名無しさん:2012/12/11(火) 20:24:13
>>103
2.1.1にバージョンアップ済みで、ちょうど[[TLH]]の設定も仕込んであるので試してみました。
こちらでは正常に動きますね。
(今のところ日常に使用していない機能なので、恒常的に大丈夫かはわかりませんが)
バージョンアップの時書き換えたのはEasyBotter.phpとPEARだけです。

106名無しさん:2012/12/12(水) 00:59:25
非公式wikiのものであれば使えないかと…
正しく言えば機能はするんですがlog.datの仕様が変わったので
TL発言をした後二重リプライするようになってしまいますね・・。

107名無しさん:2012/12/12(水) 14:12:44
105ですが、106さんの書き込みを見て、EasyBotter.phpの該当箇所を見直してみたら
wikiのままではなく、少しいじってありました
誤解を招く書き方で失礼しました
多分、バージョンアップ時にもとのファイルの記述が変わっていたので
それに合わせて改造内容も自分で書き換えたんだったと思います


・もとの記述(バージョンアップ前)
 $re["status"] = "@".$reply_name." ".$status;
 ↓
・もとの記述(バージョンアップ後)
 $re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
 ↓

・書き換え(wikiの記述を修正したもの)
switch(true){
//リプライ反応をTLに発言
case stristr($status, "[[TLH]]"):
$status = str_replace("[[TLH]]","",$status);
$re["status"] = $status;
$rpid = (string)$reply->id;
file_put_contents($this->_logDataFile,$rpid);
break;
//その他
default:
$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
}


うちの場合、この記述で今のところ手動・Cronとも正常に動き、二重リプライもしていません
ご参考になればいいのですが

108名無しさん:2012/12/15(土) 19:12:55
【設置鯖名】 ロリポップ
【PHPのバージョン】5.2
【EasyBotterの改造】改造している
【手動】 動く
【実行】 CRON ロリポップ!/テスト中は手動
【実行間隔】 5分間隔(CRON等で定期的に実行している場合)
【不明点】
http://twbot.blogspot.jp/2010/08/http-setnickname.html
こちらのニックネーム機能を追加しようと思っています。
PHPの追加や、ファイルの設定を行い、試しに別のtwitterアカウントから
「◯◯」って呼んで
とリプした所、エラーが発生します。エラー内容は下記です。

Warning: file_get_contents(http://〜/test/get_nickname.php?screen_name=&user_name=) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 401 Authorization Required
in /home/〜/test/EasyBotter.php on line 459

直接get_nickname.php、set_nickname.phpのアドレスを叩くと、
うまく動作しているのは確認できるのですが、
easybotter本体からのリクエストが上手く行ってないような感じです。

htaccessでディレクトリにベーシック認証を設定しているので、
設定するURLのところをhttp://ID:PASS@〜にもしてみましたが、
結果は変わらずでした。

何か解決方法があれば、是非宜しくお願い致します。

109名無しさん:2012/12/18(火) 00:40:35
[[TLH]]は元のwikiの修正箇所も間違ってるからそのままの場所を弄ったんじゃ、正常には動作しない
>107さんのも修正箇所が違う…
TL反応に関する改造だからTL反応に関する場所を弄らなければ正常に動作しない
TL反応に関する場所をwikiの要領で2.1.1に対応させて書き換えれば二重リプもせず正常に動作するよ

110109:2012/12/18(火) 01:12:03
TLに流れて来た語句に対して空リプしたいのかと勘違いした…スマソ
リプライに対して空リプしたいのなら
>107さんの方法で行けると思う

111名無しさん:2012/12/26(水) 15:23:33
【設置鯖名】 ロリポップ
【PHPのバージョン】2.1.1
【EasyBotterの改造】改造していない
【手動】 動く
【実行】 cron→ロリポップ
【実行間隔】 5分間隔
【不明点】
現在ランダムポストで問題なくツイートは出来ている状態です。
そこから、例えば「雨が降ってきた」という発言が選ばれたら
次に呟く台詞を「すぐにやんだ」or「土砂降りになった」というようにさせたいのですが可能でしょうか?

自分で考えてみた限りでは、
$response = $eb->postRotation("データを書き込んだファイル名");
の「データを書き込んだファイル名」の部分をxxx(変数).txtにして
話題ごとにtxtを用意すれば良いのではと思ったのですが、
その変数をどうやって入れれば良いかわかりません。

あと、この方法では雨が降ってきたの次の台詞をランダムに出来ないのと、
結局の所毎時間読み込むtxtが変わって続きの発言が出ないのではという疑問があります。
説明が下手で申し訳ないですが、何か良い方法はありますでしょうか。

112名無しさん:2012/12/26(水) 17:54:55
http://xvideos697.blog.fc2.com/

113名無しさん:2012/12/29(土) 13:48:26
【設置鯖名】 ロリポップ
【PHPのバージョン】2.1.1
【EasyBotterの改造】改造している((Array)しろっていうWarningを潰した)
【手動】 動く
【実行】 手動
【不明点】
下記の様に、1回の実行でリプライからとタイムラインからの両方の返信をしたいと思っています。
-----------------------------------------------------------
$response = $eb->autoFollow();
$response = $eb->reply(2,"data.txt","reply_pattern.php");
$response = $eb->replyTimeline(2,"reply_pattern.php");
-----------------------------------------------------------
しかし、後続の処理が正しく動かないことがあります。
例えば、リプライからの返信対象があって返信した場合に、その後のタイムラインからの返信が正しく動きません。
具体的には、最初にgetFriendsTimelineした時に結果が返って来ず、「〜未反応のキーワードはないみたいです。」と表示されます。
あるはずなのに…。その証拠として、この時にリロードして、
リプライの対象がなく、タイムラインの対象があれば、タイムラインからの返信が正しく動作します。

すべてを同時に処理できない状態で、実質単体でしか動かせません。
原因がわからず…みなさんはこのような現象になっていますか?

114名無しさん:2012/12/29(土) 21:34:26
>>113
初心者スレで多く出てた現象だと思う
初心者質問スレの>>473さんが修正方法と箇所を書いてくれてるのでそこから見るといいよ

115名無しさん:2012/12/30(日) 03:49:28
>>114
そういうことだったのですね…。
また、スレをちゃんと探さないで書いてしまって申し訳ないです。

該当箇所を修正したところ、想定通りの動きをしました。
ありがとうございました!

116名無しさん:2012/12/30(日) 11:27:01
【設置鯖名】 ロリポップ
【PHPのバージョン】5.2
【EasyBotterの改造】改造している(特定IDへのリプライパターン変更、[[TLH]])
【手動】 動く
【実行】 cron
【不明点】
>>107さんのを参考に、リプライに対するTL発言を出来るにしました。
そして>>109さんの仰る通り、TL発言に対して空リプをするには色々変更しないと
いけないと思うのですが方法がわかりません。

現在、//タイムラインへの反応を作る の項目の
//リプライ相手、リプライ元を付与 の部分を同じように変更してみましたが
反応はしませんでした。
宜しければTL反応でのTLHの方法について教えて貰えないでしょうか。

117名無しさん:2013/01/14(月) 16:59:58
特にどの書き込みへのレスでもありませんが
1/9付けで作者phaさんが、バージョン2.1.2を公開されています
リプライ関係の不具合などが修正されているそうです
まだこの掲示板ではあまり話題になってないみたいなので、お節介ながら書き込んでおきます

(現状でわりと動きのあるスレに書き込んでいます、重複になりますがご容赦ください。
チェックはしていますが、他の方が既に書いていたらすみません)

118名無しさん:2013/02/05(火) 17:49:05
【設置鯖名】ロリポップ
【PHPのバージョン】5以上
【EasyBotterの改造】改造していない
【手動】動く
【実行間隔】5分間隔(CRON等で定期的に実行している場合)
【不明点】

$response = $eb->autoFollow();
$response = $eb->replyTimeline(5,"tl_reply_pattern.php");
if(date("i") == "0"){
$response = $eb->postRandom("data.txt");
}
//$response = $eb->postRandom("data.txt");
//$response = $eb->postRotation("data.txt");
$response = $eb->reply(5,"rep_data.txt","reply_pattern.php");

現在、30分間隔のランダムポスト、5分おきのTL反応、リプライ反応をさせているのですが、
リプライ反応で、特定の単語に特定の反応、パターンにない場合にrep_data.txtから反応
というのはいいのですが、そこに加えてリプライで特定の単語を受けた時に
data.txtからランダムに表示させるというのには改造が必要でしょうか。

例えば「問題」という言葉を含むリプライを受け取った時にだけ、
data.txtからランダムに発言する。といった内容です。

reply_pattern.phpファイル内の$data = arrayの中でファイル名を指定すれば、
と思って試そうとしているのですが、どうすればいいかわかりません。
初心者な質問かもしれませんが、お答え頂ければ幸いです。

119名無しさん:2013/02/05(火) 19:14:04
>>118
reply_pattern.phpで一番上に「問題」を設定してランダムにしたいレスをつらつら書けばいいような 内容がとんでもなく多いのかな
data.txtでやるなら特定アカウントは別のリプライパターン、のようにEasyBotter.phpの改造になると思う

120118:2013/02/05(火) 21:47:34
>>119
そうなんです。元々のdata.txtの量がかなり多いのと、それも更新していくのでその度に追加するのが厳しいかなと。
それにreply_pattern.phpの中に書くとランダムにならないと思うのですが、それはランダムにする方法があるのでしょうか?
できればdata.txtとは別ファイルでもいいので、なんとかテキストファイルから呼び出せればいいのですが、
やはり、EasyBotter.phpの改造しかなさそうでしょうか。

121118:2013/02/05(火) 21:51:46
>>119
すみません、ランダムにする方法は、data.phpと同じで
$data = array(
"いろはにほへと ちりぬるを",
"わかよたれそ つねならむ",
"うゐのおくやま けふこえて",
"あさきゆめみし ゑひもせす",
"ん",
);
のようにすればいいということですよね?
ただやはり量的な問題とdata.txtとの互換性というか、
更新内容違いがないようにしたいので、できればファイル呼び出しできれば一番と考えています。
reply_pattern.php内に書く方法と合わせていろいろと検討してみたいと思います。
ありがとうございます。

122119:2013/02/07(木) 04:22:24
>>118
reply_patter.phpの例だと
$data = array(
"問題"=> array(
"レス1",
"レス2",
"レス3",
),
);
これで「問題」という言葉を含むリプライを受け取った時レス1から3がランダムに でも量が多いとメンテがきびしいし重複はスマートじゃないのもわかるから、
別ファイル参照する場合はwikiなど参考に改造も視野に入れてみてください

123名無しさん:2013/02/08(金) 07:33:39
【設置鯖名】 ロリポップ
【PHPのバージョン】5.2
【EasyBotterの改造】改造している(自分の通常ポスト最新200件を覚えて同じものを投稿しない)
【手動】 動く
【実行】 cron
【不明点】

TL上に流れてきた単語に、リプではなくTL発言で反応させたいので
ぐぐって拾ってきた以下のものをeasybotter.php内に書き加えました。

//TL反応をTLに発言
switch(true){
case stristr($status, "[[TLTL]]"):
$status = str_replace("[[TLTL]]","",$status);
$rep["status"] = $status;
$tltlid = (string)$tweet["id_str"];
file_put_contents($this->_logDataFile,$tltlid);
break;
//その他
default:
$rep["status"] = "@".$tweet["user"]["screen_name"]." ".$status;
}

すると、単語に反応しての通常ポストはするものの
log.datの中身がどうもおかしくなってしまい投稿を重複してしまいます。
あれこれ調べた末、上記の記述が
・twitterのAPI変更に対応していない
・easybotter本家のlog.datの仕様変更に対応していない
のではないかと判断したため、

$tltlid = (string)$tweet["id_str"];
file_put_contents($this->_logDataFile,$tltlid);


$tltlid = (string)$tweet["in_reply_to_status_id_str"];
file_put_contents($this->_latestReplyTimeline,$tltlid);

のように書き換えました。
しかし、上記の記述にしたところlog.datは更新されるものの
うまく拾ったツイートのIDが記録できていないようです…。

あれこれ考えられる手は打ったのですがお手上げです。
どなたか分かる方がいましたらお願いします。

124名無しさん:2013/02/16(土) 23:37:17
質問失礼します。
内容的には初心者だと思うのですが、改造をしているのでこちらに失礼します。

EasyBotterのバージョンは2.1.2です。
フォロー数は多くないbotなのですが、リプライが重複する事が多々あり、エラーは以下のように出ています。

PHP Warning: Cannot use a scalar value as an array in (中略) on line 79

該当する行には

$this->_log[$name] = $data;

があります。
こちらの掲示板でのスレで同じような質問を以前見ており、2.0のログだと上記のエラーが出るようなので
2.1のログで上書き(または削除してからアプロし直し)をすると暫くは2.1版で動いており問題はないのですが
一日程経つといつの間にか2.0のログに戻ってしまっており、また同じエラーになっています。

少々改造をしていますので、それが原因で2.0版に戻っているのでしょうか?
改造としては

・アカウント別(リプライ/TLリプライ)
・(リプライ/TLリプライ)に@なしで発言

・重複投稿チェック

以上の改造をしています。
アカウント別、@無し発言は2.1版を使っているのですが
重複チェックは2.0版(wiki参照)からいじっていません(ログは正常に取れていると思います)

お手すきの際で構いませんので、ご教示いただければ幸いです。

125名無しさん:2013/02/17(日) 00:15:09
>>123
ツイートのIDがうまく記録できていない
→IDが取得できてない(たぶん
→おや?書き換えたところが2箇所あるぞ・・・?

>>124
ログ周りの変数をチェックするといいかもしれません
2.0仕様に戻るということは
どこかに2.0のままログを吐き出している可能性があります

126名無しさん:2013/02/18(月) 01:41:50
125さん、回答ありがとうございます。
どうやら123さんと同じ状態だったのかもしれません。
@無しでの発言(リプライとTL)をした直後に2.0のログになっていました。

2.0と2.1の違いがまだは把握しきれていないので、ログ周りをチェックしてみます。ありがとうございます。

127名無しさん:2013/02/22(金) 23:49:16
〜引用〜
794 :名無しさん:2010/10/19(火) 22:58:30 質問失礼します。

@で来たものをRTさせたいのですが、可能でしょうか?
検索はしたものの要領を得ず…

795 :名無しさん:2010/10/19(火) 23:12:19 >>794
$re["status"] = "@".$reply_name." ".$status;
あたりを書き換えかな

796 :名無しさん:2010/10/19(火) 23:37:22 >>794
問題は>>795さんの答えで書き換えてもin_reply_to_status_idが付いてるため、公開範囲がTweenと同等になる問題。
それでもいいなら問題なし、問題ならin_reply_to_status_idを除去する。

798 :794:2010/10/20(水) 01:20:03 度々すみません。
自力でやってみようと思ったんですが、恥ずかしながらさっぱりでした…。

$re["status"] = "@".$reply_name." ".$status;

ここを、どのように変更すればいいのでしょうか?
ほんと、すみません…。

〜引用ここまで〜

この後話は続かなかったので解決方法が分かりません…。
RTする時はどうやって書き換えればいいのでしょうか。
また書き換えるのはEasybotter.phpだけですか?

128名無しさん:2013/03/02(土) 10:44:52
【設置鯖名】@pages
【PHPのバージョン】PHP Version 5.3.8
【EasyBotterの改造】改造している(特定IDには反応しない、ランダム返信時にキーワード取得)
【手動】動く
【実行間隔】3分間隔
【不明点】

123さんや124さんと似たような状況なので、こちらにて質問させてもらいます。

2.1.2バージョンへと変更したところ、タイムラインおよびリプライが時々二重投稿してしまうようになってしまいました。
cronを3分間隔で動かしていて
3分に返信、6分にもう一度同じつぶやきに返信してしまう状況です。

ログを確認しましたが
{"latest_reply":"18桁の数字","latest_reply_tl":"18桁の数字"}
という形式になっているので2.1版になっているのではと思うのですが、他に考えられそうなところはないでしょうか?

@無しでの発言(リプライとTL)などはしてません。
他、logに関連するような改造もしていません。

129名無しさん:2013/03/04(月) 01:29:49
もう解決してるかもしれないけど

>>123
最初の方が正解に近い気がする
多分file_put_contents($this->_logDataFile,$tltlid)の$tltlidを
事前に_logの形に合う配列→jsonエンコしたら動くんじゃないか

>>124
ソース無いから勘で答えるけどこれも123と似たような間違いの気がする

>>128
latest_replyとlatest_reply_tlの取り違えとか?

130名無しさん:2013/03/05(火) 21:29:36
>>123
せっかくログ取り用のファンクションがあるのでありがたく利用させていただくのが
手っ取り早くログを取れる方法かと…

$tltlid = $tweet["id_str"];
$this->saveLog("latest_reply_tl",$tltlid);

私は上記の形式で正常にログ取得できています。

131名無しさん:2013/03/10(日) 09:56:56
124(126)です。

>>129さん
ソースを出していませんでした、不手際で申し訳ありません。回答ありがとうございます。

>>130さん
123さん宛てでしたが参考にしました所、解決しましたのでお礼を言わせて戴きます、ありがとうございます。
一ヶ月近く詰んでいたので、とても助かりました…!

@無しでのTL上での発言(リプライ、TL反応共に)

 $tltlid = (string)$tweet["id_str"];
 file_put_contents($this->_logDataFile,$tltlid);
  ↓
 $tltlid = $tweet["id_str"];
 $this->saveLog("latest_reply_tl",$tltlid);

 $rpid = (string)$reply["id_str"];
 file_put_contents($this->_logDataFile,$rpid);
  ↓
 $rpid = $reply["id_str"];
 $this->saveLog("latest_reply",$rpid);

と変更しました所、どちらも正常に2.1版のログで記録してくれました。
なんだか自分でややっこしくしてしまっていた様で、皆様のお陰で無事解決いたしました。
改めてありがとうございます。

132名無しさん:2013/03/10(日) 22:12:16
>>128
全く別の改造してますが、[[TLTL]]を使うような改造してないのに二重投稿で詰んでました

このスレを見てlog.dat(サイズが0だった)の属性を666にしてみたら
log.datに記録するようになり二重投稿しなくなりました
128さんとは違う原因かもしれませんが…

133名無しさん:2013/03/15(金) 05:53:27
初心者なのですが、多少の改造をしているのでこちらに質問させて頂きます。
Ver.2.04で Warning: Invalid argument supplied for foreach() in /usr/local/www/htdocs/XXXXXXX/public_html/EasyBotter.php on line 374 とエラーが出てしまい、呟きもリプライもしなくなってしまったので2.1.2に移行しようと思うのですが、半自動フォロー・リムーブの記述の仕方がわかりません。
いろいろぐぐってみたのですが知識不足で…。
お手数をおかけして大変申し訳ありませんが、どなたかご教示下されば幸いです。どうぞ宜しくお願い致します。

134名無しさん:2013/03/15(金) 23:19:30
374行目のforeachの引数が何かおかしいよーってことしか分からんがな…。
半自動フォローとかはeasybotter wikiにもあるだろ

135sage:2013/03/17(日) 14:34:05

【設置鯖名】@pages
【PHPのバージョン】PHP Version 5.2系
【EasyBotterの改造】改造している(特定IDには反応しない、特定IDでは別のパターンを読み込む)
【手動】動く
【実行】GAE(Java)のCron
【実行間隔】5分間隔
【不明点】
3月の14日頃からリプライ周りだけ不思議な動きになっているのでご相談です。

ブラウザで直接アドレスを呼び出した場合は正常に動作するんですが、
cron経由の呼び出しのみリプライ動作をしていない状態です。
単なる自身の発言(60分間隔)、タイムライン上のキーワードへのリプライ(5分間隔)
は、いずれも同様のGAE Cronからの実行で動作をしております。

Cronを動かすアカウントを変えてみたりしても現象は改善されず、
ヒントがなくて困っています。

136名無しさん:2013/03/17(日) 23:04:40
>>135
直で正常だとすると、cronが何か上手くいってないと思います。
EasyBotterでは関係ない部分も多いですが、GAEエラーの参考になるかなと思います。知ってたらすみません。
http://onebot.wiki.fc2.com/wiki/GAE%E7%AE%A1%E7%90%86%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6?sid=cb5aab68fe6a93da3b2f6d8059cc142e

そして自分も質問です。
EasyBotter.phpのgetRandomTweetは
タイムラインの最近30件の呟きからランダムに一つを取得、とありますが
これは鍵アカのものも含んでしまうんでしょうか。

137133:2013/03/18(月) 05:28:19
>>134さま

ご回答ありがとうございます。
半自動フォロー・リムーブの記述は、2.1.2でも今まで通りで良いのでしょうか?
EasyBotter.phpの記述が大分変更されたようなので、悩んでしまったのですが…。
質問ばかりで申し訳ありません。

138名無しさん:2013/03/18(月) 11:04:16
>>137
大筋は今までどおりでいいはず。
wikiにあるの見るとURLが1.1のになってないからそれをフォローの方はfollowUserのと合わせるように修正(リムーブの方も同様の修正)
2.1.2ではwikiにある
$re["status"] = "@".$reply_name." ".$status;
じゃなくて
$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
になってるくらいか

139133:2013/03/21(木) 05:10:07
>>138さま

ご丁寧な説明、ありがとうございます。
とてもわかりやすく、助かりました。
自分でも解決出来るよう、これからまた少しずつ勉強していきたいと思います。
ありがとうございました。

140135:2013/03/21(木) 08:02:55
>>135です。
事象がひとまず解決したのでご報告。
本来ならcronスレに書くような内容ですがご容赦くださいませ。

あくまで推測ですが、GAE の「urlfetchのCache機能」が原因でした。
きっかけは
ttp://s-clair.com/relier/bot_log/gae-cron/
の方式で、リクエストヘッダーに「'Cache-Control':'max-age=0'」を
追加している記述を見てからです。
で、Google先生に「gae java urlfetch キャッシュ」で検索
→Java版でも似たような記述を発見しました。
 http://d.hatena.ne.jp/thrakt/20091228/1261972107

自分の行った変更ですが、常套手段のURL::OpenStreamの使用をやめて
HttpURLConnection::setRequestProperty→HttpURLConnection::getInputStream
という流れでphpを叩きました

○変更前
URL url = new URL("http://〜");//ここを書き変える
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));

○変更後
import java.net.HttpURLConnection;
(中略)
URL = new URL("http://〜");
connection = (HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Cache-Control", "max-age=0");
connection.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "JISAutoDetect"));
※「JISAutoDetect」は不要かもしれない……

>>136
やはりGAEが原因でした。
ただ、上記の改造を施していないアプリでも無事に動くものもあります。
実行間隔や、会話の頻度にも依存するかと思います。

141名無しさん:2013/03/29(金) 15:12:46
>>140
気になる記事を発見したので質問させていただきます。
こちらでもよく話題になる『ゆとりでも分かる〜』という記事を
使用してbotを動かしています(eclipse環境でjavaを動かしている)。

package ●●●;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import javax.servlet.http.*;
import java.net.URL;

@SuppressWarnings("serial")
public class ●● extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");

try{
URL url =new URL("botが叩くURL");//
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;

while ((line = reader.readLine()) != null) {
resp.getWriter().println(line);
}
reader.close();

} catch (MalformedURLException e) {
resp.getWriter().println("URL faild : " + e);
} catch (IOException e) {
resp.getWriter().println("URL faild : " + e);

}
}
}

ゆとりさんからのコピペですが、これを>>140さんが書いているように
書きかえればいいのでしょうか。
それとも、そんな単純な話ではないのでしょうか…。

初心者なので理解しかねています。
けれどbotが突然リプライを返さないことがよく起こっているので
なんとか解決したいです…。同じ環境でも動いている方もたくさいるようなのですが。

142140:2013/03/30(土) 09:04:24
>>141
おおむねその通りです。
書き換えのポイントは2つです

(1)
ソースの頭のほうで「import〜」が並んでる後ろに
「import java.net.HttpURLConnection;」
を追加

(2)
>BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));

ソースの真ん中辺りにある↑の1行を>>140のソースで「connection〜」から始まる6行と置き換える
(置き換え分の6行目が「BufferReader〜」で始まってて何となく似てますよね)

で動くはずです。それより後ろはいじらなくてOKです
>>141さんの書いているソースで、「String line;」以降は変えなくておk)

143名無しさん:2013/03/30(土) 22:44:19
>>141です。
丁寧な回答ありがとうございます。
試しに以下のように書き換えてみましたが、いくつかエラーが発生してしまいました。

package ●●●;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import javax.servlet.http.*;
import java.net.URL;
import java.net.HttpURLConnection;
(中略)
try{
URL =new URL("●●●");←URLを変数に解決できません
connection = (HttpURLConnection)url.openConnection();←この行に複数のマーカーがあります。urlを解決できません。connectionを変数に解決できません。
connection.setDoOutput(true);←connectionを解決できません。
connection.setUseCaches(false););←connectionを解決できません。
connection.setRequestProperty("Cache-Control", "max-age=0"););←connectionを解決できません。
connection.setRequestMethod("GET"););←connectionを解決できません。
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "JISAutoDetect")););←connectionを解決できません。
String line;
(以下略)

このエラーはどのように解決したらいでしょうか…。度々すみません。

144名無しさん:2013/03/30(土) 23:32:08
横からで済みませんが
この話題はそろそろCronスレに移られたらいかがでしょう?

当方にはまったくわからない話題なので、的外れな案内だったら申し訳ありません
ただ、このスレッドでのメインの内容とは少し違う気がするので……

145140:2013/03/31(日) 12:40:45
>>144
その通りですね。失礼いたしました。

>>143
ということで、続きはcronスレで。
あとでコード見てみます

146名無しさん:2013/04/20(土) 20:01:43
【設置鯖名】 @PAGES
【PHPのバージョン】
【EasyBotterの改造】改造している(ID別リプライ、回数制限等)
【手動】 動く
【実行】 GAE
【実行間隔】 5分間隔
【不明点】
『つ【〇〇】』と物を貰った時に、『〇〇』が食べ物か食べ物以外かで反応を分ける時に
例えば『food.txt』を参照して、『〇〇』があるならリプライする、無いならリプライしないようにする方法はありますか?
リプライファイルに書き込んでいくのでは記述が長くなってしまうので
別ファイルを参照出来ればいいなあと思っています


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板