トップページ⇒php
1001コメント336KB

【Twitter】 BOT製作支援スレ

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/09/27(日) 14:15:59ID:Dz08qoo4
見当たらなかったので立ててみた

[公式] http://twitter.com/
[Twitter 開発ブログ 日本語版] http://twitterjp.blogspot.com/

*どの言語でもOKですがソースを書く際は何の言語なのかも記載してください。
*初心者のために、なるべくぶつ切りのソースではなく全体的に載せてほしいです。
0136nobodyさん2009/10/21(水) 23:03:06ID:???
自分のPCにapacheとphpインストールしてcron動かせばいいじゃん
立ち上げっぱなしになるのがネックだけど
0137nobodyさん2009/10/22(木) 00:00:16ID:???
@phaです。
プログラミングができなくても作れるTwitter botの作り方
http://pha22.net/text/twitterbot.html
少しバージョンアップしました。
特定の単語に特定の単語を返す機能と、現在の時間を組み込める機能を付けました。
よかったら試してみてくださいー
0138nobodyさん2009/10/22(木) 00:10:26ID:???
>>137
お疲れ様です。
0139nobodyさん2009/10/22(木) 05:06:11ID:???
>>137
本当に有難う。
0140nobodyさん2009/10/22(木) 07:38:40ID:???
>>137
ありがとうございます!
0141nobodyさん2009/10/22(木) 08:23:56ID:???
>>137
いけました!
有難う御座います!!
しかし、中身に記載されてるバージョンが1.1のまんまでしたよー
0142nobodyさん2009/10/22(木) 14:33:42ID:???
リプライをもらうと@だけ発言する、うちのボット…
0143nobodyさん2009/10/22(木) 15:09:08ID:???
>>142
確実にソースが間違ってる。がんがれ
0144nobodyさん2009/10/22(木) 17:51:54ID:???
>>141
バージョン直しました
0145nobodyさん2009/10/22(木) 18:32:14ID:???
おつかれさまです!!!!
0146nobodyさん2009/10/22(木) 19:04:13ID:???
自分のbotが他のbotにフォローされてるんだけどフォロー返したら会話がループしそうなんだよな
0147nobodyさん2009/10/22(木) 19:14:00ID:???
この新しいreply_patternってやつをreply_randomに組み込めばいいんだよね?
なんかエラー吐くんだけどどこに置けば?
0148nobodyさん2009/10/22(木) 19:37:46ID:???
たまにリプライするとき@の前にドットつけてるbotいるけど何の意味があんの?
0149nobodyさん2009/10/22(木) 20:45:08ID:???
>>147
reply_pattern.php のファイルの場所を移動させなくてもそのまま置いておけばできたよ
0150nobodyさん2009/10/22(木) 21:26:28ID:???
>>143
だよねぇ。。
がんばるわ。
0151nobodyさん2009/10/22(木) 23:02:20ID:???
>>137
ありがとうございましたー!!
でも動かないー!
0152nobodyさん2009/10/23(金) 00:01:49ID:???
>>151
どんな状態で動かない?
0153nobodyさん2009/10/23(金) 00:20:42ID:???
>152
反応が全くない。TL上のワードを拾うわけじゃないんですよね?
普通に@無視される…
まぁ、@つけても無視されるんですが。おやすみ入れてもスルー。
0154nobodyさん2009/10/23(金) 01:31:51ID:???
>>137
本当にありがとうございますー!
今まで特定の語句への返信は、
phaさんのを参考にして作ったという某ブログのスクリプトを使っていたんですが
こちらの方がすっきりしていてサイズが小さく済む+追加しやすいのでこちらに変えました
定期ランダムポスト+特定の語句へのリプライはphaさんのスクリプト
TLから特定の語句を拾ってのリプライは某ブログのスクリプトという
合わせ技でもなんとか動いてます
こんなに使いやすいスクリプトを作って下さり、本当にありがとうございました
0155nobodyさん2009/10/23(金) 07:18:12ID:???
>>137
構文を追加したらRT対策が解除される、ということは不可能でしょうか?
.@での挨拶が多いので対応出来なくて…
0156nobodyさん2009/10/23(金) 12:22:52ID:???
リプライの応用で、特定のワードには反応しないってことはできるのかな?
0157nobodyさん2009/10/23(金) 12:44:10ID:???
phaさんのリプライ返すのを改変してTL中にキーワードがあったら返すのつくってるんだが
自分の発言にキーワードがあった場合やリプライ時でも返してしまう
if( $screen_name != $username){ //自分の発言時は反応しない
if(strpos($re["text"],"@".$username) === False){ //発言の中に@があった場合は反応しない
if(preg_match("/キーワード/",$re["text"])){ //特定のキーワードがあった場合反応する
$replies[] = $re;
}
}
}
こう改変してるんだけどどこがへんなのかな?
条件分岐がうまく動いてないみたいなんだけど
0158nobodyさん2009/10/23(金) 13:59:49ID:???
スクリプト自体は一切手を加えてないのに実際に投稿されるときとされないときがある。
txtファイルに登録してる発言内容が少ないので同じ発言がたまたま選択されて連投規制に引っかかったのか、
一度に投稿スクリプトを動かし過ぎてAPI規制に引っかかったのか…

同じ内容を続けて投稿してしまわないようなチェック機能とかあったらいいなあ。
適当なtxtファイルを用意して発言内容をそこに書き込む→発言前にそのファイルの内容をチェック、
選択した発言が同じなら発言選択をやりなおすとかだったら実現できるかな。
作ってみようかなあ。

cron-job.orgも登録してみたけどうまくいかないのでcygwin入れてみたけどさっぱりわかんないやorz
0159nobodyさん2009/10/23(金) 14:12:26ID:???
>>157
datファイルをつくってそこに最新のTLを蓄積
$host = "http://twitter.com/statuses/friends_timeline.xml";

ってやったほうがいいかも
0160nobodyさん2009/10/23(金) 14:26:03ID:???
>>158
全然投稿で着てないわけじゃないんでしょ?
だったらやっぱり重複制限に引っ掛かってるのかもしれないから
適当にtxtファイルの中身増やしてテストしてみたら?
0161nobodyさん2009/10/23(金) 16:46:40ID:???
cron-job.org落ちた?
0162nobodyさん2009/10/23(金) 16:49:29ID:???
落ちてるね
0163nobodyさん2009/10/23(金) 17:44:36ID:???
そういえば、rubyの本で人工無脳をつくる本があったけなぁー
アレどっかにつんであるはずだからさがして
twitterのbotで発言できるようにしてみるか

0164nobodyさん2009/10/23(金) 20:39:31ID:???
>>137のスクリプトでおはようをPOSTすると「おはよう」の返事+普通の@返しされるんだけど
他にもこういうひといない?
0165nobodyさん2009/10/23(金) 22:33:51ID:???
bot同士が会話してるせいでTL流れるのがハンパねえ
これって連投すると規制されるのか?
0166nobodyさん2009/10/23(金) 23:13:23ID:???
・直前の10ポストと同じ内容の投稿は受け付けない。>>68
・2時間で125以上ポスト出来ない(というメッセージが出たことある)

投稿規制はこの二つだったはず。後者はちょっと曖昧かも。
0167nobodyさん2009/10/24(土) 00:40:33ID:???
後者のpost規制の基準は曖昧だからな…変動してるらしいし
定期postの間隔がよっぽど短いとか
リプライ反応する間隔が2分とかで
毎度数十件のpostでもしなきゃされないんじゃね
0168nobodyさん2009/10/24(土) 00:53:48ID:???
レンタルサーバーでcronが安定してるのってどこがある?
cron-job安定しないんだよなー
それとも2分じゃなくて4〜6分間隔くらいにしたらまだましかね?
0169nobodyさん2009/10/24(土) 01:14:32ID:???
>>168
80code.com安定してるよー。現在は新規受付停止中だけど。
さくらのスタンダードとエックスサーバーもcron可だったと思うが、使った事無いので動作については分からん
0170nobodyさん2009/10/24(土) 01:54:14ID:???
>>169
調べてみるわー、ありがと
リプライ返しやTLから拾ってくるタイプだから分おきに
動かないときついわ
0171nobodyさん2009/10/24(土) 03:16:09ID:???
pha22さんのスクリプト改造して直近10件の投稿とかぶらないようにする改造してるんだけど、
なぜか同じ文字列を見つけてくれないorz
誰か助言プリーズ

//ログをチェックして直近10件の投稿と重複させない
//ログリストを読み込む
$logfile = "log.txt";
$logs = file_get_contents($logfile);
$logs = trim($logs);
$logs = preg_replace("@(\r\n|\r)@", "\n", $logs);
$logs = preg_replace("@\n+@","\n",$logs);
$logs = mb_convert_encoding($logs, 'UTF-8', 'EUC-JP,SJIS,ASCII,JIS,UTF-8');
$lo = explode("\n", $logs);

for ($c = 0; $c < count($lo); $c++){
if (strcmp($message,$lo[$c]) === 0){
//同じだった場合もう一回ランダム発言を取得しなおしてカウンタを0に戻す
//発言をランダムに一つ選ぶ
$message = $tw[array_rand($tw)];

//カウンタを戻す
$c = "-1";
}

}
0172nobodyさん2009/10/24(土) 03:24:11ID:???
cronいつの間にかneinなってた…
上でググるアプ使ってる人はどうやってるの?
0173nobodyさん2009/10/24(土) 03:29:14ID:???
>>171
$c = "-1";
0174nobodyさん2009/10/24(土) 10:28:47ID:???
>>173
ありがとう
出来た気がする。もうちょっとテストしてみるわ
0175nobodyさん2009/10/24(土) 10:47:44ID:???
「いつ・どこで・なにをする」をランダムに組み替えて発言するとか
相手の発言を引用する(○○だよ→○○なんだね)みたいなやり方教えて
0176nobodyさん2009/10/24(土) 11:24:30ID:???
指定した時間に、指定したアイコンに
自動的に複数回変更できるスクリプトないですか…ね?

ttp://ameblo.jp/liam7/entry-10363726388.html
ここ参考にしようと思ったらcurl使えなくて
0177nobodyさん2009/10/24(土) 11:33:14ID:???
>>172
上の人じゃないけどGAEでcronできたよ。

http://builder.japan.zdnet.com/sp/google-app-engine/story/0,3800086196,20371257,00.htm
http://code.google.com/intl/ja/appengine/docs/python/config/cron.html
http://code.google.com/intl/ja/appengine/docs/python/urlfetch/overview.html

↑ここ参考にした
0178nobodyさん2009/10/24(土) 11:58:22ID:???
お願いだー!
誰か、TL上のワード拾って反応するBOTのソースくれー!
バカなのは承知してるし勉強もしてるんだー
0179nobodyさん2009/10/24(土) 12:24:52ID:???
>>137のスクリプトって○分までは吐かないのか…
0180nobodyさん2009/10/24(土) 12:34:34ID:???
>>178
ググればいくらでもでてくる
0181nobodyさん2009/10/24(土) 14:40:42ID:???
>>137のスクリプトを置いて、試しに動かしたら運勢の結果がランダムではなくひとつずつ発言として全部出てきたんですが…。
IDとパス以外変更してないのになにこれ?
0182nobodyさん2009/10/24(土) 15:01:23ID:???
cronあってねーんじゃねーの
0183nobodyさん2009/10/24(土) 15:04:22ID:???
>>179
時間の奴はちょっと調べれば簡単に改変できるよ
date()あたりググればいいんじゃない
0184nobodyさん2009/10/24(土) 16:31:39ID:???
replyで何度試しても「〜分以内に受け取った@はないようです」と表示されます。
1〜2回うまく行ったけどあとはさっぱり
何か考えられる原因があったらご教授願います
01851842009/10/24(土) 16:56:22ID:???
解決しました。
@ユーザー名の後のスペースが全角になっていました…orz
お恥ずかしい限りですがご報告だけ。
0186nobodyさん2009/10/24(土) 23:17:12ID:???
>>177
ありがとう!やってみる!
0187nobodyさん2009/10/25(日) 00:51:07ID:???
昆虫みたいなbotをつくりたい
あれすごい
0188nobodyさん2009/10/25(日) 11:11:20ID:???
ttp://twitter.com/ooishi_bot
これみたいに一部分だけをランダムに組み替えて発言させるにはどうしたらいいの?
0189nobodyさん2009/10/25(日) 11:22:48ID:QovXst2Y
ttp://twitter.com/syoutengai
上記のように、特定の言葉(この場合「商店街」)がつぶやかれたものを検索して
自動的にRTするようなBOTの作り方をご存じの方、ご教示願います。
0190nobodyさん2009/10/25(日) 11:53:18ID:???
>>188
簡単な人工知能プログラムが必要。
bot技術とはちょっとかんけいない。
0191nobodyさん2009/10/25(日) 17:18:48ID:???
>>190
そんな高度な技術でもないだろ、
とりあえずphaさんのスクリプト例に取るとpost_random.phpのテキストファイルの内容を一行ずつ読み込んでランダムに一つ選択するところと
reply_random.phpのテキストファイル中の{name}を置き換えるところを応用してくっつければ出来る。スクリプト長くなるけど。
0192nobodyさん2009/10/25(日) 17:45:15ID:???
phaさんのだとPostに対してリプライ送るんじゃなくて「@ユーザーID」を
文頭においてPostしてるだけになるんだけど
ちゃんとしたリプライ送るようにするにはどうすればいい?
0193nobodyさん2009/10/25(日) 18:05:57ID:???
phaさんのscriptの、特定の単語を返すってやつで
"おはよ"と"オハヨ"のどちらにも対応させる(1セットで)には
どうすればいいのでしょうか?

↓な感じにしたいんですが
"おはよ|オハヨ"=> array(
 "おはよう",
 "おはよ!",
),
0194nobodyさん2009/10/25(日) 19:39:46ID:???
>>193
今のところそういう機能はないね。バージョンアップでつけるって言ってたけど
0195nobodyさん2009/10/25(日) 20:20:59ID:???
>>181
FTPでアスキーモードで転送できてなくて改行が変になってるのかも
FTPでアスキーモードを指定、とやってみたらどうかなあ
わかんないけど
0196nobodyさん2009/10/25(日) 21:19:37ID:???
セーフモードのPHPでcurl_opt設定を出来ないのは回避策はありますか?
DSOで。
0197nobodyさん2009/10/25(日) 21:22:31ID:???
>>194
ありがとう。バージョンアップ…待ちます。
0198nobodyさん2009/10/26(月) 02:00:49ID:???
自動フォロー返しやDM返しってどうやる?
0199nobodyさん2009/10/26(月) 03:07:52ID:???
>>192
@付きステータスのアップデート時に、in_reply_to_status_id を付ける。
詳しくはAPI仕様書を読んでね。

>>198
適当な間隔でフォロワーやDMのリストを取得して処理すればいい。
API制限もあるし、1度処理したらファイルに記録しておく必要があると思う。
メール通知を利用するって手もありそうだけど、
メールが来ないことが結構あるような・・・・。
0200nobodyさん2009/10/26(月) 18:23:57ID:???
>>199
仕様書読みながらphaさんの改変してin_reply_to_status_id付けようとしてるんだが
updateを使ってなくてどこにいれればいいのかわからん
reply_random.phpじゃなく
Twitter.phpの
function setUpdate($value)
{
return $this->_setData($this->sm_update,
array(
'status' => urlencode($value), in_reply_to_status_id => $id//←ここ
),
array(
'Content-Type' => 'application/x-www-form-urlencoded'
));
}
ここにいれればいいの?
0201nobodyさん2009/10/26(月) 18:25:16ID:???
>>189
特定のつぶやきを検索するのには検索用APIが用意されているし、
RTの仕方についてはPOST時に適当な書式に沿ってRTを付けるだけ。
(retweet関係のAPIって正式に公開された?)
それらを適度に組み合わせれば清むので、
別段特殊な技術が必要な訳ではないから何も難しいことはないかと。


ところで、twitter.com/syoutengai で検索したら
なにやらひどいコメントが。
ttp://www.google.co.jp/search?pws=0&q=twitter.com/syoutengai
0202nobodyさん2009/10/26(月) 18:29:46ID:???
>>198
自動リムーブだけど1日に1回、friends/idsとfollowers/idsの差分とって処理してる。
フォローも似たような案配でいけるんじゃない?

>199
in_reply_to_status_idって返信先ステータスのIDを指定するでいいんだよね?
送出前のヘッダを出力してみるとin_reply_to_status_idの指定がちゃんとしてあるんだけど、
レスポンスみると無視されてるみたいでハマってるんだ
02032002009/10/26(月) 18:36:56ID:???
>>200
似たような事してる人がいた!
自分はこう書き換えした
function setUpdate($value)
{
if(is_array($value)){
return $this->_setData($this->sm_update,
array(
'status' => urlencode($value['status']),
'in_reply_to_status_id'=>$value['in_reply_to_status_id']
),
array(
'Content-Type' => 'application/x-www-form-urlencoded'
));
}else{
return $this->_setData($this->sm_update,
array(
'status' => urlencode($value)
),
array(
'Content-Type' => 'application/x-www-form-urlencoded'
));
}
}
で、スクリプト側の方で
$st->setUpdate(array('status'=>$status,'in_reply_to_status_id'=>$in_reply_to_status_id));
みたいに書いてたよ
0204nobodyさん2009/10/26(月) 18:53:10ID:???
botに好感度みたいなのを実装するのは無理?
あいさつをちゃんとしている人(Replyでおはようとか)にはやさしくなっていくとか…
0205nobodyさん2009/10/26(月) 19:47:55ID:???
可能です
0206nobodyさん2009/10/26(月) 20:33:51ID:???
>>203
おお、助かった!ちょっとやってみ…たらできんかった
エラー起こってないから単にin_reply_to_status_idが取得できてないだけなんかな
0207nobodyさん2009/10/26(月) 20:39:34ID:???
Basicでぼっとつくりたいんですけど・・・
0208nobodyさん2009/10/26(月) 22:11:17ID:???
>>204
たまごっちみたいなもんか
0209nobodyさん2009/10/26(月) 22:31:38ID:???
>>208
うんこながしたりプロテインのませたりするんだな
0210nobodyさん2009/10/27(火) 00:08:03ID:???
necotterってそんな感じじゃなかったっけ
0211nobodyさん2009/10/27(火) 00:34:10ID:???
そのうち育てたbot同士で対決させるんだろ
0212nobodyさん2009/10/27(火) 00:36:04ID:???
>>203
これの場合
$in_reply_to_status_id = $replies2[$i]["in_reply_to_status_id"];
$status = "@".$replies2[$i]["screen_name"]." ".$text;
でいいのか?
0213nobodyさん2009/10/27(火) 02:46:16ID:???
銀さんとこのソースで、寝る時間が1時〜6時ですが
それを12時〜19時までにしたいのですが、うまくいきません

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

[1-6]が1時〜6時、{0,1}が単位が0か1の場合というのは何となく分かるのですが
2桁にしたいので{0,1}を{0,2}や{0,1,2} {0-2}にしてもだめでした…
どうすればいいのでしょうか?

それから、翻訳機能を持たせたいのですが、ソースを公開してるところはありませんか
@で特定の単語をくれたら翻訳してくれる…というのをやってみたいです。
『@bot +++たん、[◆◆]を翻訳して』とreplyしたら『@**** 『●●』だよ』というやつです。
ご存知の方、教えてください
0214nobodyさん2009/10/27(火) 13:25:06ID:???
>>212
ごめん>202=203なので>203のソースは上手くいかないんだ
phaさんのソースは知らんがin_reply_to_status_id=返信先の記事idだと思ったから
Services_Twitterの出力結果とAPI仕様書照らしあわせて
$in_reply_to_status_id = $replies2[$i]->id;
ってしてる。

>>213
preg_matchじゃなくて単に「$now_gが12より大きく、19より小さかったら」って書けば?
0215nobodyさん2009/10/27(火) 15:03:13ID:???
毎月の決まった日時に決まった台詞を吐くbotはつくれないでしょうか
0216nobodyさん2009/10/27(火) 15:13:33ID:???
phaさんの所でBOT作らせてもらったんだけど、特定の単語にしか反応しないようにって出来ないかな。
通常のリプライなしにしたいんだけどできる?例えば「おはよう」にしか反応しないとか。
0217nobodyさん2009/10/27(火) 15:16:13ID:???
>>215
毎月の決まった日時にだけ起動させればいいんじゃないの?
0218nobodyさん2009/10/27(火) 17:29:00ID:???
>>213
214氏が指摘している通り、わざわざpreg_matchを使う必要が元々無いよ。

翻訳機能のソース以前に、自前で自然言語の辞書を持つ事に結構な
リソースが必要なので、大抵は他を呼び出してると思うんだけど。
「翻訳 API」とかで検索すれば結構あるので、それを使うのが手っ取り早い。
特定の単語しか翻訳しない仕様なら、それこそ鸚鵡返しbotで十分だろうし。
0219nobodyさん2009/10/27(火) 18:42:15ID:???
>>216
できるよ
0220nobodyさん2009/10/27(火) 19:28:32ID:???
phaさんのを見てbot作って、いままで普通に動いてたんだけど
なぜかいきなりエラーになったみたい。
発言はするんだけどリプライしなくなったっぽい。

reply_random.php にアクセスすると
Parse error: syntax error, unexpected '{', expecting ')' in /home/atumari.net/pp259583/public_html/reply_pattern.php on line 181
というのが出るんだけど、これって一体なに?
どこが原因でエラーになってるのかさっぱりわからない…
0221nobodyさん2009/10/27(火) 19:52:06ID:???
>>220
行末の;が抜けてるとか
それよりスクリプト置いてるURL晒さないほうがいい、早く変えれ
0222nobodyさん2009/10/27(火) 20:07:10ID:???
>>221
ありがとう!解決した
URL変えてくる。すみません
0223nobodyさん2009/10/27(火) 22:49:08ID:???
in_reply_to_status_idの付加方法がわからん
誰か教えてくれ
0224nobodyさん2009/10/27(火) 23:25:26ID:???
in_reply_to_status_idを付加したバージョン作った
http://pha22.net/text/twitterbot.html
0225224=@pha2009/10/27(火) 23:29:15ID:???
>>203の方法でいけるはずなのになんでできないんだろう、って思ってソースをよく読んでみたら、
Services/Twitter/Connector.phpの95行目でリクエストを組み立てるときに
$body .= '&';
ってやってるのが原因だった
$body .= '&';
に変えたらできるようになった。
他にも特定の単語に反応するときに正規表現を使えるようにもしました。
0226nobodyさん2009/10/27(火) 23:32:40ID:???
>>224
生きるのに疲れたのでbotになりたいんですけどどうーすれば良いですか?
0227nobodyさん2009/10/28(水) 00:02:18ID:???
>>224
おつかれさまです。
1つお伺いしたいのですが、バージョンアップをする場合は
tw.txt以外の全てのファイル(Servicesフォルダも)を
入れ替えればいいのでしょうか?
0228nobodyさん2009/10/28(水) 00:03:51ID:???
>>224
乙です、やろうとしてたことがかなり出来るようになってて嬉しい!
0229nobodyさん2009/10/28(水) 00:54:09ID:???
>>227
そうですそうです
0230nobodyさん2009/10/28(水) 13:07:25ID:???
正規表現面倒くさい…
単純に|で区切るやつにして欲しいです
0231nobodyさん2009/10/28(水) 13:53:35ID:???
え…?
0232nobodyさん2009/10/28(水) 14:06:33ID:???
>>230
|が正規表現…だよね?
0233nobodyさん2009/10/28(水) 15:50:24ID:???
phaさんの新しいやつの事でしょ
0234nobodyさん2009/10/28(水) 17:58:20ID:???
>>224=225
うへえ、どうりでヘッダ見てても分からないはずだーありがとうございました!
0235nobodyさん2009/10/28(水) 19:41:20ID:???
>>225は
$body .= '&amp;';
を
$body .= '&';
に変えたということです。
2chって実体参照通るのね。
0236nobodyさん2009/10/28(水) 19:59:24ID:???
>>224のスクリプトをDLして弄ってます。
正規表現っていうのを初めて使うのですが

『おーい』『おーーーーーい』等の『ー』の数が決まっていない単語の
どちらにも対応させるにはどう書けばいいのでしょうか?

おー*い、おー+い、おー?い、おー(ー)?い ではスルーされて行き詰まってます…
■ このスレッドは過去ログ倉庫に格納されています