忍者ブログ
パソコンやネットに関係あるかも、と思ったネタのストック場。
[23] [6] [22] [21] [20] [19] [18] [17] [16] [15]
×

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

 前回書いた時間帯指定が相当不親切だと自分でも思うので、色々具体例を挙げていくことにしました。
 ついでに、確率と組み合わせる方法なんかも載せるつもりです。

 なお、私はプログラミングは素人通り越して、分からない人です。勉強した事もありません。
 なので、プロの方から見るととんでもない事を書いている場合があります。
 そういうのを発見した場合はコメント・拍手・ツイッターなどで報告いただければ訂正します。
 あくまで、よく分からないけど、こうやったら上手くいったよ!という例です。


 なお、ここで用いているEasyBotterのプログラムの配布元は以下です。
プログラミングができなくても作れるTwitter botの作り方


 どうしてもそのサイトが見つからなかった場合のみ、以下からも可。
ダウンロード(zip) ver.2.05

 ただし、最新版が更新されている可能性はありますので、できれば大元のサイトに出かけて下さい。設置方法とかトラブルシューティングとかもありますので。

 以下、続きで書いてみます。

.

+ + + + + + + + + +
 実は『EasyBotter 非公式wiki』や『bot製作一日目。』でも解説されているので、今更ここで書かなくてもそっちを見てもらえれば良いんですが、どこまで滅茶苦茶できるのかという実例提示で。

 まずは元々のプログラムに挙げられているものの軽い解説から。
 ここでひたすら出てくるのはif構文です。if構文は、「if(【条件】){【条件にあてはまったら実行する事柄】;}」という構文で、それ以外のものを続ける場合はelseで続けられます。elseの後ろに更にif構文を繋げる事も可能です。

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

 date("i")は分を表します。一桁の時は前に0をつけて01などと書く必要のある関数です。この関数は00から59までの数字を出します。
 % 15は、この関数を15で割った余りを表すようです(調べてないので本当かは保証しません)。この余りが0、すなわちdate("i")を15で割った場合に0になる時である0分、15分、30分、45分にデータをポストしますよ、という記述です。


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

 date("G")が24時間単位での時間を表します。一桁の時は、一桁で書きます。これが12未満なら午前のデータを、それ以外なら午後のデータをポストしますよ、という記述です。


//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");
}

 date("n")は月を表す関数で、一桁の時は先頭に0をつけないものです。まず、これが2の時、という条件です。
 &&はandとも書く事ができ、「かつ」という条件を表します。2月、かつ、というわけです。
 date("j")は日を表す関数で、これも一桁の時には一桁で書きます。今回は、これが14の時、という意味ですね。
 すなわち、2月かつ14日の時、すなわち2/14にvalentine.txtのデータを、それ以外はdata.txtのデータを使います、という記述です。

 ここで&&が出てきました。これで条件を更に縛っていくことができます。「または」を表すのは||またはorです。


 以上を踏まえて、私が実際に運用しているbotの構文を晒してみます。


・シンプルに時間帯別ツイートが一定割合で出てくるもの

if(date("G") == 7 && rand(0,4) > 1){
$response = $eb->postRandom("data_07.txt");
}elseif(date("G") == 12 && rand(0,4) > 1){
$response = $eb->postRandom("data_12.txt");
}elseif(date("G") == 15 && rand(0,4) > 1){
$response = $eb->postRandom("data_15.txt");
}elseif(date("G") == 17 && rand(0,4) > 1){
$response = $eb->postRandom("data_17.txt");
}elseif(date("G") == 19 && rand(0,4) > 1){
$response = $eb->postRandom("data_19.txt");
}elseif(date("G") == 23 && rand(0,4) > 1){
$response = $eb->postRandom("data_23.txt");
}else{
$response = $eb->postRandom("data.txt");
}

 何か初っ端から長くてすみません。
 これは、7時、12時、15時、17時、19時、23時に3/5の確率で別途用意したファイルからポストし、他の場合は通常ポストをするものです。
 rand関数に関しては、『EasyBotterで反応の有無をランダム化する。』にて解説しましたので今回は割愛。
 こうして、確率を混ぜつつ条件を設定する事も出来ます。
 なお、このプログラムに関しては7時から23時まで1時間ごとにcronで叩いてますが、15分毎や30分毎のポストにするならこれに更に && date("i") % 15 == 0 や && date("i") % 30 == 0 を足すとか、時報代わりにするなら && date("i") == 0 を足すなりして下さい。


・曜日と時間帯を指定してリプライを変えるもの

if(date("w") == 0 && date("G") < 4){
$response = $eb->reply(3, "", "reply_pattern_gym.php");
} elseif(date("w") == 0 && date("G") >= 20){
$response = $eb->reply(3, "", "reply_pattern_gym.php");
} else{
$response = $eb->reply(3, "", "reply_pattern_normal.php");
}

 日曜の0時から4時、20時から24時までは特別なリプライを返し、それ以外は通常のリプライを返すパターンです。
 こっちの方が上よりも見た目シンプルでしたね…。
 if構文は上から処理されていきますので、狭い条件を上に持ってくるのがコツです。
 date("w")は曜日を表す関数で、0から6まであり、順に日曜から土曜までを指します。

 これを更にややこしく…というか、全部の曜日で時間帯も細かく設定したのが以下。

if(date("w") == 0 && date("G") < 4){
$response = $eb->reply(6,"","reply_sun_n.php");
} elseif(date("w") == 0 && date("G") < 10){
$response = $eb->reply(6,"","reply_sun_m.php");
} elseif(date("w") == 0 && date("G") < 20){
$response = $eb->reply(6,"","reply_sun_a.php");
} elseif(date("w") == 0 && date("G") >= 20){
$response = $eb->reply(6,"","reply_sun_n.php");
} elseif(date("w") == 1 && date("G") < 4){
$response = $eb->reply(6,"","reply_mon_n.php");
} elseif(date("w") == 1 && date("G") < 10){
$response = $eb->reply(6,"","reply_mon_m.php");
} elseif(date("w") == 1 && date("G") < 20){
$response = $eb->reply(6,"","reply_mon_a.php");
} elseif(date("w") == 1 && date("G") >= 20){
$response = $eb->reply(6,"","reply_mon_n.php");
} elseif(date("w") == 2 && date("G") < 4){
$response = $eb->reply(6,"","reply_tue_n.php");
} elseif(date("w") == 2 && date("G") < 10){
$response = $eb->reply(6,"","reply_tue_m.php");
} elseif(date("w") == 2 && date("G") < 20){
$response = $eb->reply(6,"","reply_tue_a.php");
} elseif(date("w") == 2 && date("G") >= 20){
$response = $eb->reply(6,"","reply_tue_n.php");
} elseif(date("w") == 3 && date("G") < 4){
$response = $eb->reply(6,"","reply_wed_n.php");
} elseif(date("w") == 3 && date("G") < 10){
$response = $eb->reply(6,"","reply_wed_m.php");
} elseif(date("w") == 3 && date("G") < 20){
$response = $eb->reply(6,"","reply_wed_a.php");
} elseif(date("w") == 3 && date("G") >= 20){
$response = $eb->reply(6,"","reply_wed_n.php");
} elseif(date("w") == 4 && date("G") < 4){
$response = $eb->reply(6,"","reply_thu_n.php");
} elseif(date("w") == 4 && date("G") < 10){
$response = $eb->reply(6,"","reply_thu_m.php");
} elseif(date("w") == 4 && date("G") < 20){
$response = $eb->reply(6,"","reply_thu_a.php");
} elseif(date("w") == 4 && date("G") >= 20){
$response = $eb->reply(6,"","reply_thu_n.php");
} elseif(date("w") == 5 && date("G") < 4){
$response = $eb->reply(6,"","reply_fri_n.php");
} elseif(date("w") == 5 && date("G") < 10){
$response = $eb->reply(6,"","reply_fri_m.php");
} elseif(date("w") == 5 && date("G") < 20){
$response = $eb->reply(6,"","reply_fri_a.php");
} elseif(date("w") == 5 && date("G") >= 20){
$response = $eb->reply(6,"","reply_fri_n.php");
} elseif(date("w") == 6 && date("G") < 4){
$response = $eb->reply(6,"","reply_sat_n.php");
} elseif(date("w") == 6 && date("G") < 10){
$response = $eb->reply(6,"","reply_sat_m.php");
} elseif(date("w") == 6 && date("G") < 20){
$response = $eb->reply(6,"","reply_sat_a.php");
} else{
$response = $eb->reply(6,"","reply_sat_n.php");
}

 全ての曜日において、0時から4時、4時から10時、10時から20時、20時から24時までで読み込むファイルが違います。
 上から順に読み込まれるため、まず4時未満で反応させる。その次はそれ以外、すなわち4時以後からになるので10時未満という設定だけで4時から10時になります。同じように10時から20時を設定。最後だけ、20時以後で設定すれば終わり。

 本当はこれだけの記述になるとswitch構文なるものを使った方が良いらしいのですが、理屈が上手く分からず。理解できた時には追記するなり書き直すなりします。
 なお、これはリプライの記述ですが、通常ポストなどで15分毎や30分毎のポストにするならこれに更に && date("i") % 15 == 0 や && date("i") % 30 == 0 を足すとか、時報代わりにするなら && date("i") == 0 を足すなりして下さい。


 最後に、馬鹿みたいに条件重ねた記述がこちら。
 最早バカの領域。

if(date("n") % 4 == 1 && date("G") == 0){
$response = $eb->postRandom("spring_mid.txt");
} elseif(date("n") % 4 == 1 && date("G") == 5){
$response = $eb->postRandom("spring_morning.txt");
} elseif(date("n") % 4 == 1 && date("G") == 10){
$response = $eb->postRandom("spring_noon.txt");
} elseif(date("n") % 4 == 1 && date("G") == 17 && date("w") == 0){
$response = $eb->postRandom("spring_evening_sun.txt");
} elseif(date("n") % 4 == 1 && date("G") == 17 && date("w") == 2){
$response = $eb->postRandom("spring_evening_tue.txt");
} elseif(date("n") % 4 == 1 && date("G") == 17 && date("w") == 4){
$response = $eb->postRandom("spring_evening_thu.txt");
} elseif(date("n") % 4 == 1 && date("G") == 17 && date("w") == 5){
$response = $eb->postRandom("spring_evening_fri.txt");
} elseif(date("n") % 4 == 1 && date("G") == 17 && date("w") == 6){
$response = $eb->postRandom("spring_evening_sat.txt");
} elseif(date("n") % 4 == 1 && date("G") == 17){
$response = $eb->postRandom("spring_evening_mon.txt");
} elseif(date("n") % 4 == 1 && date("G") == 20){
$response = $eb->postRandom("spring_night.txt");

} elseif(date("n") % 4 == 2 && date("G") == 0){
$response = $eb->postRandom("summer_mid.txt");
} elseif(date("n") % 4 == 2 && date("G") == 4){
$response = $eb->postRandom("summer_morning.txt");
} elseif(date("n") % 4 == 2 && date("G") == 9){
$response = $eb->postRandom("summer_noon.txt");
} elseif(date("n") % 4 == 2 && date("G") == 19 && date("w") == 0){
$response = $eb->postRandom("summer_evening_sun.txt");
} elseif(date("n") % 4 == 2 && date("G") == 19 && date("w") == 2){
$response = $eb->postRandom("summer_evening_tue.txt");
} elseif(date("n") % 4 == 2 && date("G") == 19 && date("w") == 4){
$response = $eb->postRandom("summer_evening_thu.txt");
} elseif(date("n") % 4 == 2 && date("G") == 19 && date("w") == 5){
$response = $eb->postRandom("summer_evening_fri.txt");
} elseif(date("n") % 4 == 2 && date("G") == 19 && date("w") == 6){
$response = $eb->postRandom("summer_evening_sat.txt");
} elseif(date("n") % 4 == 2 && date("G") == 19){
$response = $eb->postRandom("summer_evening_mon.txt");
} elseif(date("n") % 4 == 2 && date("G") == 21){
$response = $eb->postRandom("summer_night.txt");


} elseif(date("n") % 4 == 3 && date("G") == 0){
$response = $eb->postRandom("autumn_mid.txt");
} elseif(date("n") % 4 == 3 && date("G") == 6){
$response = $eb->postRandom("autumn_morning.txt");
} elseif(date("n") % 4 == 3 && date("G") == 10){
$response = $eb->postRandom("autumn_noon.txt");
} elseif(date("n") % 4 == 3 && date("G") == 17 && date("w") == 0){
$response = $eb->postRandom("autumn_evening_sun.txt");
} elseif(date("n") % 4 == 3 && date("G") == 17 && date("w") == 2){
$response = $eb->postRandom("autumn_evening_tue.txt");
} elseif(date("n") % 4 == 3 && date("G") == 17 && date("w") == 4){
$response = $eb->postRandom("autumn_evening_thu.txt");
} elseif(date("n") % 4 == 3 && date("G") == 17 && date("w") == 5){
$response = $eb->postRandom("autumn_evening_fri.txt");
} elseif(date("n") % 4 == 3 && date("G") == 17 && date("w") == 6){
$response = $eb->postRandom("autumn_evening_sat.txt");
} elseif(date("n") % 4 == 3 && date("G") == 17){
$response = $eb->postRandom("autumn_evening_mon.txt");
} elseif(date("n") % 4 == 3 && date("G") == 20){
$response = $eb->postRandom("autumn_night.txt");

} elseif(date("n") % 4 == 0 && date("G") == 0){
$response = $eb->postRandom("winter_mid.txt");
} elseif(date("n") % 4 == 0 && date("G") == 7){
$response = $eb->postRandom("winter_morning.txt");
} elseif(date("n") % 4 == 0 && date("G") == 11){
$response = $eb->postRandom("winter_noon.txt");
} elseif(date("n") % 4 == 0 && date("G") == 17 && date("w") == 0){
$response = $eb->postRandom("winter_evening_sun.txt");
} elseif(date("n") % 4 == 0 && date("G") == 17 && date("w") == 2){
$response = $eb->postRandom("winter_evening_tue.txt");
} elseif(date("n") % 4 == 0 && date("G") == 17 && date("w") == 4){
$response = $eb->postRandom("winter_evening_thu.txt");
} elseif(date("n") % 4 == 0 && date("G") == 17 && date("w") == 5){
$response = $eb->postRandom("winter_evening_fri.txt");
} elseif(date("n") % 4 == 0 && date("G") == 17 && date("w") == 6){
$response = $eb->postRandom("winter_evening_sat.txt");
} elseif(date("n") % 4 == 0 && date("G") == 17){
$response = $eb->postRandom("winter_evening_mon.txt");
} elseif(date("n") % 4 == 0 && date("G") == 19){
$response = $eb->postRandom("winter_night.txt");

}

 本当はswitch構文で書けたらどれだけスマートか…!
 1時間ごとにcronで叩いているbotの通常ポスト用の記述です。
 ぶっちゃけるとポケモンBWの季節や時間帯を教えてくれるbotで、故に4ヶ月ごとにツイート内容が変わるという訳ですよ。それが最初の方のdate("n") % 4 == ○の記述です。月を4で割った余りで春夏秋冬を規定してます。
 次に規定してるのが時間帯。更に、夕方のみ、ロイヤルイッシュ号という曜日ごとに景品の変わるイベントのせいで曜日指定がくっついてます。


 これだけ具体例を挙げてみましたが、何かの参考になりましたでしょうか。もっと解説を加えた方が良い場合などは連絡して下さい。また、もっとスマートな記述があれば教えて下さると大変助かります。

拍手

PR
この記事にコメントする
お名前
タイトル
文字色
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字
管理人のみ閲覧可能にする    
この記事へのトラックバック
この記事にトラックバックする:
カレンダー
04 2024/05 06
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 31
ブログ内検索
最新コメント
[03/08 ゾーホージャパン]
最新トラックバック
プロフィール
HN:
木菟 伶
性別:
非公開
職業:
学生
自己紹介:
パソコンで遊ぶのが
割と好きで、
本屋さんに通うのも
結構好きで、
軽い調べ物なら好きな、
探せばどこかにいるような
そんな学生。

イマドキらしく
忘れっぽく、
熱されても
冷めてしまうことも。
Twitter
バーコード
Powered by ニンジャブログ  Designed by ゆきぱんだ
Copyright (c) とある学生のパソコンつれづれ。 All Rights Reserved
忍者ブログ / [PR]