「ver.2.0/応用/機能追加/時間分け」の編集履歴(バックアップ)一覧に戻る

ver.2.0/応用/機能追加/時間分け - (2011/06/02 (木) 02:29:36) の編集履歴(バックアップ)


※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。

ランダムPOSTを●分おき、リプライを▲分おきにしたい! [#ra5d511d]

ここではランダムPOSTを30分おき、リプライを2分おきで考えます(※cronは2分間隔設定にする。)

リプライ [#c8e65725]

リプライ間隔はcronの間隔と同じなので、何か条件付けるということはしなくてOKです。
bot.phpに
$response = $eb->reply(2,"data.txt","reply_pattern.php");
を追加してあげましょう。

ランダムPOST [#nd87a60d]

bot.php内でも解説されている通り
//bot.phpを実行したときに、0分、15分、30分、45分だったら実行される
if(date("i") % 15 == 0){
	$response = $eb->postRandom("data.txt");
}
を使っていきます。

date("i")と言うのは、現在の時刻・○時△分の△部分を表します。
ほかにもdate("G")やdate("Y")等色々な現在時刻を表すものがあります。
詳しくは各自ここで調べて下さい。(外部リンク:http://www.php.net/manual/ja/function.date.php)
% 15 === 0と言うのは、事前のdate("i")が15で割り切れることを意味します。
ここはifなので、bot.phpへアクセスした時、15で割り切れる時間(分)のみ{}の中身を実行します。
bot.phpへアクセスした時の時間が0分(60分)と15分、30分、45分だった時、いずれも15で割り切ることが出来ますね。

では今回は30分おきに設定したかったので
if(date("i") % 30 === 0){
	$response = $eb->postRandom("data.txt");
}
と書いてみます。こうすると0(60)分と30分の時のみ実行されます。1時間に2回実行させることになります。
目的達成です!
ここで注意したいのは、リプライの記述をif{}内に入れないことです。
リプライの記述まで{}へ入れてしまっては、リプライまで30分おきになってしまいます。


時間別にリプライorPOSTを分けたい! [#b7bf333f]

上の「ランダムPOSTを●分おき、リプライを▲分おきにしたい!」でdate("i")が現在の時刻○時△分の△部分だというのは分かりました。
今回は朝(6~10時)morning.txtと昼(11~15時)noon.txt、夜(16~0時)evening.txt、深夜(1~5時)night.txtそれぞれ別のPOSTをさせてみましょう。
ただし今回は△分ではなく○時なので、date("i")は使えません。○時はdate("G")を使用します。
24時間表記ですが、24という数値はありません。24時は0時扱いになります。

まずは朝の部分。現在の時刻・○時の○部分が6~10の時。
if(date("G") > 5 && date("G") < 11){
	$response = $eb->postRandom("morning.txt");
}
これは「もし、現在時刻が5時より大きく、11よりも小さい時」と言うifの条件式になります。
「&&」は「and」でも構いません。英字の通り「かつ」と言う意味があります。

注意したいのは不等号!これは算数レベルで考えてください。
全角 説明
A>5 A>5 Aは5より大きい。つまり6~23。
A<5 A<5 Aは5より小さい。つまり0~4。
A>=5 A≧5 Aは5以上。つまり5~23。
A<=5 A≦5 Aは5以下。つまり0~5。

次に昼の部分。現在の時刻・○時の○部分が11~15の時。
if(date("G") > 10 && date("G") < 16){
	$response = $eb->postRandom("noon.txt");
}
でも良いのですが…
if(date("G") > 5 && date("G") < 11){
	$response = $eb->postRandom("morning.txt");
}else if(date("G") > 10 && date("G") < 16){
	$response = $eb->postRandom("noon.txt");
}
とelseを付けて朝の部分とくっ付けてあげるとすっきりします。
elseは、先のif条件(朝)に合わなかった場合else以降を実行しようとします。

次に夜の部分。現在の時刻・○時の○部分が16~24の時。
if(date("G") > 15 && date("G") < 1){
	$response = $eb->postRandom("evening.txt");
}
ここまで来ると、やってしまいがちですが…これは大きな間違い!!!
これでは「15より大きくて、1より小さい」というありえない条件になってしまいます。
if(date("G") > 15 || date("G") < 1){
	$response = $eb->postRandom("evening.txt");
}
としてやることで「現在時刻が15より大きい、または1より小さい場合」となります。
「||」は「or」でも構いません。英字の通り「または」と言う意味があります。
if(date("G") > 5 && date("G") < 11){
	$response = $eb->postRandom("morning.txt");
} else if(date("G") > 10 && date("G") < 16){
	$response = $eb->postRandom("noon.txt");
} else if(date("G") > 15 || date("G") < 1){
	$response = $eb->postRandom("evening.txt");
}
繋げるとこんな感じです。

次に深夜の部分。現在の時刻・○時の○部分が1~5の時。
if(date("G") > 0 && date("G") < 6){
	$response = $eb->postRandom("night.txt");
}
としてあげてもいいのですが…今まで6~10,11~15,16~24時までは指定してきました。
残りの時間はこの1~5時しかないので、わざわざ条件を書いてやることはないのです。
if(date("G") > 5 && date("G") < 11){
	$response = $eb->postRandom("morning.txt");
} else if(date("G") > 10 && date("G") < 16){
	$response = $eb->postRandom("noon.txt");
} else if(date("G") > 15 || date("G") < 1){
	$response = $eb->postRandom("evening.txt");
} else {
	$response = $eb->postRandom("night.txt");
}
で完成です!

リプライも同様に条件付けてあげることで、時間別パターン可能です。


落とし穴に注意 [#rf62e452]

if(date("i") % 30 === 0){
はdate("i")が30で割り切れる分数、というのを解説しました。

これを30分おき等、分数ではなく1時間毎にしたい。
if(date("G") % 1 === 0){
と書く人をよく質問スレで見かけます。
これは大きな間違いです。

詳しく書くと………
if(date("i") % 30 === 0){
は0,30分に動くことになりますね。
ここでもしcronが2分毎ではなく10秒毎にアクセスするとしたら。
毎時0分(30分)の0秒、10秒、20秒、30秒、40秒、50秒すべての秒数で作動してしまうのです。
これは、cronが分数おきだからこそ使える書き方なのです。
if(date("G") % 1 === 0){
と書いてしまうと、cronが2分毎だった場合、毎時の0,2,4,6,,,,,,,,,,,,58分と2分毎に作動してしまいます。

0分きっちりに作動させたいなら、難しく考えず
if(date("i") == "0"){
としてしまえばオッケーです。

コメント [#n0b1997d]

  • 時間別にリプライorPOSTと同じような感じで、時間別にPOSTしないようにしたいです。何方かよろしくお願いします。 -- 沢谷 (2010-07-26 02:19:00)
  • 沢谷さん>その場合、時間別POSTの応用で$response = $eb->postRandom("");とすればPOSTしません -- 通りすがりのねこ (2010-08-01 21:09:11)
  • もし、if(date("i") == "0"){を使う場合、cronの実行間隔は1分にしなければなりませんか? -- 名無しさん (2010-09-07 16:56:00)
  • >もし、if(date("i") == "0"){を使う場合、cronの実行間隔は1分にしなければなりませんか? 回答:その必要はありません -- 通りすがりのねこ (2010-09-09 21:15:34)
  • 時間別POSTを15分おきにしたい場合、例えば時間別は6~10時のみの設定のを15分おき実行だと、if(date("G") > 5 && date("G") < 11 date("i") % 30 === 0) で良いのでしょうか? -- たに (2010-09-19 01:21:04)
  • 夜だけ違うリプライ。bot.php(2) http://livbot.sblo.jp/  の記事が参考になりました。サンプルコード書いてあります。 -- 2時間おきに作動させたい場合 (2010-12-10 05:27:08)
  • 何回かの間隔で、実行したい場合は、カウンターファイルを作る手もあるぞ。パーミッションは666のこと。bot.phpの例で10回間隔で順次投稿したい場合。1間隔1分だと10分間隔です。
function seqnum(){
$iseq = 0;
$fname = "count.dat";
$iseq = file_get_contents($fname);
if ($iseq >= 60) {
	$iseq = 0;
}
$iseq = $iseq + 1;
file_put_contents($fname,(string)$iseq); //SEQカウンター書き込み
echo "参照シーケンス番号 = ".$iseq."<br />";
return $iseq;
}$iseq = seqnum();
if (($iseq % 10) == 0) {
$response = $eb->postRotation("data.txt");
} - koziki_bot (2011-01-28 10:08:59)

  • リプを2分置き、呟きを15分置きにしたかったので「if(date("i") % 15 == 0){ $response = $eb->postRandom("data.txt"); }」と「$response = $eb->reply(2,"data.txt","reply_pattern.php");」を書き込んだのですが上手く動きません。ちなみに「$response = $eb->reply(2,"data.txt","reply_pattern.php");」だけですと正常に動くようです。初心者ながら色々調べてみましたが解決できませんのでもしよければ教えてください。 -- 千紘 (2011-02-20 20:44:36)
  • 千紘さん> cron部分の詳細がないのでわからないですがcronが2分おきなら15分にはcronは起動しないのは分かる? -- 名無しさん (2011-02-20 21:38:41)
  • ランダムPOSTを●分おき~と時間や曜日別にツイートを分ける方法を個別には理解できたのですが、組み合わせ方がわかりません・・・。●曜日の●時から●時まで、●分ごとにツイート(リプライ)という風にしたいのですが・・・何方かよろしくお願いします。 -- 番 (2011-02-21 00:39:31)
  • そーでした、PHPのファイルを時間ごとに自動的に叩くアプリを使っているのでcronは使ってないです。このアプリは自分で作ったのですがどうしようかなあ??興味ある方、ツイッターで質問してみてください。scネームはハンドル名と同じです。 -- koziki_bot (2011-02-21 00:49:39)
  • 回答ありがとうございます。理解しました!2分に合わせたいなら10分置き、15分に合わせたいなら3分置きにするなどどちらでも割れるような値にしなくてはならないということですね。 -- 千紘 (2011-02-21 07:58:19)
  • すみません。曜日と時間で分けて30分ごとにツイートさせたいのですが、 -- 番 (2011-03-08 22:45:13)
  • 途中で切れてしまいましたすみません・・・。曜日と時間で分けて30分ごとにツイートさせるには if(date("i") % 30 === 0){ で30分ごとにツイートするように指定して、switch(true)で case (date("w") == "1″ && date("G") > "6″ && date("w") == "1" && date("G") < "12"):としても出来ないでしょうか? すみませんとても困ってます・・・よろしくお願いします。 -- 番 (2011-03-08 22:52:52)
  • bot.phpはいじってないのですが、2分置きどころかリプライを返してくれません…どうすれば良いのでしょうか? -- 翔 (2011-06-01 22:45:03)
  • bot.phpはそのままで、リプはreply_patternから返すようにしているのに、なぜかdate.txtの言葉から拾って返してしまいます。対処方法を教えて下さい…。 -- 名無しさん (2011-06-02 02:29:36)
名前:
コメント:
目安箱バナー