忍者ブログ

bot制作まとめ

twitterのbot基本動作まとめ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

はじめに

このブログはプログラミングができなくてもつくれるTwitter botの作り方にて配布されているEasyBotter(Ver2.0)によるbotの基本的動作方法をまとめたものです。

bot制作の大まかな流れ

1.bot制作用ファイルのダウンロード
2.プログラムをいじってみる
3.OAuht認証を得る
4.FTPでアップロード
5.cron設定をしてみる

ここでは主に2をメインに話して行こうと思います。他の項目も初心者さんでも分かるように説明はするつもり。
ただ私のプログラミング知識はひよっこ程度なのであくまでも基本的な動作の話しかしてないです。あしからず。
PR

2-2.TL発言とリプライ発言の時間間隔をずらしたい

cronでのプログラム実行時間設定というのは一つしか出来ません。
なのでこのままではTL実行時間とリプライ実行時間が一緒なbotしか出来ません。
今回はTL実行を10分間隔、リプライ反応を2分間隔で行いたいと仮定して作ってみようと思うのでcronの設定を10分に設定してみたとします。
すると、先程の2-1で述べた最後のリプライ用プログラム

*@付きリプライの部分
if(date("i") % 2 === 0){
$response = $eb->reply(2,"not.txt","reply_pattern2.php");
}

*TL上で反応する部分
if(date("i") % 2 === 0){
$response = $eb->replyTimeline(2,"reply_pattern.php");
}

上記を用いている場合、2分間隔でリプライは実行されません。
あくまでもbotのプログラムはcronが動く時しか実行してもらえないので2分毎にリプライ反応の単語を取得したとしてもプログラム自体は動かないのです。よって10分毎の発言しか行えません。
そこでcronの実行間隔を2分にしたらリプライもしてもらえるの?という事になりますが、なります。……が、このままではTL発言も2分間隔で行われてしまします。それだと今回は困る、ので。
TL実行プログラム(今回はランダムにpostする方を使用)が最初の設定では

 $response = $eb->postRandom("data.txt");

と、なっていますがリプライ反応用プログラムのように

if(date("i") % 10 === 0){
 $response = $eb->postRandom("data.txt");
}

と書き加えてみたらcronの設定を2分毎にしても10分間隔でTL発言が行われ万事オッケーです。20分間隔でTL発言したいときは「date("i") % 10 === 0」を「date("i") % 20 === 0」に。30分間隔でしたい時は「date("i") % 30 === 0」に。
あ、cron設定はリプライ反応かTL発言のどちらかの実行間隔が狭い方に合わせて設定してやって下さいましね。

何でそうなるの??て人向けに以下はプログラムの解説。
まず今回はプログラム文法の一つとしてif文を用いてます。
ifと言えば、中学校とかの英語でもおなじみ「もし~ならば…」みたいなやつですね。
んで、プログラミングで使われるif文の基本構成は

if( 条件 ){
 条件が満たされたときに実行される部分
}

これをもう少し発展させて条件によって実行するものを変えたいときは

if(条件A){
 条件Aが満たされたときに実行される部分
}
else if(条件B){
 条件Bが満たされたときに実行される部分
}

と、なり、else ifは何個作ってもオッケーなので

if(条件A){
 条件Aが満たされたときに実行される部分
}
else if(条件B){
 条件Bが満たされたときに実行される部分
}
else if(条件C){
 条件Cが満たされたときに実行される部分
}
else if(条件D){
 条件Dが満たされたときに実行される部分
}

とかいうのもアリ。
簡単な例としては(プログラミング一切無視しての日本語で例えてみると)

if(魚が食べたい){
 焼き魚定食にする
}
else if(お肉が食べたい){
 焼肉定食にする
}
else if(洋食が食べたい){
 パスタを食べる
}
else if(お腹が空いてない){
 ご飯は食べない
}

とかいうプログラムだった場合(凄くデタラメですが)、もしその日の気分が「洋食が食べたい」という条件と一致した場合「パスタを食べる」を実行します。他の部分は条件が満たされないので一切実行されません。

まぁ今回は一番簡単な

if( 条件 ){
 条件が満たされたときに実行される部分
}

↑これのみを扱います。
そしてTL発言用プログラムの場合の条件は

date("i") % 10 === 0

と、なってますね。次はその条件の意味の説明。
先ず「data("i")」というのは時間の「○○時△△分」の「△△」を受け取る(表す)関数です。数学で「y=5x+3」とかいう「x」や「y」の部分。
次に「%」はプログラミングにおいて用いられる演算子(数学での+や÷といった種類)の一つで除算の余りを求める演算子です。
よって「date("i") % 10 」というのは「date("i") 」を10で割った時の余りを求める計算式になってたりします。
これを「===0」で結ぶ事により「date("i")を10で割った時の余りが0だったらTL発言用プログラムを実行する 」という条件が完成します。
例えば、cronで実行された時の時間が9時52分だったとき、「date("i") 」は「52」なので「52÷10=5…2」という計算なので求まる余りは「2」。条件は満たされないのでTL発言のプログラムは実行されません。
以上から考えると10で割ったときに余りが0になる条件が満たされるのは 0分、10分、20分、30分、40分、50分 の時。
だから結果的に10分間隔でTL発言プログラムを実行して貰えるわけです(`・ω・´)シャキーン!
応用して「date("i") % 20 」にすれば 0分、20分、40分 の時に条件が満たされるので20分間隔でプログラムを実行してもらえます。

そんな感じで今回の説明終わり。

2-1.@付きリプライで反応させたい言葉とTL上で反応させたい言葉を区別したい

前述でも述べたようにTL上で「私、このゲーム好きなんだよね」と言ってbotが「私のこと好きなの?!」と勘違いして反応されても困るんです。
そこで、
・TL上では「好き」に反応させたくない
・@付きの発言のみ「好き」に反応させたい
という事になるので。
TL上で反応させたいワードを書き込むファイルをreply_pattern.phpに書くならば、それと中身はそのまんま流用してreply_pattern2.phpとか作ってそっちに@付きの発言のときに反応させたいワードを書けば済む話なんです。
そしたらreply_pattern.phpに「好き」という言葉は入れず、reply_pattern2.phpにのみ「好き」という言葉を登録しとけば良いわけですね。簡単なお話。
次に。@付きリプライの時の反応ワードを入れたのをreply_pattern2.phpとして作ったとして。
TL上では反応ワードが無い限りreply_pattern.php内の言葉を喋ったりはしないのですが、@付きでbot宛てに何か言われた場合、botはreply_pattern2.php内の反応ワードと一致するものがないか探します。
ファイルのダウンロードされた当初の@付きで反応するリプライプログラムはbot.phpでは以下のようになっています。

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

まず、@付きの反応ワードはreply_pattern2.phpに書き込むことにしたので

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

になりますね。
「2」の数値は自分がリプライを実行させたい間隔に合わせて下さい。私は2分間隔が良かったので「2」のままです。
ここで、data.txtにbotの喋らせたい言葉を色々書き込んでいた場合、もし受け取った@付きリプライの内容にreply_patter2.phpの反応ワードと一致するものがなかった場合、botはdata.txt内の何かを相手に返す事になります。
例えばbotが「○○」、フォロワーが「□□」というtwitter idだったとして(超適当)

□□「@○○ ご飯食べに行こう!」

と、フォロワーさんから言われても「ご飯」や「食べに」なんて言葉が登録されてなくてdata.txt内の言葉をランダムに掃きだし

○○「@□□ おはよう!今日も良い天気だね!」

とか言われるより

○○「@□□ ごめん。上手く聞き取れなかったみたいだ…」

なんて言われた方が現実味がありますよね。
なので、data.txtと同じ要領で反応ワードに引っ掛からなかった時の返答を書き込んだテキストファイルを(ここではnot.txtとして)作成します。(上手く聞こえなかった・今忙しいの・まだその言葉は勉強中etc...を書き込んでみて下さいな)
で、プログラムは以下のようになります。

$response = $eb->reply(2,"not.txt","reply_pattern2.php");

また、確実に2分間隔で実行させる為に私はこんな感じでプログラムに書き足しています。

*@付きリプライの部分
if(date("i") % 2 === 0){
$response = $eb->reply(2,"not.txt","reply_pattern2.php");
}

*TL上で反応する部分
if(date("i") % 2 === 0){
$response = $eb->replyTimeline(2,"reply_pattern.php");
}

2分間隔じゃなくて5分にしたいなら「date("i") % 5 === 0」「replyTimeline(5,"reply_pattern.php");」のように数値を変えればいいだけです。
この辺のifとかの説明はまた次の時にでも。

2.プログラムをいじってみる

先ずどんな動作をbotにしてほしいかという事を考える。

TL発言は10分間隔が良いけどリプライは反応貰うのに10分待つのはもどかしい。2分くらいでさっさとお返事が貰いたい。
botも人間のように時間の流れの中を生きているようにさせてもみたい。(朝起きて、お昼になったらお腹が空いたとかぼやいて、夜は寝る、とか)

あんまり難しい事は考えるのが苦手なので取り敢えず基本的にそんな動きが出来てたら良いんじゃね?と。
そんな感じで私はbotを作ってみたり、なんたり。
そこで生まれたのがこの子達。
サクラ大戦/マリア・タチバナbot*桐島カンナbot*メル・レゾンbot

ただダウンロードしたファイルのdata.txtやreply_pattern.phpをいじるだけじゃcronで設定した時間ごとに同時にTL発言して、リプライ反応を返す事しか出来ません。cron設定が10分毎なら10分間隔でTL発言もリプライ反応もします。2分間隔でリプライは返せません。
また、このままでは24時間data.txtに入ったものをpostし続けるので例えばdata.txtに「おはよう」という言葉を入れてた場合、夜に「おはよう」なんて言い出しかねません。
しかもこの段階のbot.phpでのプログラムのままではリプライ反応もreply_pattern.phpに入った反応ワードに反応するなら@付きのリプライでも、@無しのTL内にあった場合でも反応してしまうので「私、このゲーム好きなんだよね」と自分が発言して自分のフォローしているbotのリプライ反応ワードで「好き」があった場合、「私の事が好きなの?恥ずかしいな…でも有難う!」なんて言われちゃったりして。
そんな空気読まないbotってどうなのw
…と、なるわけです。
そういうのを避けるためにもプログラムをいじってやる必要があったり。
ただ24時間data.txt内の言葉をpostしとけば良いよーって人は気にしなくても良いのですが。このブログはそういう事を気にしてる人向けのブログです←

そんな感じで、私が作ってきた子達のような動作をするにはどういうプログラムを組めばいいのか、ここからはゆるーい解説をしていきたいと思います。

*TOPICS*
@付きリプライで反応させたい言葉とTL上で反応させたい言葉を区別したい
TL発言とリプライ発言の時間間隔をずらしたい
・時間帯別に違う言葉を喋らせてみたい

主にこの3つについて話そうと思います。

1.bot制作用ファイルのダウンロード

プログラミングができなくてもつくれるTwitter botの作り方の最新版(バージョン2.XX)をダウンロードして下さい。(XXは内容が更新されるたびに数字が変わります)
zipファイルを解凍したらフォルダ内には色々入ってますが基本扱うのは
・data.txt
・reply_pattern.php
・bot.php
・setting.php
のみです。
data.txtやsetting.phpの編集に関してはダウンロード元サイトで確認して下さい。
ただ私の場合data.txtは使わず色んなテキストファイルを新しく作ったりしてますがそれは追々。
 

カレンダー

08 2025/09 10
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリー

フリーエリア

最新CM

[11/25 砂糖]

最新TB

プロフィール

HN:
うずら
性別:
非公開

バーコード

ブログ内検索

P R

忍者ブログ [PR]
Template by repe