したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が900を超えています。1000を超えると投稿できなくなるよ。

TwitterBotPHP質問スレ

523名無しさん:2010/10/23(土) 23:52:53
【バージョン】Ver.2.04beta
【設置鯖名】@PAGES
【PHPのバージョン】
【手動】 動く
【実行】 GEA
【実行間隔】 2分

「特定のアカウントに対しては、別のリプライパターンを読み込ませる機能」について質問です。

非公式Wikiの「特定のアカウントに対しては、別のリプライパターンを読み込ませたい」という項目を参考に
特定のアカウント(相手bot)から貰ったリプライに対して、別のリプライを送る事に成功しました。
これを応用して、相手botのTLには専用のリプライを送るように改造してみましたが、反応する確率が低くて困っています。

//タイムラインへの反応を作る
function makeReplyTimelineTweets($timeline, $replyPatternFile){
if(empty($this->_replyPatternData[$replyPatternFile])){
$org_repfile = $replyPatternFile; //■■デフォルトのファイル名を保管(追加1行だけ)■■
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
}
$replyTweets = array();
foreach($timeline as $tweet){
$status = "";
$re = array();
$text = (string)$tweet->text;
//リプライパターンと照合
//■■特定の人には別パターン(追加ここから)■■
$userName = (string)$tweet->user->screen_name;
switch(true){
case stristr($userName, "bot")://botに対して
$replyPatternFile = "pattern.php";//pattern.phpを適用する
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
break;
default://それ以外
$replyPatternFile = $org_repfile; //デフォルトのパターンファイル名
}//■■特定の人には別パターン(追加ここまで)■■
foreach($this->_replyPatternData[$replyPatternFile] as $pattern => $res){

専用リプライを適用していない、他のアカウントに対しても鈍くなりました。
TLに全く反応しないのではなく、ごくたまにTLのキーワードを拾ってリプライをしている状況です。
手動でbot.phpにアクセスして、今までにでたエラーは

object(SimpleXMLElement)#11 (2) {
["error"]=>
string(19) "Incorrect signature"
["request"]=>
string(20) "/statuses/update.xml"
}

他に
object(SimpleXMLElement)#6
object(SimpleXMLElement)#13
で同じ内容のエラーが出ていました。
文字コードUTF-8、LFに設定してあり、パーミッションも666になっています。
何か解決策(TL反応率を回復させる方法)は有りますか?
TLを拾って専用リプライをする機能を入れる前は、TLをしっかり拾っていました。

524名無しさん:2010/10/24(日) 02:26:19
>>523
フォロワーが多くてTLを全部読めてないとかかな・・・?

525名無しさん:2010/10/24(日) 14:20:57
>>523
他の改造、とくにアイコン変更の改造と併用してませんか?

526名無しさん:2010/10/25(月) 14:06:10
>>523
wikiを見て自分もTL反応をID別にしてみたのですが
特定アカウント(A,B)その他アカウント(C)の発言を同じタイミングで2つ以上取得すると以下のようなエラーが出てしまい、
最初の人以外は反応語を喋っていてもbotが反応していない状況になってます(最初の一人の発言には反応してリプを返しています)
Warning: Invalid argument supplied for foreach()
エラー箇所
foreach($this->_replyPatternData[$replyPatternFile] as $pattern => $res){

フォロワが500人くらいで30〜60%返信率という感じです
同様の書き方でID別リプライは問題なく動いていますので
ID別TL反応は同じように書いても成功しないのかもしれませんね
なんとか使えるように出来ればと少しづつ勉強してるのですが…

527名無しさん:2010/10/25(月) 22:15:35
>>308とは関係ないの?

528名無しさん:2010/10/26(火) 01:33:16
$this->_replyPatternData[$replyPatternFile]の値が不正だよと言われているのだから単純に、
1.$replyPatternFileの値がおかしい
2.パターンファイルの記述がおかしい
のいずれかだと思います。(1が濃厚かと)
とりあえずforeachの前で$replyPatternFileと$this->_replyPatternData[$replyPatternFile] をvar_dumpして調べてみるのがいいと思います。

529名無しさん:2010/10/26(火) 15:01:55
526です。wikiのタイムライン反応を作成するときに、特定のユーザリストを見て、反応ファイルを変更を利用しています
528さんにアドバイスいただいたvar_dumpを入れ、特定アカウントAから2分間に3つ(反応語なし、反応語なし、反応語)の順でPOSTしてみました
//ユーザリストを読み込む。
$fname = "replyTLusers.txt";
$users = array();
if (file_exists($fname)) {
$tmp = file($fname);
    var_dump( $u );
foreach($tmp as $u) {
$users[] = trim($u);
} }
var_dump( $users );
var_dump( $userName );
var_dump( $replyPatternFile );
var_dump( $this->_replyPatternData[$replyPatternFile] );

var_dump( $this->_replyPatternData[$replyPatternFile] );ここでは割愛します (チェッカー使用)
・1つ目のポスト(反応語無 特定アカウントA )
string(5) "Aのid"    →var_dump( $u );  
string(10) "Aのid"    →var_dump( $users );
string(10) "Aのid" → var_dump( $userName );
string(16) デフォルトのphp →var_dump( $replyPatternFile );

・2つ目 (反応語無 特定アカウントA )
string(5) "Aのid"      
string(10) "Aのid"
string(10) "Aのid"
string(17) 特定アカウントのphp

・3つ目 (反応語有  特定アカウントA)
NULL
string(10) "Aのid"
NULL
string(16) デフォルトのphp

問題点が2つあって、$userNameと$usersが同じidの場合でも
if(in_array($userName, $users)){  が上手く機能せず?
else{ $replyPatternFile… を読み込んでる事があるようです
ID別リプライも何度か特定アカウントと他を取り違えるという話がでていたので、それに近いものかもしれませんが…
自分の場合は反応語が特定用と他用で違う為、マッチングせず反応しなかった になっていたようです

また、特定アカウントから2つ以上postがあると後に反応語があっても反応しないでは
後ろのアカウントで$uがNULLになっているあたりから起きるようです
助言いただいたvar_dumpのおかげで無駄なく見えてきたのですが難しいですね 続けて勉強します

530名無しさん:2010/10/26(火) 16:13:35
>>523です。返信ありがとうございます。

>>524
フォロワー数は850人前後です。
やはり、TLを回収しきれていないのでしょうか。

>>525
アイコン変更機能は追加していません。
改造し追加した機能は、非公式Wikiにあった
「ランダムPOST・重複チェック」を50個前まで投稿を記録するように値を変更。
「特定のアカウントに対しては、別のリプライパターンを読み込ませる」を、非公式Wikiの通りに追加。
「自動フォロー返しした時にリプライで知らせたい」「鍵付きの人へ何度も話しかけてしまう場合」を、非公式Wikiの通りに追加。
あと、緊急停止スクリプトを追加しています。

>>527
関係があるのか分かりませんが、>>308のように書き変えて様子をみてみます。

531名無しさん:2010/10/26(火) 23:09:45
>>530
>>525です。
なぜアイコン変更の改造を挙げたかというと、「Incorrect signature」が出たり出なかったりするのは、「認証情報またはヘッダーを処理の途中で書き換えている」可能性が高いからです。

他の改造は認証情報やリクエストヘッダーを変更することは無いので、一度認証が成功していれば、ツイッター本体の不調でも無い限り、1ターンの間に認証出来たり失敗したりという現象はほぼ発生しません。

ところがアイコン変更など、ファイルのアップロードを伴う処理は、リクエストヘッダー(content-type)を通常oAuthが使用するapplication/x-www-form-urlencodedからmultipart/form-dataに書き換えるので、content-typeをapplication/x-www-form-urlencodedに戻さなければ、その後のPOSTで、「Incorrect signature」が確実に出ます。

お書きになっていた現象がそれに似ていたので、お伺いした次第です。

もしホスティング提供のPEARライブラリではなく、自分のサイトに置いてあるPEARを使用しているようなら、
easybotter同梱のPEARとDFなどのツールでコンペアしてみてはいかがでしょう。
もしかしたら、どこかに差異があるかもしれません。

また、どのリクエスト(またはどのリクエストの後)に「Incorrect signature」が返って来ているかを特定するために
_setData関数と_getData関数のreturn $response;の直前に
var_dump($url);
var_dump($value);
var_dump($response);
を入れて、しばらくログを取ることをお勧めします。

ログの取り方→ http://twbot.blogspot.com/2010/08/easybotter2.html

ちなみに、TLが取得出来ているかいないかはreplyTimeline関数の
$timeline = $this->getFriendsTimeline();
$timeline = $this->getRecentTweets($timeline, $cron);
$timeline = $this->selectTweets($timeline);
$timeline = $this->removeRepliedTweets($timeline);
の全行間に
var_dump(count($timeline));
をいれれば、最初に何件取得して、どの処理で削られて、最終的に何件残ったかがわかります。
更に、
$timeline = array_reverse($timeline);
の後に
var_dump($timeline);
と書けば、残ったTL(処理対象)が全件表示されるので、
これも一日二日ログを残せば、TL取得できているかいないかがはっきりします。

532名無しさん:2010/10/28(木) 17:26:00
>>530です。返信ありがとうございます。

>>531
アイコン変更は、そのような仕様になっていたのですね。
お教え頂いた通り、数日間ログを取ってみます。
ありがとうございます。

533名無しさん:2010/10/28(木) 23:29:22
一見、普通の女の子の日記ですが、
ある事をした後に更新しています。
かなり中毒性が高いので注意が必要かもしれないです。

ttp://stay23meet.web.fc2.com/has/

534名無しさん:2010/10/28(木) 23:34:16
一見、普通の女の子の日記ですが、
ある事をした後に更新しています。
かなり中毒性が高いので注意が必要かもしれないです。

ttp://stay23meet.web.fc2.com/has/

535名無しさん:2010/11/03(水) 05:56:51
整理あげ

536名無しさん:2010/11/04(木) 22:42:44
整理age

537名無しさん:2010/11/06(土) 16:26:45
整理age

538名無しさん:2010/11/08(月) 11:34:54
他botのTLの発言を拾わず、リプライにだけ反応させたいのですが可能でしょうか?

非公式wikiの「botと名の付くアカウントを制限する」を試したところ、
TLは拾わなくなったのですが相手botのリプライにも反応しなくなってしまいました。
アドバイスいただければ幸いです。

539名無しさん:2010/11/08(月) 12:42:48
>>538
TL反応の前にアカウントチェックを入れる

540名無しさん:2010/11/08(月) 19:39:41
>>539
レスありがとうございます
すみません、具体的にはどのphpのどの部分を弄ればいいのでしょうか…

541名無しさん:2010/11/09(火) 00:23:18
整理age

542名無しさん:2010/11/09(火) 11:17:00
>>540
>>538でやったことと大差ないんだから、まずは自分で考えよう

543名無しさん:2010/11/11(木) 03:17:06
整理age

544名無しさん:2010/11/17(水) 01:19:11
非公式Wikiにある「ランダムPOSTで発言を重複させない様にする」機能についての質問です。

Wikiにある通りにコピペして、数か月前から利用しています。
定期的にtwit_log.txtをチェックしているのですが、いつもログは1つしか書きこまれていません。
そのためか、短い期間で同じツイートをしてしまいます。

twit_log.txtのパーミッションを606、666と、どちらに変更しても同じでした。
ちなみにランダムPOSTは時間帯別設定をしており、総パターン数は60種ほどです。

正常にログを10個記録しておくようにするには、どうしたらよいのでしょうか。

545名無しさん:2010/11/17(水) 02:25:34
>544
$rento_limit = 10; // n個前まで投稿を記録し、二重投稿を回避する
ちゃんとこうなってる?

546名無しさん:2010/11/18(木) 02:02:41
>>545
はい、数値は10になっていました。
Wikiにある通りにコピーしており、(一時的にですが)twit_log.txtのパーミッションを606→666で作成するように数値を変更した以外は、弄っておりません。

botの本垢でtwit_log.txtのパーミッションを666、別垢でパーミッション606にして、既に3か月以上様子を見ているのですが、どちらのパーミッションでもtwit_log.txtに2つ以上のログが残っている事は一度もありませんでした。

547名無しさん:2010/11/19(金) 00:45:16
>>546
自分のはちゃんと動いてるから記述抜けか、他の構文抜けか…
一度http://www26.atwiki.jp/easybotter_wiki/pages/28.html#id_9cd5da71を見直して。
それでもダメならテンプレ使って詳細書いてくれたら分かるかもしれない

ありそうなのは//のコメントアウト行にあるとかそんなのじゃないかな

548名無しさん:2010/11/20(土) 02:46:40
>>547
ありがとうございます。再度見直したところ、

//ランダムにポスト
function postRandom($datafile = "data.txt"){
$status = $this->makeTweet($datafile);

$status = $this->makeTweet($datafile);

$status = $this->rento_check($datafile);
に変更。

という部分の、変更後 ($datafile); の後ろに半角スペースが大量に入っていたのでそれを削除してみたところ、正常に作動しました。

@PAGESを利用しておりますが、twit_log.txtのパーミッションは606にしておきました。

ちなみに、ログは改行なしでどんどん書き込まれていくものなのでしょうか。
3つのログを回収させた時点で、全てのツイートが改行されずに横並びにtwit_log.txt書きこまれていました。

549名無しさん:2010/11/20(土) 18:34:49
>>548です。

ランダムPOSTの取得したログについて、追加で質問なのですが

ポストするファイルが変わると、ログはリセットされてしまうのでしょうか。

時間帯別POST設定をしていて、ランダムPOST用ファイルを5つに分けて
います。
深夜にチェックしたときは、3ツイート分のログが改行なしで書かれていたのですが、今確認したところ、また1ツイート分のログしか書かれていませんでした。

550名無しさん:2010/11/20(土) 21:13:11
>>549
リセットされない、全共通。
改行なしなのはどこかおかしい証拠

551名無しさん:2010/11/20(土) 22:47:57
>>550
ありがとうございます。

Wikiをコピペしただけなのですが、
何が不具合をおこしているのか、検討がつきません…。

【バージョン】 Ver.2.04
【設置鯖名】 @PAGES
【手動】 動く
【実行】 GEA
【実行間隔】 3分間隔

再びEasyBotterにコピペし直して、稼働させてみました。
いくつかツイートさせてみましたが、改行なしで記録されている状態です。
>>584を書きこんだ時の状況と同じです。
もう少し様子を見てみます。しばらくしたら、またログが1ツイート分しか残っていないかもしれません…。

552名無しさん:2010/11/20(土) 23:36:43
>>551
改行コードを確認した?

553名無しさん:2010/11/21(日) 00:42:18
>>522
twit_log.txtの改行コードは、LFでした。

ログを確認したら、また1ツイート分しか残っていませんでした。

554名無しさん:2010/11/21(日) 18:36:56
こんにちは。質問させてください。

フォロワー数の増加により、頻繁にpost規制にかかるようになってしまいました。
垢分けも考えたのですが、できるなら一つの垢でできるかぎりやっていきたいと思い、
返信率を改造したいと考えています。

ツイートできるのは3時間に127postで、128post目から規制になり、
1ツイート目の時間から3時間経過したら規制解除されるようなことがわかりました。

そこで、5分以内にもらったリプライのうち、ランダムで最大3件に返信する、もしくは
3分以内にもらったリプライのうち、ランダムで最大2件に返信するようにしたいです。

自分で考えてみた感じだと、もらったリプを記録する仕組みが必要だと思いまして、
「ランダムPOSTで発言を重複させない様にする」ソースの応用でできるのではないか
というところまでいきましたが、煮詰まってしまいました。

ぜひお力をお貸しいただければと存じます。
よろしくお願いします。

555名無しさん:2010/11/21(日) 19:48:42
>>554

3分とか5分とかが、replyTimeline関数の実行間隔と一致しているという条件の元にですが、
下記の要領で制限は可能かと思われます。

replyTimeline関数の

//リプライを作る
$replyTweets = $this->makeReplyTimelineTweets($timeline, $replyPatternFile);
if(count($replyTweets) != 0){
 foreach($replyTweets as $re){



//リプライを作る
$replyTweets = $this->makeReplyTimelineTweets($timeline, $replyPatternFile);
if(count($replyTweets) != 0){

 //リプライ回数の制限 ここから
 $reply_max = 2;//1回のreplyTimeline実行でリプライできる最大数
 //$replyTweetsが$reply_max件になるまで配列から要素を削除
 while(count($replyTweets) > $reply_max){
  array_splice($replyTweets,array_rand($replyTweets),1);//ランダムで1件削除
 }
 //リプライ回数の制限 ここまで

 foreach($replyTweets as $re){

のような感じにすれば良いかと思われます。処理内容はコメントで察してください。
文法チェック以外ノーテストなので、テスト&デバグはご自分で行ってください。

556名無しさん:2010/11/21(日) 20:07:55
>>553
それ@pagesのせいかもよ、場合により重複回避上手く出来ないって話聞いた事があるから
動作確認でさくらの無料期間とか使って一時的に別のTwitterアカウントから
同じファイルでPostさせてログ見てみるといい
多分きっちり指定した数ログ保存されるはずだから

557名無しさん:2010/11/21(日) 22:12:10
>>555
お答えいただきありがとうございました!

目的がタイムラインの語句に反応してリプライするのではなく、
受け取ったリプライにリプライを返す際に返信数に上限を設けるためだったので、

//古い順にする
$replies = array_reverse($replies_);
if(count($replies) != 0){
//リプライの文章をつくる
$replyTweets = $this->makeReplyTweets($replies, $replyFile, $replyPatternFile);

の下に

//リプライ回数の制限 ここから
 $reply_max = 3;//1回のreplyTimeline実行でリプライできる最大数
 //$replyTweetsが$reply_max件になるまで配列から要素を削除
 while(count($replyTweets) > $reply_max){
  array_splice($replyTweets,array_rand($replyTweets),1);//ランダムで1件削除
 }
 //リプライ回数の制限 ここまで

を組み込んだのですが、どうもうまく動作せず、全てのpostが停止してしまいました…
これは挿入箇所が違うということでしょうか?;

558名無しさん:2010/11/21(日) 23:56:52
>>557
入れるところは合ってます。何が理由で止まったかは、私の記述やロジックが間違っているかも含めて、テストしてみてください。とりあえず、挿入した全行間にvar_dumpやechoを入れてどこで止まっているか、変数の値はどう変換はしているかをチェックする事をオススメします。もし自力で調べてデバグ出来ないようなら、改造は諦めた方が懸命です。では、ご武運を。

559名無しさん:2010/11/24(水) 01:31:46
>>558
テストしてみたところ、
if(count($replyTweets) > $reply_max){
を挿入してうまくリプライ制限されるようになりました!
ありがとうございました!!

560名無しさん:2010/11/24(水) 01:56:23
>>559
wikiに追加しておくから詳細あるとうれしいな

//古い順にする
$replies = array_reverse($replies_);
if(count($replies) != 0){
//リプライの文章をつくる
$replyTweets = $this->makeReplyTweets($replies, $replyFile, $replyPatternFile);

の下に

//リプライ回数の制限 ここから
  $reply_max = 3;//1回のreplyTimeline実行でリプライできる最大数
  //$replyTweetsが$reply_max件になるまで配列から要素を削除
  if(count($replyTweets) > $reply_max){
   array_splice($replyTweets,array_rand($replyTweets),1);//ランダムで1件削除
  }
  //リプライ回数の制限 ここまで

でいいのかな

561名無しさん:2010/11/24(水) 09:30:33
>>559
コードを、生かして頂いて、ありがとうございます。

562名無しさん:2010/11/24(水) 22:00:12
現在、wikiを見ながら、会話数制限(リプライ返し)と特定の人には別パターンで
bot同士の会話数を5回に制限し、
なおかつbot同士のリプライを別パターンで発言させているのですが、
毎回3回目あたりで別パターン以外のリプライから発言してしまいます。
何をどうしたらきちんとなるのか、教えていただければ幸いです!

563名無しさん:2010/11/25(木) 21:16:47
TLの反応率を下げたくて空リプ("",)を増やしてみたのですが
結局言葉の入っているリプライを返してしまい反応率が変わりません。
空リプを増やす以外でTL反応率を下げるにはどうしたらいいでしょうか?

564名無しさん:2010/11/25(木) 22:51:14
>>563
お勉強頑張れ
> bot.phpで必要な知識
>  ├演算子
>  ├比較演算子
>  ├条件分岐(if、switch)
>  └date関数

565名無しさん:2010/11/25(木) 23:39:26
>>563
bot.php側で確率をつけ弄る

566名無しさん:2010/11/26(金) 08:25:46
>>562
ソースを見れば、答えられるかもしれない。

567名無しさん:2010/11/27(土) 10:20:16
>>562
そのパターンファイルを見れば詳しく教えてもらえると思うですよ

ソース晒すのが嫌で自分で解決してみたいなら
その""を"スルー予定"に設定して試す
のはどうですか
この段階でスルー予定が一度も出ないなら他に原因があるんだと思いますよ

言うまでもありませんがTwitter側の仕様で短時間10ツイート以内に同じ発言があるとツイートが反映されないのでご注意
今現在は該当する発言を削除すればまた同じ発言で大丈夫です

568567:2010/11/27(土) 10:25:46
間違えた
さっきのレスは>>563宛です

569名無しさん:2010/11/27(土) 23:20:20
>>560

ソースの詳細ですが、
//古い順にする
$replies = array_reverse($replies_);
if(count($replies) != 0){
//リプライの文章をつくる
$replyTweets = $this->makeReplyTweets($replies, $replyFile, $replyPatternFile);

の下に、

//リプライ回数の制限 ここから
$reply_max = 3;//1回のreply実行でリプライできる最大数
if(count($replyTweets) > $reply_max){//$replyTweetsが$reply_maxよりおおきかったら
//$replyTweetsが$reply_max件になるまで配列から要素を削除
while(count($replyTweets) > $reply_max){
array_splice($replyTweets,array_rand($replyTweets),1);//ランダムで1件削除
}
}

です。

570名無しさん:2010/11/27(土) 23:27:41
>>569
whileの前のif文いらない気が…

571名無しさん:2010/11/28(日) 00:36:43
>>569
いや、>>557で動かないと言ってるんだ…

572名無しさん:2010/11/28(日) 00:37:27
>>570だった

573名無しさん:2010/11/28(日) 01:39:19
まったくの初心者です・・・Easybotter様を使用しています
時間別にリプライを設定したくて、色々調べたんですが具体的に書いてあるところがなく困っています
自分なりに理解しようと思いずっと悩んでいたんですが・・・
どこにどの構文を入れればいいのかが良くわかりません・・・

おはよう、という@をもらったら
5〜7時の間は「早起きだね」、12時〜16時だと「寝坊だよ」等の返信を行いたいのです
同様に、おやすみについても時間指定で返信がしたいです

ご教授いただけたらと思います、お願いします・・・

574名無しさん:2010/11/28(日) 01:48:16
>>573
とりあえず、下記URLを読む、読んでわからないところを調べる
http://jbbs.livedoor.jp/bbs/read.cgi/internet/6629/1287944674/1-3

575名無しさん:2010/11/28(日) 07:44:03
>>570
>>571

if挿入に関してですが、
whileだけで実行したところ、
受け取った$replyTweetsが$reply_maxに満たなかった際に、
whileの中で$replyTweetsが空になるまで削除されてしまってpostされず、
それならばということでifで指定した次第です。
指定した後は、$replyTweetsが$replx_max以上でも未満でも動いています。
php初心者なので、ifしか思いつかなかったので、
もしかしたら他に書き方があるのかもしれませんが…。

576名無しさん:2010/12/05(日) 12:59:23
Easybotter2.04を利用しています。
例えばですが、カウントダウンタイマーの様な仕様で
記念日まであと○日○時○分○秒○○と言った様な発言を
botにさせることは可能でしょうか。
phpは初心者なので取っ掛かりも良くわからずにいます。
お知恵をお借りできたら嬉しいです。

577名無しさん:2010/12/05(日) 13:18:53
因みにですが、カウントダウン発言ばかりを繰り返すbotではなく
通常発言の一つとして、ランダムに吐いたり吐かなかったりする
仕様を探してます。
カウントダウンのPHPを探してもどう組み込めばいいのか、
今一つかめません。何か参考になるような物も探しています……。

578名無しさん:2010/12/05(日) 13:50:40
>>576-577
カウントダウンは一応既出、過去ログを探してみよう。
カウントダウン発言と通常発言とファイルを分けたらいけると思う

579名無しさん:2010/12/06(月) 02:06:52
>>578
初心者質問の最初の方に出ていた内容は総て拝見させて頂いてたのですが
あのスクリプトをどう組み込めばいいのかが判りませんでした。
また、記念日まで●日●時●分●秒●●と、詳細にわたる表記も可能でしょうか?
何度も恐れ入りますがお知恵をお借りできれば助かります。

580名無しさん:2010/12/06(月) 07:47:43
>>579
ここはコピペすればいいような教え方や
手取り足取り教えるところでないよ
ヒントはもうでているんだ。しつこい

581名無しさん:2010/12/06(月) 21:29:45
wikiを利用して、
特定の人には別パターンというのをつけているのですが、
用意したリプライファイルを読まず、data.txtを読んでしまいます。
やりたい事は、1つのアカウントで1ファイルを使いたいのです。
なので、wikiに書いてあるような2アカウントで1ファイルみたいなのではないんですが・・・。。

$userName = (string)$reply->user->screen_name;
switch(true){

//Abot
case $userName == "a_bot"://abcdというアカウント名に対して
$replyPatternFile = "a_pattern.php";//xxx_pattern.phpを適用する
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
break;
//Bbot
case $userName == "b_bot"://abcdというアカウント名に対して
$replyPatternFile = "b_pattern.php";//xxx_pattern.phpを適用する
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
break;

default://それ以外
$replyPatternFile = $org_repfile; //デフォルトのパターンファイル名
}

582名無しさん:2010/12/13(月) 10:45:08
質問させていただきます。

日曜日の11時〜17時まで違うポストパターンを読み込ませるのにif文で分岐させているのですが、このプログラムに間違いはありますか?
何度やってもtrueに入ってくれません。

if(date("G") > 10 && date("G") < 18 && date("w") == "0")
{
特別なポストパターン
}
else
{
通常のポストパターン
}

583名無しさん:2010/12/13(月) 11:15:00
それでいいはず。
とりあえず今日は月曜だから =="1" で実行したら真になったし。
どっか他の部分で分岐してる可能性があるから番号順にechoするとかでそこまでの動作を逐次出力してみれば。

584名無しさん:2010/12/14(火) 00:34:10
>>582
http://www26.atwiki.jp/easybotter_wiki/pages/30.htmlを参考にして、
それでちゃんと動作するか簡易ローカルチェックで試す方がいいかな

今回の場合は
<?php
ifdate("G") > 10 && date("G") < 18 && date("w") == "0"){
echo "特別なポストパターン";
}
else{
echo "通常ポストパターン";
}
?>
な感じで
・・・後、間違いはどこか分かったかな?

585名無しさん:2010/12/14(火) 09:14:20
質問です。
23時にpostをするには
if(date("G") == 23 && date("i") == 0){
ファイル名
}
であっているのでしょうか?

586名無しさん:2010/12/14(火) 09:22:37
>>585
CRON精度が高いならDate関数とif文は合ってるよ
ファイル名だけじゃ動かないけど

587名無しさん:2010/12/14(火) 09:38:34
>>586
if(date("G") == 23 && date("i") == 0){
$response = $eb->postRandom("***.txt");
}
になってます

588585:2010/12/14(火) 09:53:06
解決しました。ありがとうございます!

589名無しさん:2010/12/14(火) 15:28:47
通常はフォロワーさんのタイムラインやリプライに反応し、おはようやおやすみを呟き
夜の時間は眠り、寝言を呟くbotを作りたいと思っています。
夜の眠っている間だけ、フォロワーのタイムラインに反応しないようにしたいのですが
今の状態ですとリプライだけでなく、タイムラインの反応ワードも拾ってしまっているため
フォロワーさんに「寝てたんじゃないの?」とツッコまれる状態になってしまっています。

$response = $eb->autoFollow();
//$response = $eb->postRandom("data.txt");
//$response = $eb->postRotation("data.txt");
$response = $eb->reply(5,"feeling.txt","reply_pattern.php");
$response = $eb->replyTimeline(5,"timeline.php");

//2時から寝ます
$now_g = date('G');
$now_i = date('i');
if(($now_g > '2') && ($now_g < '7') ){
$now_g = 'sleep';
}

if(date("i") % 60 == 0){
//おやすみpost(1時)
if(date("G") == 1 && date("i") == 00){
$response = $eb->postRandom("night.txt");
//寝言post(2〜6時)
} else if(date("G") > 1 && date("G") < 7){
$response = $eb->postRandom("sleeping.txt");
//おはようpost(7時)
} else if(date("G") == 7 && date("i") == 00){
$response = $eb->postRandom("morning.txt");
//通常post
} else {
$response = $eb->postRandom("shiwasu.txt");
}
}

夜の時間にタイムラインに反応させなくする方法をご存知の方がおられましたら、お教えいただけると幸いです。

590名無しさん:2010/12/14(火) 18:58:46
>>589
上の
$response = $eb->replyTimeline(5,"timeline.php");
の部分を
if(date('G')<2 || date('G')>6){
$response = $eb->replyTimeline(5,"timeline.php");
}
に変更すれば2,3,4,5,6時台にはTLに反応しないように出来ると思います

591名無しさん:2010/12/14(火) 20:51:27
>>590
ここ初心者スレじゃないんだから、安易に答え出しちゃダメでしょ

592名無しさん:2010/12/14(火) 21:33:50
すみません、どなたか教えてください。
>>581
↑こちらの質問になります。
よろしくお願いします。

593582:2010/12/14(火) 23:42:36
>>583 >>584

アドバイスどうもありがとうございました。
チェックしてみたのですがまだ真に入りません。
もう少し考えてみます。

594名無しさん:2010/12/15(水) 01:24:06
>>593
合ってるからこそ入らないんじゃないの?

595名無しさん:2010/12/15(水) 23:12:13
今日水曜日なんだから真になるはずもないわな。

596名無しさん:2010/12/16(木) 01:24:39
12月15日だけ特別ポストをしようと思い、
if(date("n") == 12 && data("j") == 15 ){
$response = $eb->postRotation("post_15.txt");
}
と入れたのですが以下のエラーが出てしまいます。
Fatal error: Call to undefined function data() in /virtual/(省略)/bot.php on line 15

15行目は「if(date("n") == 12 && data("j") == 15 ){」にあたります。
サンプルのif(date("n") == 2 && data("j") == 14 ){」をはじめ、10月や11月に変更してもエラーは出ないのですが、原因がわかる方お教えいただけると幸いです。

597名無しさん:2010/12/16(木) 02:28:21
>>596
if(date("n") == 12 && data("j") == 15 ){
    ↑
この一文にケアレスミスがあります、よーく見て見ましょう

598名無しさん:2010/12/16(木) 07:30:18
>>597
なるほど、ありがとうございます
サンプルから引っ張ったので間違いないと思い込んでました
申し訳ないorz
解決しました!

599589:2010/12/19(日) 23:34:29
>>590
レス遅くなりすみません、夜間にタイムラインに反応しないようにさせる事ができるようになりました。
ありがとうございました!

600582:2010/12/21(火) 19:54:29
>>594 >>595

そこはちゃんと値を変えてやっています。
無事解決しました。
別のところでエラーが出ていました。
ありがとうございました。

601名無しさん:2010/12/24(金) 21:10:43
だすしかない
http://linkhunter.pa.land.to/get.php?u=www.iiv.ne.jp/juicy/nikkan/kawaharayouko/images/060710_1.jpg
http://61.203.92.62/Photo/Zosan/Across/Web-KY3/DSC_1330.jpg

602名無しさん:2010/12/25(土) 01:49:38
>>601は全然ツイッターBOTに関係ないので無視してください
一応危険は無いみたいだけど・・・(上はアメリカ鯖、下は日本鯖)

603名無しさん:2010/12/27(月) 15:41:15
if(date("G") > 23 || date("G") < 7 && date("w") == "0"){
$response = $eb->postRandom("data_yoi.txt");
}
日曜日の0時〜6時の間、特別なポストデータを読み込ませるにはこれでいいでしょうか><


if(date("G") > 6 || date("G") < 0){
$response = $eb->postRandom("data.txt");
}else if(date("G") > 23 || date("G") < 7){
$response = $eb->postRandom("data_night.txt");
}
さらに質問があるのですが、日曜日の0時から6時以外、つまり通常時のポストを↑のような形にしたいのですが可能でしょうか。

ご教授、構文お願いします><

604名無しさん:2010/12/27(月) 16:47:07
最初の奴、なんでわざわざ23時云々入れるのか&hellip;
||の意味わかってる?「または」「OR」だよ。
0を使いたくないだけなら「かつ」0ではない時にするべき。

23より大きい数字なんてないから最後の
}else if(date("G") > 23 || date("G") < 7){
は無意味だよ。後者だけで0-6時の間動く。

それと日曜の件を最優先にしたいならそれを最初に持ってこないと無意味。

605名無しさん:2010/12/27(月) 19:39:02
>>603
後半
それで希望通りに動く
但し、落ち着いてよく見てみましょう
この場合はelseの次は0時から6時までしかまわってこないから、そこで更に「もし0時から6時の間だったら」の判断はいらないですよ

606名無しさん:2010/12/29(水) 22:32:05
質問なんですが、POSTしたときに0,5,15,30分のときpostRotationを実行させて、以降のPOSTが0,5,15,30でなくともRotaitionを続けることは可能ですか?

607名無しさん:2010/12/30(木) 01:30:43
>>606
日本語でおk

608名無しさん:2011/01/08(土) 11:21:23
EasyBotter.phpを改造したらreply_pattern.phpを読み込まなくなってしまいました
絶対に反応するはずの単語を投げかけてもreply_pattern.phpに該当する単語がない場合の反応を返してしまいます
ソースも何回も確認したのですが、原因がわかりません
この場合、原因として例えばどんなものが考えられますか

609名無しさん:2011/01/08(土) 11:38:15
>>608
書いてある内容から判断すると一番考えられるのは改造ミスです

それ以上の答えが必要なら「どこをどのように改造したのか」の情報が必要だと思います
改造範囲が狭いならその部分のコピペを、全体にわたるなら出来ればソース全部をどこかのアップロダに上げてURLを貼るなど
そうすれば時間のある人が答えてくれるかもしれませんよ

610名無しさん:2011/01/12(水) 07:47:22
getFriendsTimelineで読み込む件数は20件ですが
読み込む件数を増やす事は可能でしょうか?
もし増やせるのならどこを弄ればいいのでしょうか

611名無しさん:2011/01/12(水) 10:40:00
>>610
本体改造なので慎重に、自己責任で

function getFriendsTimeline(){
$url = "http://api.twitter.com/1/statuses/friends_timeline.xml&quot;;
return $this->_getData($url,array("count"=>"100"));
}

function _getData($url,$value = array()){
$response = $this->consumer->sendRequest($url,$value,"GET");
$response = simplexml_load_string($response->getBody());
return $response;
}

手を加えるのは以上二つのfunction
コピペでどうぞ
取得が100件じゃなければ 100 のところを1〜200までの数値に変更

612名無しさん:2011/01/12(水) 15:37:13
特定ユーザーのあるpostがあったときにbotの一部機能だけを止めて、再び別のpostがあったときに止めていた機能を再度動かせるように改造したいと思っています。

botの緊急停止機能のようにテキストファイルでフラグを立ててやればうまくいくと思のですが、一部機能だけを止めたいのでどうすればいいのか悩んでいます。

replytimeline.php
replytokutei.php
がそれぞれ2分ごとに実行されていて、replytimeline.phpで特定ユーザーからのワードを拾いreplytokutei.phpの動作を止めたいと思っています。

613名無しさん:2011/01/13(木) 00:47:56
>>612
緊急停止機能が
http://twbot.blogspot.com/2010/03/botbotphp.html
で紹介されている方法なのであれば

bot.phpの中で
replytimeline.phpを含む「必ず動かしたい」動作の記述を行いその下に
if (file_exists('stop_flg.txt')){ die('STOP! stop_flg.txt exists.'); }//stop_flg.txtがあれば強制終了
の記述を行い更にその下に
replytokutei.php関連の記述をすればいいのではないかと思うのです

614613:2011/01/13(木) 01:05:44
>>612
あああ、あわてて投稿したらフラグをどうするか書かなかった
以下は一つの案なのでそのつもりでいて下さい

replytimeline.php内に
"止めるための反応"=> array(
"{STOP}",
),
"動かすための反応"=> array(
"{START}",
),
の記述を混ぜる

function convertText内のどこかに
if(strpos($text,"{START}") !== FALSE){
unlink ("stop_flg.txt");
}
if(strpos($text,"{STOP}") !== FALSE){
$fp = fopen("stop_flg.txt","w");
fclose($fp);
}

を混ぜておけばいい気がします

615613:2011/01/13(木) 01:16:51
ああ、特定の人じゃないとダメなのか

function convertText内のどこかに
if(strpos($text,"{START}") !== FALSE && $reply->user->screen_name == "特定のscreen_name"){
unlink ("stop_flg.txt");
}
if(strpos($text,"{STOP}") !== FALSE && $reply->user->screen_name == "特定のscreen_name"){
$fp = fopen("stop_flg.txt","w");
fclose($fp);
}

616名無しさん:2011/01/14(金) 12:43:33
>>613
詳しくありがとうございます!挑戦してみたいと思います。

617名無しさん:2011/01/15(土) 14:17:18
特定の単語をリプされたとき、人格が変わるようなbotを考えています。
1単語を言われたときに分岐
2発言したユーザーIDを記録(同じなら上書き)
3ユーザーIDが記録されている人に対しては特定のリプライファイル
4更に特定の単語を言われたら終了(ユーザーIDを削除)
という流れで考えた為、以下のようにしたのですが巧く動きません
(具体的には同時に複数の人が記録されていると巧く分岐しない、
 一人ではなく全部の記録を削除してしまう時があるなど)
そもそも非推奨の関数を使っているせいもあると思うのですが、他に方法がありましたらご教授いただけませんでしょうか?

※初心者過ぎて非常に馬鹿な書き方をしている気がしますが……

if(preg_match("/(単語|単語)/",$reply->text, $matches) === 1){
$userName = (string)$reply->user->screen_name;

$fs = fopen('ファイル.txt','r');
while(!feof($fs)){
$str = fgets($fs);
$items = explode("\t",$str);//開いたデータを配列に
$name = trim($items[0]);
if (trim($name) != ''){
if (preg_match('@'.$name.'@',$userName)){
$data = file('ファイル.txt');
$data = ereg_replace($userName, $userName, $data);
file_put_contents( 'ファイル.txt', implode('\n', $data) );
}}else{
//ファイルに書き込み
$fp = fopen('ファイル.txt','a');
flock($fp,LOCK_EX);
fputs($fp,$userName."\r\n");
fclose($fp);
}
}
}

//終了
if(preg_match("/(単語)/",$reply->text, $matches) === 1){
$userName = (string)$reply->user->screen_name;

$data = file('ファイル.txt');
$data = ereg_replace($userName, "", $data);
file_put_contents( 'ファイル.txt', implode('\n', $data) );

}

//分岐対応

$fs = fopen('ファイル.txt','r');
while(!feof($fs)){
$str = fgets($fs);
$items = explode("\t",$str);//開いたデータを配列に
$name = trim($items[0]);

if (trim($name) != ''){
$userName = (string)$reply->user->screen_name;
if (preg_match('@'.$name.'@',$userName)){
$replyPatternFile = "reply_patternX.php";//reply_patternX.phpを適用する
$this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
}
}
}

618名無しさん:2011/01/17(月) 04:02:19
>611
ありがとうございます!
早速使わせていただきます

619名無しさん:2011/01/20(木) 20:51:00
ブログに書き込みが出来なかったのでこちらで質問いたします。
ttp://twbot.blogspot.com/2010/12/blog-post.html
「簡単じゃない twitter bot」 の作り方メモさんのアイコン変更の最新記事を読み、
手動でURLにアクセスする事によってアイコンの変更は出来たのですが
bot.phpでURLを呼び出す方法がどうしても分かりません。

例にある、
$chgicon = file_get_contets('http://www.hoge.com/change_icon.php?icon=bird_blue.png&amp;check=3');
のURLを変更して書き込むとエラーになります。
どなたかアドバイス頂けないでしょうか。

620名無しさん:2011/01/21(金) 22:58:56
>>619
bot.phpに書くなら、同氏のブログの
ttp://twbot.blogspot.com/2010/09/cron.html にある書式をマネしたらいいですよ。

またはポストするデータファイルをPHPにして、
<?php直後に $○○なしで、file_get_contents('URL〜check=○'); だけを置いたら成功しました。

ただ、データファイルまるごとに適用となってしまうので、どうしてもアイコン変更させたい反応語は
別ファイルに分岐させています。
ファイル数が増えるので、もっとスマートな方法があれば私も知りたいです…。

621619:2011/01/22(土) 12:29:16
>>620
ありがとうございます
何とか思い通りに動くようになりました

622名無しさん:2011/01/23(日) 23:30:18
失礼します。初心者です。
@Pagesで設置したBotのうち、reply_pattern.phpだけこのようなエラーが・・・。
Parse error: syntax error, unexpected ';', expecting ')' in /usr/local/www/htdocs/(ユーザー名)/public_html/twitterbot/reply_pattern.php on line 33
詳しい方、よければご教示願います。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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