<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://www26.atwiki.jp/easybotter_wiki/">
    <title>EasyBotter 非公式wiki</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/</link>
    <description>EasyBotter 非公式wiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2012-05-24T22:02:30+09:00</dc:date>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/26.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/25.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/1.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/2.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/34.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/13.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/29.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/33.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/36.html" />
                <rdf:li rdf:resource="http://www26.atwiki.jp/easybotter_wiki/pages/21.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/26.html">
    <title>ver.2.0/応用/機能追加/reply</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/26.html</link>
    <description>
      ※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。
#contents

*改造方法を紹介するスレにあった「単語拾い」をver.2.0で使いたい [#c1629660]
//[[フッターバグの修正案&gt;ver.2.0*現状バグ]]を利用します → &#039;&#039;if(preg_match(&quot;@{.+?}@&quot;,$status) == 1){}&#039;&#039; を外しておく
EasyBotter.php内
 if(strpos($text,&quot;{tweet}&quot;) !== FALSE &amp;&amp; !empty($reply)){
    $tweet = preg_replace(&quot;@\.?\@[a-zA-Z0-9-_]+\s@u&quot;,&quot;&quot;,$reply-&gt;text);
    $text = str_replace(&quot;{tweet}&quot;,$tweet,$text);
 }
 //フッターを追加
 $text .= $this-&gt;_footer;
の直前に、以下を追記する。
 //■■ここから名詞拾い■■
 if(strpos($text,&quot;{ran_meishi}&quot;) !== FALSE &amp;&amp; !empty($reply)){
	//アプリケーションID
	$apiKey = &quot;***********************&quot;;
	$apitweet = preg_replace(&quot;@\.?\@[a-zA-Z0-9-_]+\s@u&quot;,&quot;&quot;,$reply-&gt;text);
	$apiurl = &quot;http://jlp.yahooapis.jp/MAService/V1/parse?appid=&quot;.$apiKey.&quot;&amp;filter=9&amp;sentence=&quot;.$apitweet;
	$apirss = file_get_contents($apiurl);
	$apixml = simplexml_load_string($apirss);
	//配列「meishi」を作る
	$meishi = array();   
	// 特定の単語、指定字数以下の名詞を弾きながら配列に名詞を追加
	foreach($apixml-&gt;ma_result-&gt;word_list-&gt;word as $apiitem)
	{
		//拾いたくない単語
		if ((ereg(&quot;ダタラ|モスマン|モコイ&quot;, $apiitem-&gt;surface)==False) &amp;&amp; (mb_strlen($apiitem-&gt;surface) &gt; 3*2)){
			$meishi[]=$apiitem-&gt;surface;
		}
	}
	//リプライの中に名詞がない場合の単語をセット（複数設定可）
	if ($meishi[0] == &quot;&quot;){$meishi = array(&quot;&amp;#60;censored&gt;&quot;,&quot;×××&quot;,&quot;■■■&quot;);}
	//名詞をランダムに選ぶ
	$ran_meishi = $meishi[array_rand($meishi)];
	//名詞を変換する
	$text = ereg_replace(&quot;{ran_meishi}&quot;, &quot;$ran_meishi&quot;, $text);
 }
**備考 [#e06b9c91]
[[ぼっと倉庫&gt;http://blog.livedoor.jp/bot_1go/archives/1733069.html]]がソースです。
使い方はこちらのサイトの解説をよく見ること。


*自動フォロー返しした時にリプライで知らせたい [#ycc2942f]
EasyBotter.php内
 //自動フォロー返し
 function autoFollow(){
	$response = $this-&gt;getFollowers();
	$followList = array();
	foreach($response as $user){
		$follow = (string)$user-&gt;following;
		if($follow == &quot;false&quot;){
			$followList[] = (string)$user-&gt;screen_name;
		}
	}
	foreach($followList as $screen_name){
		$response = $this-&gt;followUser($screen_name);
	}
 }
とある部分を探す。
 foreach($followList as $screen_name){
 $response = $this-&gt;followUser($screen_name);
 }
の直後に
 //■■フォローした時にリプライを送る■■
 foreach($followList as $rscreen_name){
	$value = array(&quot;status&quot;=&gt;&quot;@{$rscreen_name} フォロー完了しました！&quot;);
	$response = $this-&gt;setUpdate($value);
	$result = $this-&gt;showResult($response);
	$results[] = $result;
 }
を入れる。
「フォロー完了しました！」は自由に変更してもOK。 
//screen_name→rscreen_name修正　4.16

*鍵付きの人へ何度も話しかけてしまう場合 [#q1c3b296]
[[BBSより転載です。&gt;http://jbbs.livedoor.jp/bbs/read.cgi/internet/6629/1265625817/519]]
EasyBotter.php内
 //自動フォロー返し
 function autoFollow(){
 （略）
 if($follow == &quot;false&quot;){
を
 //自動フォロー返し
 function autoFollow(){
 （略）
 if($follow == &quot;false&quot; &amp;&amp; $user-&gt;protected == &quot;false&quot;){
と変更する。
鍵付きの人へフォロー返しを行いません。


*正規表現を使った言葉返しで、言葉遊びをさせる（文字列の並びを変える。） [#x3c977be]
EasyBotter.php内
 //リプライを作る
 （略）
 //リプライパターンと照合
 （略）
 for($i=1;$i &lt;count($matches);$i++){
 $p = &quot;$&quot;.$i;
 $status = str_replace($p,$matches[$i],$status);
 }
を探す。
 $status = str_replace($p,$matches[$i],$status);
を
 //■■言葉遊びする■■
 if(preg_match(&quot;/言葉遊び/u&quot;,$status)){
	$kotoba_asobi = $this-&gt;mb_str_shuffle($matches[$i],&quot;UTF-8&quot;);
 }else{
	$kotoba_asobi = $matches[$i];
 }
 $status = str_replace($p,$kotoba_asobi,$status);
に変更する。

EasyBotter.php内ラスト
 }
 ?&gt;
の直前に
 function mb_str_shuffle($str,$enc){
	$buff = array();
	while ($len = mb_strlen($str,$enc)) {
		$buff[] = mb_substr($str,0,1,$enc);
		$str = mb_substr($str,1,$len,$enc);
	}
	shuffle($buff);
	return implode(&#039;&#039;,$buff);
 }
を追記する。

**備考 [#ucd102de]
mb_str_shuffle()は[[どう書く？org beta&gt;http://ja.doukaku.org/249/nested/]]ソースです。

「言葉遊び」部分はリプライパターンに応じて変更して下さい。
この一例はリプライパターンで「『$1』…言葉遊びしてみたよ～♪」とリプライさせる時の例になります。
「『$1』…言葉遊びしてみたよ～♪」とリプライする時のみ、$1を言葉遊びさせます。
言葉遊び：$1が「あいうえお」だとすると、「あおういえ」「うえあおい」等とランダムに文字列を入れ替えます。


*自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請＆リプライする [#v3f312b5]
「フォローして」「リムーブして」とリプライをした時にBOTに対象への処理を行う。
※実際は「フォローして」「リムーブして」等の簡単な言葉ではないものを推薦。「フォローして。○○○（BOTの名前）」等。
reply_pattern.php　$data = array();内に
 //半自動フォロー、リムーブ
 &quot;フォローして&quot;=&gt; array(
	&quot;[[AUTOFOLLOW]]フォローしました&quot;,
	&quot;[[AUTOFOLLOW]]フォローしたよ&quot;,
 ),
 &quot;リムーブして&quot;=&gt; array(
	&quot;[[AUTOREMOVE]]リムーブしました&quot;,
	&quot;[[AUTOREMOVE]]リムーブしたよ&quot;,
 ),
を追記。

EasyBotter.php内
 //リプライを作る
 （略）
 //リプライパターンと照合
 （略）
 $re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
を探す。
 $re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
を
 switch(true){
	//半自動フォロー
	case stristr($status, &quot;[[AUTOFOLLOW]]&quot;):
	$status = str_replace(&quot;[[AUTOFOLLOW]]&quot;,&quot;&quot;,$status);
	$followreq = $this-&gt;consumer-&gt;sendRequest(&quot;http://twitter.com/friendships/create/$reply_name.json&quot;,array(),&quot;POST&quot;);
	$re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
	break;
 
	//半自動リムーブ
	case stristr($status, &quot;[[AUTOREMOVE]]&quot;):
	$status = str_replace(&quot;[[AUTOREMOVE]]&quot;,&quot;&quot;,$status);
	$removereq = $this-&gt;consumer-&gt;sendRequest(&quot;http://twitter.com/friendships/destroy/$reply_name.json&quot;,array(),&quot;POST&quot;);
	$re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
	break;
 
	//その他
	default:
	$re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
 }
に書き換える。

**備考：フォロー告知をDMにしたい場合（リムーブは出来ません。） [#b0266ba0]
 switch(true){
	//半自動フォロー
	case stristr($status, &quot;[[AUTOFOLLOW]]&quot;):
	$statusxxx = str_replace(&quot;[[AUTOFOLLOW]]&quot;,&quot;&quot;,$status);
	$followreq = $this-&gt;consumer-&gt;sendRequest(&quot;http://twitter.com/friendships/create/$reply_name.json&quot;,array(),&quot;POST&quot;);
	$followreq = $this-&gt;consumer-&gt;sendRequest(&quot;http://twitter.com/direct_messages/new.json&quot;,array(&quot;text&quot;=&gt;$statusxxx,&#039;screen_name&#039;=&gt;$reply_name),&quot;POST&quot;);
	$re[&quot;status&quot;] = &quot;&quot;;
	break;
 （略）
 }
 if(stristr($status, &quot;[[AUTOFOLLOW]]&quot;)){continue;}


*特定のリプライ反応をリプライではなくTL発言にする [#wb35bfa8]
EasyBotter.php内
 //リプライを作る
 （略）
 //リプライパターンと照合
 （略）
 $re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
を探す。
 $re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
を
 switch(true){
	//TL発言
	case stristr($status, &quot;[[TLH]]&quot;):
	$status = str_replace(&quot;[[TLH]]&quot;,&quot;&quot;,$status);
	$re[&quot;status&quot;] = $status;
	$rpid = (string)$reply-&gt;id;
 	file_put_contents($this-&gt;_logDataFile,$rpid);
	break;
	//その他
	default:
	$re[&quot;status&quot;] = &quot;@&quot;.$reply_name.&quot; &quot;.$status;
 }
に書き換える。

reply_pattern.php　$data = array();内
 &quot;&quot;=&gt; array(
	&quot;[[TLH]]あれ…誰か呼んだ？&quot;,
	&quot;その言葉はわからないです&quot;,
 ),
と記入。
ランダムで
 「[[TLH]]あれ…誰か呼んだ？」
が選ばれた時、リプライではなくTL上に「あれ…誰か呼んだ？」と発言する。

*一度のリプライでリプライ回数の制限する
EasyBotter.php内 
 //古い順にする
 $replies = array_reverse($replies_); 
 if(count($replies) != 0){ 
 //リプライの文章をつくる
 $replyTweets = $this-&gt;makeReplyTweets($replies, $replyFile, $replyPatternFile); 
の下に
 //リプライ回数の制限　ここから
 $reply_max = 3;//1回のreply実行でリプライできる最大数
 if(count($replyTweets) &gt; $reply_max){//$replyTweetsが$reply_maxよりおおきかったら
 	//$replyTweetsが$reply_max件になるまで配列から要素を削除
 	while(count($replyTweets) &gt; $reply_max){
 	array_splice($replyTweets,array_rand($replyTweets),1);//ランダムで1件削除
 	}
 }
 //リプライ回数の制限　ここまで 
を追加する

*コメント [#fd6efe73]
- &amp;quot;特定のリプライ反応をリプライではなくTL発言にする &amp;quot;についてなんですが、TLHとはなんでしょうか？  -- みゅ子  (2010-09-16 01:23:26)
- TL発言=TLH　これに限らず分からないのならまずは検索して調べましょ  -- zero  (2010-09-16 21:05:38)
- zeroさんありがとうございます。&amp;quot;TLH twitter&amp;quot;で検索したのですがいまいちよく分からず；次からはもっと検索してみます。すみませんでした。　それと「特定のリプライ反応をされる単語」は何処で設定できるのでしょうか？＞＜；  -- みゅ子  (2010-09-17 22:17:33)
- TL上の特定の単語に反応してTL発言をする、というのは可能ですか？  -- フィル  (2010-10-26 19:32:23)
- TLに反応してTL発言をするのはリプライ反応をTL発言にするの応用でできます。  -- ナナシスター  (2010-11-03 18:05:32)
- リプライに関してreply_patternにない場合にはdata.txtからランダム発言ではなく、何も返さないようにするにはどうすればよいのでしょう  -- 774  (2010-11-23 23:36:19)
- 「フォローした時にリプライを送る」で{name}を使いたいのですがうまくできません。どなたかご教授いただけませんでしょうか。自分でも調べてみたのですがわかりません。  -- りん  (2010-12-20 16:41:08)
- フォロー要請＆リプライする をするとどうもエラーになるのですが・・・原因分かる方いますか？  -- なな  (2011-04-12 23:51:31)
- ↑まだ分からないならBBSのTwitterBotPHP質問スレの方へ  -- 通りすがり  (2011-04-19 00:37:45)
- [[TLH]]とリプライサンプルの「([^\s、。]+?)は好き？&amp;quot;」「&amp;quot;$1おいしいです&amp;quot;」は併用できませんか？（動きませんでした）  -- なし  (2011-06-18 19:01:07)
- 「単語拾い」で、拾った発言を返す文章はdata.txtに書くのでしょうか？  -- 774  (2011-07-07 00:35:47)
- ↑reply.txt  -- 名無しさん  (2011-07-07 20:24:33)
- ↑「reply_pattern.php」ではありませんか？  -- 　  (2011-07-08 01:02:17)
- 自動フォロー返しした時にリプライで知らせたいをDMで知らせることはできるのでしょうか。  -- 名無しさん  (2011-09-06 17:27:09)
- 非公式RTに反応させることはできないでしょうか？  -- 名無しさん  (2011-09-10 01:30:13)
- 過去ログ内で紹介されてましたけど、EasyBotter.phpの中でRTを検索するとそれらしきところが出てきます。あとは御自分でドウゾ  -- 名無しさん  (2011-09-13 20:22:51)
- 名詞拾いで、TLの名詞を拾って、その言葉を盛り込んでTLでつぶやくというのは出来ますか？　出来るのならどこをどう改編したら良いでしょうか。  -- 名無しさん  (2012-05-24 22:02:30)
#comment    </description>
    <dc:date>2012-05-24T22:02:30+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/25.html">
    <title>ver.2.0/応用/機能追加/時間分け</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/25.html</link>
    <description>
      ※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。
#contents
*ランダムPOSTを●分おき、リプライを▲分おきにしたい！ [#ra5d511d]
ここではランダムPOSTを30分おき、リプライを2分おきで考えます（※cronは2分間隔設定にする。）

**リプライ [#c8e65725]
リプライ間隔はcronの間隔と同じなので、何か条件付けるということはしなくてOKです。
bot.phpに
 $response = $eb-&gt;reply(2,&quot;data.txt&quot;,&quot;reply_pattern.php&quot;);
を追加してあげましょう。

**ランダムPOST [#nd87a60d]
bot.php内でも解説されている通り
 //bot.phpを実行したときに、0分、15分、30分、45分だったら実行される
 if(date(&quot;i&quot;) % 15 == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
を使っていきます。

&#039;&#039;date(&quot;i&quot;)&#039;&#039;と言うのは、現在の時刻・○時△分の&#039;&#039;△部分&#039;&#039;を表します。
ほかにもdate(&quot;G&quot;)やdate(&quot;Y&quot;)等色々な現在時刻を表すものがあります。
[[詳しくは各自ここで調べて下さい。(外部リンク：http://www.php.net/manual/ja/function.date.php)&gt;http://www.php.net/manual/ja/function.date.php]]
&amp;bold(){% 15 == 0}と言うのは、事前の&#039;&#039;date(&quot;i&quot;)&#039;&#039;が15で割り切れることを意味します。
ここはifなので、bot.phpへアクセスした時、15で割り切れる時間（分）のみ{}の中身を実行します。
bot.phpへアクセスした時の時間が0分(60分)と15分、30分、45分だった時、いずれも15で割り切ることが出来ますね。

では今回は30分おきに設定したかったので
 if(date(&quot;i&quot;) % 30 == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
と書いてみます。こうすると0(60)分と30分の時のみ実行されます。1時間に2回実行させることになります。
目的達成です！
&amp;color(#ff0000){ここで注意したいのは、リプライの記述を&#039;&#039;if{}&#039;&#039;内に入れないことです。}
リプライの記述まで{}へ入れてしまっては、リプライまで30分おきになってしまいます。


*時間別にリプライorPOSTを分けたい！ [#b7bf333f]
上の「ランダムPOSTを●分おき、リプライを▲分おきにしたい！」で&#039;&#039;date(&quot;i&quot;)&#039;&#039;が現在の時刻○時△分の&#039;&#039;△部分&#039;&#039;だというのは分かりました。
今回は朝（6～10時）morning.txtと昼（11～15時）noon.txt、夜（16～0時）evening.txt、深夜（1～5時）night.txtそれぞれ別のPOSTをさせてみましょう。
ただし今回は△分ではなく○時なので、date(&quot;i&quot;)は使えません。○時はdate(&quot;G&quot;)を使用します。
&amp;color(#ff0000){24時間表記ですが、24という数値はありません。24時は0時扱いになります。}
----
まずは朝の部分。現在の時刻・○時の&#039;&#039;○部分&#039;&#039;が6～10の時。
 if(date(&quot;G&quot;) &gt; 5 &amp;&amp; date(&quot;G&quot;) &lt; 11){
 	$response = $eb-&gt;postRandom(&quot;morning.txt&quot;);
 }
これは「もし、現在時刻が5時より大きく、11よりも小さい時」と言うifの条件式になります。
「&amp;&amp;」は「and」でも構いません。英字の通り「かつ」と言う意味があります。

&amp;color(#ffaa00){注意したいのは不等号！これは算数レベルで考えてください。}
|例|全角|説明|
|A&gt;5|A＞5|Aは5より大きい。つまり6～23。|
|A&lt;5|A＜5|Aは5より小さい。つまり0～4。|
|A&gt;=5|A≧5|Aは5以上。つまり5～23。|
|A&lt;=5|A≦5|Aは5以下。つまり0～5。|
----
次に昼の部分。現在の時刻・○時の&#039;&#039;○部分&#039;&#039;が11～15の時。
 if(date(&quot;G&quot;) &gt; 10 &amp;&amp; date(&quot;G&quot;) &lt; 16){
 	$response = $eb-&gt;postRandom(&quot;noon.txt&quot;);
 }
でも良いのですが…
 if(date(&quot;G&quot;) &gt; 5 &amp;&amp; date(&quot;G&quot;) &lt; 11){
 	$response = $eb-&gt;postRandom(&quot;morning.txt&quot;);
 }else if(date(&quot;G&quot;) &gt; 10 &amp;&amp; date(&quot;G&quot;) &lt; 16){
 	$response = $eb-&gt;postRandom(&quot;noon.txt&quot;);
 }
とelseを付けて朝の部分とくっ付けてあげるとすっきりします。
elseは、先のif条件（朝）に合わなかった場合else以降を実行しようとします。
----
次に夜の部分。現在の時刻・○時の&#039;&#039;○部分&#039;&#039;が16～24の時。
 if(date(&quot;G&quot;) &gt; 15 &amp;&amp; date(&quot;G&quot;) &lt; 1){
 	$response = $eb-&gt;postRandom(&quot;evening.txt&quot;);
 }
ここまで来ると、やってしまいがちですが…これは&amp;color(#ff0000){大きな間違い！！！}
これでは「15より大きくて、1より小さい」というありえない条件になってしまいます。
 if(date(&quot;G&quot;) &gt; 15 || date(&quot;G&quot;) &lt; 1){
 	$response = $eb-&gt;postRandom(&quot;evening.txt&quot;);
 }
としてやることで「現在時刻が15より大きい、または1より小さい場合」となります。
「||」は「or」でも構いません。英字の通り「または」と言う意味があります。
 if(date(&quot;G&quot;) &gt; 5 &amp;&amp; date(&quot;G&quot;) &lt; 11){
 	$response = $eb-&gt;postRandom(&quot;morning.txt&quot;);
 } else if(date(&quot;G&quot;) &gt; 10 &amp;&amp; date(&quot;G&quot;) &lt; 16){
 	$response = $eb-&gt;postRandom(&quot;noon.txt&quot;);
 } else if(date(&quot;G&quot;) &gt; 15 || date(&quot;G&quot;) &lt; 1){
 	$response = $eb-&gt;postRandom(&quot;evening.txt&quot;);
 }
繋げるとこんな感じです。
----
次に深夜の部分。現在の時刻・○時の&#039;&#039;○部分&#039;&#039;が1～5の時。
 if(date(&quot;G&quot;) &gt; 0 &amp;&amp; date(&quot;G&quot;) &lt; 6){
 	$response = $eb-&gt;postRandom(&quot;night.txt&quot;);
 }
としてあげてもいいのですが…今まで6～10,11～15,16～24時までは指定してきました。
残りの時間はこの1～5時しかないので、わざわざ条件を書いてやることはないのです。
 if(date(&quot;G&quot;) &gt; 5 &amp;&amp; date(&quot;G&quot;) &lt; 11){
 	$response = $eb-&gt;postRandom(&quot;morning.txt&quot;);
 } else if(date(&quot;G&quot;) &gt; 10 &amp;&amp; date(&quot;G&quot;) &lt; 16){
 	$response = $eb-&gt;postRandom(&quot;noon.txt&quot;);
 } else if(date(&quot;G&quot;) &gt; 15 || date(&quot;G&quot;) &lt; 1){
 	$response = $eb-&gt;postRandom(&quot;evening.txt&quot;);
 } else {
 	$response = $eb-&gt;postRandom(&quot;night.txt&quot;);
 }
で完成です！

リプライも同様に条件付けてあげることで、時間別パターン可能です。


*落とし穴に注意 [#rf62e452]
 if(date(&quot;i&quot;) % 30 === 0){
はdate(&quot;i&quot;)が30で割り切れる分数、というのを解説しました。

これを30分おき等、分数ではなく1時間毎にしたい。
 if(date(&quot;G&quot;) % 1 === 0){
と書く人をよく質問スレで見かけます。
&amp;color(#ff0000){&#039;&#039;これは大きな間違いです。&#039;&#039;}

詳しく書くと………
 if(date(&quot;i&quot;) % 30 === 0){
は0,30分に動くことになりますね。
ここでもしcronが2分毎ではなく10秒毎にアクセスするとしたら。
毎時0分（30分）の0秒、10秒、20秒、30秒、40秒、50秒すべての秒数で作動してしまうのです。
これは、cronが分数おきだからこそ使える書き方なのです。
 if(date(&quot;G&quot;) % 1 === 0){
と書いてしまうと、cronが2分毎だった場合、毎時の0,2,4,6,,,,,,,,,,,,58分と2分毎に作動してしまいます。

0分きっちりに作動させたいなら、難しく考えず
 if(date(&quot;i&quot;) == &quot;0&quot;){
としてしまえばオッケーです。


*落とし穴に注意２…CRONと設置サーバーの時間がズレている
掲示板でも多い質問の一つに&#039;&#039;「リプライは動いてるけど時間分け指定をしたら通常ポストしなくなった」&#039;&#039;というものがあります。
特に見られる理由は下記3点です。
&gt;　１：if・switchなどの内容が間違っている
&gt;　　　……慣れた人でも凡ミスをすることがあるので一つずつ再確認しましょう
&gt;　２：CRONがbot.phpにアクセスする時間外を指定している
&gt;　　　……「CRONは2分毎なのにbot.phpでは3分毎の設定」などちぐはぐでは？指定時間を揃えましょう
&gt;　３：CRONと設置サーバーの時間がズレている
&gt;　　　……どのくらいのズレがあるのか確認して適切に処置しましょう
ここでは３番の対処を説明します。

**ズレを知る
CRONと設置サーバーの時間のズレを確認するための下準備をします。
（data.txtやbot.phpの内容を既に変更している場合は適宜ファイル名を変更して対応してください）

&#039;&#039;data.txtの内容&#039;&#039;（この1行のみ）
 {hour}時{minute}分{second}秒

&#039;&#039;bot.phpの実行内容&#039;&#039;（下記以外のリプライ・TL反応・ポスト・フォロー返し等はコメントアウトする）
 $response = $eb-&gt;postRandom(&quot;data.txt&quot;);

&#039;&#039;CRONの設定&#039;&#039;
 5分毎、10分毎など、CRON提供側で許容されている範囲内で設定します。
 1分毎・2分毎での設定はズレを計るのに向きません、できれば0分・5分・10分…という0分始まりの5分毎をオススメします。

ここまでが下準備です。
実際にCRONを起動させ、「●時●分●秒」というポストが数回行われるまで待ちます。
文字化けするようであれば文字コード・改行コードを確認、ポストが行われないようであれば指定したbot.phpが正しいURLか確認します。

0分始まりの5分毎の場合、「分」は0もしくは5の倍数でなければなりませんが、これ以外の場合にはズレが生じていることになります。
また、「分」が0もしくは5の倍数であっても「秒」が59秒……など数秒のラグで「分」が変わってしまうような値では不安が残ります。
何分のズレなのか、ズレが生じるのはどの程度の頻度か、等をチェックしたら次の段階です。

**ズレに対処する
一番簡単なのはCRONの実行時間をずらして、サーバーの実行時間に合わせてやることです。
しかしこの方法では更にズレが生じたり、時間ズレと関係なくサーバーが不安定で実行に時間がかかった場合などに対処しきれません。
そこでbot.phpの時間指定を厳密なものではなく余裕をもった書き方に変えます。

毎時0分にランダムポストしたい場合は下記のように書きますが、
 if(date(&quot;i&quot;) == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }

ズレが生じている場合は下記のように余裕をもった時間指定に書き換えます。
 //以下は毎時0分～1分の間に実行（2分未満の範囲で遅い場合）
 if(date(&quot;i&quot;) &lt;= 1){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
 //以下は毎時59分か0分に実行（2分未満の範囲で早い場合）
 if(date(&quot;i&quot;) == 0 || date(&quot;i&quot;) == 59){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }

このように余裕をもたせることで多くの場合は解決します。
しかし、bot.phpの実行内容を増やしていくと、時には「CRONと設置サーバーにズレがないのに実行されてない？」という事があります。
これについても過去に同様の事例が多くありましたが、多くは下記３つに当てはまります。
　１：処理落ち・タイムアウト……設置サーバーの能力を越えているかtwitterが重い場合など
　２：ifやswitchの書き方の問題……閉じ忘れや勘違いがないか再確認
　３：実行中に指定した時間を過ぎてしまった……bot.phpの書き方や改造で対応
次の項目では３番に当てはまる事例への対処を説明します。

**指定した時間に実行の処理が終わらない
EasyBotterに慣れてくると、単純な機能だけでなく様々な機能を時間別で組み合わせて実行することも多くなります。
一回に処理する機能が増えれば処理時間は長くなります。
また初期は気にならない処理時間でも、フォロー・フォロワーの増加などで処理時間が長くなることもあります。

まずはbot.phpで指定できる機能がどのような動きをしているかを考えてみましょう。
　&#039;&#039;設置サーバー内の処理だけで済む&#039;&#039;
　　・ランダムポスト
　　・ローテーションポスト
　　　……設置サーバー内のファイルからデータから選んでtwitterに送る
　&#039;&#039;twitterから情報を呼び出さなければならないもの&#039;&#039;
　　・リプライ
　　・タイムライン反応
　　・自動フォロー返し
　　　……初めにtwitterから情報を呼び出し、その内容を設置サーバー内のファイルと照らし合わせて処理を行い、その結果をtwitterに送る。
　　　　　twitterが重い場合は呼び出し時点で処理時間を食う。
　　　　　またリプライ数・タイムラインの速度やフォロワー数などで処理時間が大きく変わる。

上記を踏まえて下記のようなbot.phpを見てみましょう。
 //毎回リプライ返し
 $response = $eb-&gt;reply(2,&quot;data.txt&quot;,&quot;reply_pattern.php&quot;);
 //毎時0分にランダムポスト
 if(date(&quot;i&quot;) == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }

この書き方に全く問題はありません、CRONと設置サーバーの時間ズレがなければうまく動くことでしょう。
しかし、時間ズレはないのに定期ポストが不安定になることも予想される書き方でもあります。
その理由は「プログラムの常識」にあります。

プログラムは上から順に実行されていきます。
つまり毎時0分には、「リプライ返しを全て終えてからランダムポストをする」という順番になります。
「リプライ返し」は先に説明した通り「ランダムポスト」よりtwitterと情報をやり取りする回数が多く、twitterの重さや送られてくるリプライの量によって処理にかかる時間が左右されやすいものです。
つまりCRONが0分ちょうどにbot.phpを叩いたとしても、「リプライ返し」の処理に時間がかかり過ぎてしまい「ランダムポスト」の処理にとりかかった時点で0分を過ぎている、という事態が予想できるのです。
つまり
 //毎時0分にランダムポスト
 if(date(&quot;i&quot;) == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
 //毎回リプライ返し
 $response = $eb-&gt;reply(2,&quot;data.txt&quot;,&quot;reply_pattern.php&quot;);
このような書き方にすると、ランダムポストから処理が始まるので、CRONが定刻通りであれば順当に処理が行われるのです。

ただし、レンタルサーバーによっては「●秒以上実行し続けているプログラムは処理途中であっても終了させる」という機能や規約が設定されている場合もあります。
また、処理量がサーバーの処理能力を越えてしまうとダウンする可能性もあります。
このような場合にはプログラム自体を軽くしたり、処理を分散させる努力、またはサーバーを変更する必要が求められます。

**脱初心者してから考える事
ifやswitchでの時間わけ設定が増えてくるとどうしても処理時間が長くなりがちです。
脱初心者したら処理の効率化ができるよう、bot.phpの書き方を工夫してみましょう。

脱初心者したばかりの方にとって最も簡単で有効な処理の効率化は&#039;&#039;「date関数の呼び出し回数を減らす」&#039;&#039;ことです。
date関数は時間を呼び出すdate(&quot;G&quot;)やdate(&quot;i&quot;)だけでなく、月を呼び出すdate(&quot;n&quot;)、日にちを呼び出すdate(&quot;j&quot;)など様々なものがあります。
年月日・曜日・時間などを多用することで様々な指定ができる代わりに、逐一date関数の内容をサーバーに問い合わせ呼び出す動作が増えてしまうので処理速度が低下します。
また、bot.phpの記述内容が増えるに従って一番下の方に書かれたものが時間外になってしまう可能性も高くなります。
そこで、処理を指定する前に時間をEasyBotterに記憶させて処理速度を上げてみましょう。

 //date(&quot;i&quot;)を$minuteに代入する
 $minute = date(&quot;i&quot;);
 //毎回リプライ返し
 $response = $eb-&gt;reply(2,&quot;data.txt&quot;,&quot;reply_pattern.php&quot;);
 //毎時0分にランダムポスト
 if($minute == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
代入演算子「=」は、&#039;&#039;「A = B」の時「BをAに代入する」&#039;&#039;という意味を持ちます。
比較演算子である「==」「===」とはまったく異なるので注意が必要です。
この場合date(&quot;i&quot;)、つまり分を$minuteという関数に代入しています。
同様の方法でdate関数は全て代入することができます、$minute・$hour・$monthなどのように重複しない範囲で関数の名前をつけることができます。

date関数を他の処理より先に関数へ代入することで、CRONがbot.phpを叩いた時刻や日付等をその処理が終わるまでの間記憶してくれます。
つまり、先に時間がかかる処理をした後や大量のifやswitchを経た最下部の処理でも、&#039;&#039;「CRONがbot.phpを叩いた時点」の時刻&#039;&#039;として処理を進めることが可能となるのです。

***動作テストにも使える代入演算子
上記で説明した代入演算子を利用することで、「12月31日限定で動くか」というようなテストもできます。
 $month = date(&quot;n&quot;);
 $day = date(&quot;j&quot;);
本来は上記のようにdate関数を代入しますが、
 $month = 12;
 $day = 31;
このように、ダイレクトな値を代入することで仮想の12月31日の状況にすることができますし、違う値を入れれば「12月31日以外では動かないか」のテストもできます。

いずれの場合も初心者のうちに手を出すべきものではありません、ある程度EasyBotterの挙動そしてPHPに慣れた上ですべきことですが、これらを理解しこなせるようになれば中級者の仲間入りの第一歩です。


*落とし穴に注意３…演算子「%」の理解
さて、これまでの内容を理解したら構文の中身をもう少し分解してみましょう。
 if(date(&quot;i&quot;) % 15 == 0){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
これまで上記について「15分ごとにランダムポストを実行」と書いていましたが、実際は若干異なり、&#039;&#039;正確には「0分・15分・30分・45分にランダムポストを実行」&#039;&#039;となります。
なぜでしょうか、……それは演算子「%」を正しく理解することによって解明できます。

 if(date(&quot;i&quot;) % 15 == 5){
 	$response = $eb-&gt;postRandom(&quot;data.txt&quot;);
 }
このように書いても「15分ごとにランダムポストを実行」しますが、「0分・15分・30分・45分にランダムポストを実行」は&#039;&#039;されません&#039;&#039;。
なぜでしょうか、……これこそが演算子「%」を使いこなすポイントです。
**演算子「%」とは？
演算子「%」はただの&#039;&#039;割り算ではなく剰余&#039;&#039;なのです。
剰余と聞くと耳慣れないかもしれませんが、算数的な言い換えをすると&#039;&#039;「割り算をした時の余り」&#039;&#039;を求める場合に使う演算子です。
つまり
 if(date(&quot;i&quot;) % 15 == 5){
上記は「分を15で割って余りが5の時」という意味で、「5分・20分・35分・50分の時」という指定となります。
**演算子「%」の有効活用
演算子「%」を正しく理解することで活用方法が増えます。

奇数・偶数の振り分けは一々指定しなくても、「% 2」の値が0か1か、という考え方で簡単になります。
 //偶数時は、0分始まりで15分ごとに、guusuu.txtからランダムポスト
 if(date(&quot;G&quot;) % 2 == 0 &amp;&amp; date(&quot;i&quot;) % 15 == 0){
 	$response = $eb-&gt;postRandom(&quot;guusuu.txt&quot;);
 }
 //奇数時は、5分始まりで10分ごとに、kisuu.txtからランダムポスト
 else if(date(&quot;G&quot;) % 2 == 1 &amp;&amp; date(&quot;i&quot;) %10 == 5){
 	$response = $eb-&gt;postRandom(&quot;kisuu.txt&quot;);
 }

CRONと設置サーバーで時間にズレがある場合でも
 if(date(&quot;i&quot;) % 15 == 5 || date(&quot;i&quot;) % 15 == 6){
このようにすることで「5分・6分・20分・21分・35分・36分・50分・51分」と余裕をもたせた指定にすることができます。



*コメント [#n0b1997d]
- 時間別にリプライorPOSTと同じような感じで、時間別にPOSTしないようにしたいです。何方かよろしくお願いします。  -- 沢谷  (2010-07-26 02:19:00)
- 沢谷さん＞その場合、時間別POSTの応用で$response = $eb-&gt;postRandom(&amp;quot;&amp;quot;);とすればPOSTしません  -- 通りすがりのねこ  (2010-08-01 21:09:11)
- もし、if(date(&amp;quot;i&amp;quot;) == &amp;quot;0&amp;quot;){を使う場合、cronの実行間隔は１分にしなければなりませんか？  -- 名無しさん  (2010-09-07 16:56:00)
- &gt;もし、if(date(&amp;quot;i&amp;quot;) == &amp;quot;0&amp;quot;){を使う場合、cronの実行間隔は１分にしなければなりませんか？　回答：その必要はありません  -- 通りすがりのねこ  (2010-09-09 21:15:34)
- 時間別ＰＯＳＴを15分おきにしたい場合、例えば時間別は6~10時のみの設定のを15分おき実行だと、if(date(&amp;quot;G&amp;quot;) &gt; 5 &amp;&amp; date(&amp;quot;G&amp;quot;) &lt; 11 date(&amp;quot;i&amp;quot;) % 30 === 0) で良いのでしょうか？  -- たに  (2010-09-19 01:21:04)
- 夜だけ違うリプライ。bot.php(2)　http://livbot.sblo.jp/　　の記事が参考になりました。サンプルコード書いてあります。  -- ２時間おきに作動させたい場合  (2010-12-10 05:27:08)
- 何回かの間隔で、実行したい場合は、カウンターファイルを作る手もあるぞ。パーミッションは６６６のこと。bot.phpの例で１０回間隔で順次投稿したい場合。１間隔１分だと１０分間隔です。
//
//シーケンスカウンターを作り回数により関数の呼び出しを変えます。
//
function seqnum(){
	$iseq = 0;
	$fname = &quot;count.dat&quot;;
	$iseq = file_get_contents($fname);
	if ($iseq &gt;= 60) {
		$iseq = 0;
	}
	$iseq = $iseq + 1;
	file_put_contents($fname,(string)$iseq); //SEQカウンター書き込み
	echo &quot;参照シーケンス番号　＝　&quot;.$iseq.&quot;&lt;br /&gt;&quot;;
	return $iseq;
}$iseq = seqnum();
if (($iseq % 10) == 0) { 
	$response = $eb-&gt;postRotation(&quot;data.txt&quot;);
} - koziki_bot  (2011-01-28 10:08:59)

- リプを2分置き、呟きを15分置きにしたかったので「if(date(&amp;quot;i&amp;quot;) % 15 == 0){　$response = $eb-&gt;postRandom(&amp;quot;data.txt&amp;quot;);　}」と「$response = $eb-&gt;reply(2,&amp;quot;data.txt&amp;quot;,&amp;quot;reply_pattern.php&amp;quot;);」を書き込んだのですが上手く動きません。ちなみに「$response = $eb-&gt;reply(2,&amp;quot;data.txt&amp;quot;,&amp;quot;reply_pattern.php&amp;quot;);」だけですと正常に動くようです。初心者ながら色々調べてみましたが解決できませんのでもしよければ教えてください。  -- 千紘  (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(&amp;quot;i&amp;quot;) % 30 === 0){　で30分ごとにツイートするように指定して、switch(true)で case (date(&amp;quot;w&amp;quot;) == &amp;quot;1″ &amp;&amp; date(&amp;quot;G&amp;quot;) &gt; &amp;quot;6″ &amp;&amp; date(&amp;quot;w&amp;quot;) == &amp;quot;1&amp;quot; &amp;&amp; date(&amp;quot;G&amp;quot;) &lt; &amp;quot;12&amp;quot;):としても出来ないでしょうか？　すみませんとても困ってます･･･よろしくお願いします。  -- 番  (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)
- @pagesかな？Twitterが重いか@pagesの鯖が重かったり障害があるときになるよ。これは@pagesが正常になるのを待つしか無いね  -- 名無しさん  (2011-07-18 20:26:51)
- 30分とか割り切れる話をするだけで、40分や90分間隔などの場合を書かないあたり不十分なwikiだなと感じる  -- 名無しさん  (2011-10-29 13:11:12)
- ↑40分や90分なら応用でいくらでもやりようがあるし、普通はcronでどうとでもなる。返信が返せないじゃないかならファイルを分ければいいだけのこと  -- 名無しさん  (2011-11-14 00:53:22)
- まあ40分は確かにめんどいかもねー。前回のツイート時刻を取得できればちょっと楽かもしれないけど。  -- 名無しさん  (2012-04-21 17:59:52)
- 時間別リプライをしようと思い、「リプライも同様に条件付けてあげることで、時間別パターン可能です」とあるので時間別ランダムポストと同様にこのように時間分けをしたのですがどうも上手く動いてくれません【if( date(&amp;quot;G&amp;quot;) &amp;gt;=1 &amp;amp;&amp;amp; date(&amp;quot;G&amp;quot;) &amp;lt;= 6 ){$response = $eb-&amp;gt;reply(3,&amp;quot;&amp;quot;,&amp;quot;reply_pattern_night.php&amp;quot;);}　else{$response = $eb-&amp;gt;reply(3,&amp;quot;&amp;quot;,&amp;quot;reply_pattern.php&amp;quot;);}】（ランダムポストは時間分けに成功してます）。ほんとうにこれで動くのでしょうか？  -- むー  (2012-05-20 05:07:43)
#comment    </description>
    <dc:date>2012-05-20T05:07:43+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/1.html">
    <title>トップページ</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/1.html</link>
    <description>
      *EasyBotter 非公式wiki

**wiki編集のお知らせ
新規作成や大きな変更・編集を行った際は、利用者全員が分かるようこのページ下の「コメントを書く」から告知して下さい。
削除したいページがあればこのページ下の「コメントを書く」で利用者全員が分かるよう告知をお願いします。 

**関連リンク すべて外部サイトですので、各自責任を持って利用して下さい。
[[プログラミングができなくても作れるTwitter botの作り方（EasyBotter配布サイト)&gt;http://pha22.net/twitterbot/]] 
このwikiは非公式です。
くれぐれもwikiの内容をphaさんに質問する等迷惑の無い様お願い致します。 
[[Twitter Bot BBS&gt;http://jbbs.livedoor.jp/internet/6629/]] 
phaさん管理のTwitter Bot掲示板です。PHP質問スレッドもあり。EasyBotter以外のTwitter BotでもOK。 
[[Twitter&gt;http://twitter.com/]] 

*コメント
- 無事Botの運営に成功しました。まとめていただいた皆さんに感謝を。  -- 名無しさん  (2011-06-13 19:48:44)
- 『&amp;quot;EasyBotterから&amp;quot;のEasyBotterという部分は変えられますか？』のページ。oauth_test.php内の3行目「require_once(&#039;twitterOAuth.php&#039;);」は全部小文字に直さないとダメだな  -- 名無しさん  (2012-02-20 01:26:51)
- 不具合一覧が不具合（リンク切れ？）を起こしている。  -- 名無しさん  (2012-03-16 01:46:00)
- 自分で直しておきました。  -- 名無しさん  (2012-03-29 15:10:07)
- 関連リンクにある、•EasyBotterで緊急時BOT停止する方法 のページが見られないようになってしまっています。是非導入したいので、また閲覧できるようになればうれしいのですが・・・  -- 名無しさん  (2012-05-16 01:31:57)
#comment    </description>
    <dc:date>2012-05-16T01:31:57+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/2.html">
    <title>メニュー</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/2.html</link>
    <description>
      [[トップページ]]
*Read me
-[[質問する前に]]
-[[注意事項]]
*ver.2.0beta版
-設置手順
--[[前準備～設置編&gt;ver.2.0*設置手順*前準備～設置編]]
--[[最新のAPIに変更]]
--[[手動実行編&gt;ver.2.0*設置手順*手動実行編]]
--[[エラー解決編&gt;ver.2.0*設置手順*エラー解決編]]
--[[脱初心者編&gt;ver.2.0*設置手順*脱初心者編]]

-機能追加
--[[時間分け&gt;ver.2.0/応用/機能追加/時間分け]]
--[[時間分けマスターになる為に]]
--[[reply&gt;ver.2.0/応用/機能追加/reply]]
--[[replyTimeline&gt;ver.2.0/応用/機能追加/replyTimeline]]
--[[postRandom&gt;ver.2.0/応用/機能追加/postRandom]]
--[[postRotation&gt;ver.2.0/応用/機能追加/postRotation]]
--[[ID別設定&gt;ver.2.0/応用/機能追加/ID別設定]]

-よくある質問
--[[設定&gt;ver.2.0*よくある質問*設定]]
--[[OAuth関連&gt;ver.2.0*よくある質問*OAuth]]
--[[エラーは出ないのに…&gt;ver.2.0*よくある質問*エラーは出ないのに…]]
--[[PHPエラー&gt;ver.2.0*よくある質問*PHPエラー]]

-おまけ
--[[簡易ローカルチェック&gt;簡易ローカルチェック]]

[[不具合一覧&gt;ver.2.0*現状バグ]]
*ver.1.42版
-よくある質問
--[[OAuth関連&gt;ver.1.42*よくある質問*OAuth]]

-機能追加
&amp;color(#ff0000){&#039;&#039;脱初心者出来たら！&#039;&#039;}

-その他
--[[Twitter Bot関連リンク]]
--[[Twitter Bot BBS（外部サイト）&gt;&gt;http://jbbs.livedoor.jp/internet/6629/]]

**更新履歴
#recent(10)

&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2012-03-29T01:49:43+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/34.html">
    <title>最新のAPIに変更</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/34.html</link>
    <description>
      *最新APIへの変更
Twitter側の仕様変更がありましたので、EasyBotterで使用しているTwitter APIを最新のものに変更しなければなりません。
以下の解説は&amp;bold(){2011年8月12日現在の情報}です。
**APIとは？
APIとは「Application Program Interface」または「Application Programming Interface」のことです。
　参考：[[Wikipedia:アプリケーションプログラミングインタフェース&gt;http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9]]
EasyBotterではリプライやタイムラインの取得、フォロー・フォロワーのIDや名前を取得、などの際にTwitterAPIを使用しています。
古いTwitter APIを使用し続けていると、挙動がおかしくなったり、全く機能しなくなるおそれがありまです。
今後もTwitter側の仕様変更などでAPIが変更になる場合があるかも知れませんので、公式情報を定期的に確認しましょう。
**API更新方法

&amp;bold(){EasyBotter.php のパーミッションを 666 に変更してから}、
次のスクリプトを replace.php など適当な名前で&amp;color(red){EasyBotter.phpと同じディレクトリに}アップロードして、
ブラウザなどから実行してください。
またはbot.phpの中に&lt;?php ～～ ?&gt;の～～の部分を貼り付けて、bot.phpから実行してもかまいません。
ただしbot.phpから実行する場合、書き換え処理が終了したら、このコードは削除してください。
自動で更新するのが不安な場合は、下記の表に従って手動で書き換えても大丈夫です。
 &lt;?php
 $target = &quot;EasyBotter.php&quot;;
 echo file_put_contents($target,str_replace(&#039;replies.xml&#039;,&#039;mentions.xml&#039;,
 preg_replace(&quot;/ps?:\/\/twitter.com\/([a-z\/_]+)/&quot;,&quot;p://api.twitter.com/1/$1&quot;,
 file_get_contents($target))))?&quot;多分完了しました。確認して下さい&quot;:&quot;失敗しました&quot;;
 ?&gt;

EasyBotter.php の下部にまとまっている API 群が、下記の通り書き換わったかを漏れ無く確認して下さい。
コピー＆ペーストの際に余計な文字（スペース等）が入ったり、必要な部分を消したりしないよう注意しましょう。
 https://twitter.com/statuses/update.xml
 ↓
 http://api.twitter.com/1/statuses/update.xml
 
 http://twitter.com/statuses/friends_timeline.xml
 ↓
 http://api.twitter.com/1/statuses/friends_timeline.xml
 
 http://twitter.com/statuses/replies.xml
 ↓
 http://api.twitter.com/1/statuses/mentions.xml
 
 http://twitter.com/statuses/friends.xml
 ↓
 http://api.twitter.com/1/statuses/friends.xml
 
 http://twitter.com/statuses/followers.xml
 ↓
 http://api.twitter.com/1/statuses/followers.xml
 
 http://twitter.com/friendships/create/&quot;.$screen_name.&quot;.xml
 ↓
 http://api.twitter.com/1/friendships/create/&quot;.$screen_name.&quot;.xml    </description>
    <dc:date>2012-03-07T20:14:21+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/13.html">
    <title>ver.2.0*設置手順*前準備～設置編</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/13.html</link>
    <description>
      #contents
*はじめに
何も手を加えずそのままうｐ→最低限の機能を手動で動かす、この間のエラー対処することから始めましょう。
&#039;&#039;「プログラミングができなくても～」と言っても、公式にも書かれているように、最低限知っておかねばならない言葉や材料があります。&#039;&#039;
それらを意味を理解しないままスキップして設置解説サイト通りにやっても動かない・分からないといわれても誰も助けてくれません。
あなたがまず理解しないことにはスタートラインに立てないのです。
面倒くさがらず調べて、言われている意味が分かるようになってからプログラムに触れましょう。それからでも遅くはありません。
いきなり設置して、cronでアクセスさせて正常に機能しなかったら、基本的なPHPエラーの原因は分かりません

*用意するもの
おすすめのものをピックアップしています。
使い方は各自、自己責任で学んでください。

**PHP（5以上）が使えるレンタルサーバー
***使用実績のあるサーバー
&amp;color(#ff0000){注：実績があるからといっても、最低限サーバー仕様やオンラインマニュアル、よくある質問等にも目を通しておきましょう。}
&amp;color(#ff0000){　　あまりに無知・無茶すぎるとレンタル元から『twitterのbot設置は禁止します』となるかもしれません。}
&amp;color(#ff0000){　　すでにPHP5が使えるサーバーで禁止しているところもあります}
-&#039;&#039;有料サーバー&#039;&#039;
--[[XREA plus&gt;http://www.value-domain.com/xrea.php]]
--[[さくらインターネット&gt;http://www.sakura.ne.jp/]] (スタンダード以上)
--[[LaCoocan&gt;http://homepage.nifty.com/]](スタンダード以上)
--[[ロリポップ&gt;http://lolipop.jp/]]
-&#039;&#039;無料サーバー&#039;&#039;
--[[XREA&gt;http://www.value-domain.com/xrea.php]]
--[[@pages&gt;http://atpages.jp]]
--[[fizby.net&gt;http://fizby.net/]]
--[[TOK2&gt;http://tok2.com/reg_select.html]]

ちなみに、初心者質問スレなどから見ると@pagesが人気のようです。
land.toはEasyBotterは動作不可。TOK2はSSLが使えないので本体改造が必要。FileQはver.2なら設置可能。　ver1.42でのOAuth認証はland.toと共に出来ない（curlエラー）


**botに使うTwitterのアカウント
Twitter.comからアカウントを登録する。もちろんBOT専用のものを取得する。
&amp;color(#ff0000){※10個以上の類似したアカウントを取得すると削除される、という情報があります。複数のアカウントを持っている場合は注意して下さい。}


**テキストエディタ
phpに対応していて、コマンドや要素の自動色分けに対応したものを選びたい。
また、Easybotterのファイル群は全て&#039;&#039;「文字コード：UTF-8、改行コード LF」&#039;&#039;であるので、これを確認・指定できるものだとなお良い。
***Windows用テキストエディタ
-Peggy Pad（[[Peggy Pad配布元&gt;&gt;http://www.anchorsystems.jp/anchor/ashp/peggy/pegindex.html]]） ※シェアウェアもあるので注意
-NoEditor/UnEditor（[[NoEditor/UnEditor配布元&gt;&gt;http://www.yokkasoft.net/]]） ※シェアウェアもあるので注意
-EmEditor Free（[[EmEditor Free配布元&gt;&gt;http://jp.emeditor.com/modules/download2/rewrite/tc_5.html]]） ※シェアウェアもあるので注意
--ツール→すべての設定プロパティで、基本→行番号を表示、記号→全角空白表示にチェックを入れておくと編集に便利
-TeraPad（[[TeraPad配布元&gt;&gt;http://www5f.biglobe.ne.jp/t-susumu/library/tpad.html]]）
--ファイルを保存するときは、文字コード：UTF-8N、改行コード LFで
-K2Editor（[[K2Editor配布元&gt;&gt;http://k2top.jpn.org/]]）
-PHPエディタ（[[PHPエディタ配布元&gt;&gt;http://phpspot.net/php/]]）
--standalone版おすすめ。PHP（easyPHP等でもok）も同時にDL・インストールしてphp.exeの場所を入力してやると構文チェック機能を使えるようになる。
--ソースの先頭数行に全角文字がない場合は、読み込み時に日本語が文字化けしてしまうことがあります。そういう場合は「ファイル」-「再読込」でUTF-8を指定してください。
***Macintosh用テキストエディタ
-CotEditor（[[CotEditor配布元&gt;&gt;http://www.aynimac.com/p_blog/files/article.php?id=41]]）
-mi（[[mi配布元&gt;&gt;http://mimikaki.net/]]/[[mi 用の PHP モード&gt;&gt;http://semicolon.jp/ussy/gadgets/]]）
***文字コード（UTF-8）について
正式にはUTF-8でバイトオーダー(BOM)無しです。ソフトによってはこれを「UTF-8N」や「UTF-8(no signature)」などと表記していますが、わざわざBOM有りにする必要は有りません。


**FTPソフト
DLしたEasyBotterをサーバーへアップロードする為に必要です。
@PAGESなどのサーバーにはファイルマネージャーという機能があります。
これを使う場合には、FTPソフトは必要ありません。
***Windows用
-FFFTP（[[配布元&gt;&gt;http://sourceforge.jp/projects/ffftp/]]）
-FileZilla([[配布元&gt;&gt;http://sourceforge.jp/projects/filezilla/]])
***Mac用
-FireFTP（[[配布元&gt;&gt;https://addons.mozilla.org/ja/firefox/addon/684/]]）　※Firefoxアドオン
-FileZilla([[配布元&gt;&gt;http://sourceforge.jp/projects/filezilla/]])    </description>
    <dc:date>2012-02-18T04:27:43+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/29.html">
    <title>ver.2.0/応用/機能追加/ID別設定</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/29.html</link>
    <description>
      ※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。
#contents
*特定のアカウントと会話（リプライ）させたくない [#o0aaf045]
EasyBotter.php内
 //必要なつぶやきのみに絞る
 function selectTweets($response){
	$replies = array();
	foreach($response as $reply){
		//自分自身のつぶやきを除外する
		$replyName = (string)$reply-&gt;user-&gt;screen_name;
		if($this-&gt;_screen_name == $replyName){
			continue;
		}
		//RT, QTを除外する
		$text = (string)$reply-&gt;text;
		if(strpos($text,&quot;RT&quot;) != FALSE || strpos($text,&quot;QT&quot;) != FALSE){
			continue;
		}
		$replies[] = $reply;
	}
 return $replies;
 }
を探す。

**botと名の付くアカウントを制限する [#n9e81b80]
 if($this-&gt;_screen_name == $replyName){
を
 //■■botを除外■■
 if($this-&gt;_screen_name == $replyName || preg_match(&quot;@bot@i&quot;,$replyName)){
に変更する。
bot（大小文字関係なく）と名の付くアカウントに対してはリプライしなくなります。

**特定のアカウントを制限する [#v1124dd8]
 if($this-&gt;_screen_name == $replyName){
を
 //■■特定の人を除外■■
 $bottername = array(&quot;abcd&quot;,&quot;efgh&quot;);
 if($this-&gt;_screen_name == $replyName || in_array($replyName, $bottername)){
とすることで、abcdとefghという名のアカウントに対してリプライしなくなります。
botと入ってないアカウント名のBOTを指定したい場合に使用して下さい。


*特定のアカウントとのリプライ回数を制限したい [#hcd8233e]
このサンプルは[[zkb_ot&gt;http://kzkbot.blog9.fc2.com/blog-entry-8.html]]さんのソースを参考にしています。

EasyBotter.php内
 //リプライを作る
 （略）
 $status = &quot;&quot;;
 //リプライパターンと照合
 if(!empty($this-&gt;_replyPatternData[$replyPatternFile])){
を探す。
 $status = &quot;&quot;;
の直前に
 //■■会話数制限（リプライ返し）■■
 $filenameb = &quot;kaiwalog.txt&quot;;//kaiwalog.txtに誰からリプライがあったか最新$botk1件記録する
 //$filenamebは存在するか？
 if(!file_exists($filenameb)){
	touch($twit_logfile) or die(&#039;ファイル作成に失敗\n&#039;);
	chmod($twit_logfile, 0606) or die(&#039;権限変更に失敗\n&#039;);//※パーミッションは鯖によって違います
  }
 $botdata = file_get_contents($filenameb);
 $botdata2 = $botdata;
 $countk = substr_count($botdata2,(string)$reply-&gt;user-&gt;screen_name);
 $botdata = explode(&quot;,&quot;,$botdata);
 $kazu = count($botdata);
 $botkey = 1;
 $botk1 = &quot;10&quot;;$botk1--;//記録件数
 $botk2 = &quot;2&quot;;//回までOK
 $bottername = array(&quot;abcd&quot;,&quot;efgh&quot;);//制限したいアカウント名をいれる
 if(preg_match(&quot;@bot@i&quot;,(string)$reply-&gt;user-&gt;screen_name) || in_array((string)$reply-&gt;user-&gt;screen_name,$bottername)){
	if ($countk&gt;=$botk2){
		$botkey = &quot;0&quot;;
		$botdata = implode(&quot;,&quot;,$botdata);
	}else{
		while ($kazu&gt;$botk1){$botdatax = array_pop($botdata);$kazu = count($botdata);}
		$botdata=implode(&quot;,&quot;,$botdata);
		$botdata=(string)$reply-&gt;user-&gt;screen_name.&quot;,&quot;.$botdata;
	}
 }else{
	while ($kazu&gt;$botk1){$botdatax = array_pop($botdata);$kazu = count($botdata);}
	$botdata=implode(&quot;,&quot;,$botdata);
	$botdata=(string)$reply-&gt;user-&gt;screen_name.&quot;,&quot;.$botdata;
 }
 file_put_contents($filenameb,$botdata);
 if($botkey == &quot;0&quot;){
	continue;
 }
を追記し、保存する。
空のkaiwalog.txtを作成し、EasyBotter.phpと共にサーバーへアップロードする。
kaiwalog.txtはログファイル用のパーミッションにする。
※作成しなくても自動作成するようにしてありますが、自分で作成してうｐするのが確実

**備考 [#ldfe0701]
リプライをくれたアカウント名を最新10件記録します。
そのうち、bot（大小文字関係なく）と名の付くアカウントから3回目のリプライにはリプライ返ししません（2回まではリプライをする。）
abcdとefghという名のアカウントに対しても制限します。
↑botと入ってないアカウント名のBOTを指定したい場合に使用して下さい。

***毎日ログをリセットしたい [#y24beea8]
bot.php内
 $eb = new EasyBotter();
の直後に
 //■■リプライした人の記録リセット■■
 if(date(&quot;H-i&quot;)==&quot;00-00&quot;){$fp = fopen(&quot;kaiwalog.txt&quot;, &quot;w&quot;);fclose($fp);}
を入れてください。
0時0分にアクセスした時、ファイルを真っ白にしてから処理を行います。


*特定のアカウントに対しては、別のリプライパターンを読み込ませたい [#g6a99bfa]
EasyBotter.php内
//リプライを作る
 function makeReplyTweets($replies, $replyFile, $replyPatternFile){
	if(empty($this-&gt;_replyPatternData[$replyPatternFile]) &amp;&amp; !empty($replyPatternFile)){
		$this-&gt;_replyPatternData[$replyPatternFile] = $this-&gt;readPatternFile($replyPatternFile);
	}
 （略）
			foreach($this-&gt;_replyPatternData[$replyPatternFile] as $pattern =&gt; $res){

1.
 if(empty($this-&gt;_replyPatternData[$replyPatternFile]) &amp;&amp; !empty($replyPatternFile)){
の直後に
 $org_repfile = $replyPatternFile;	//デフォルトのファイル名を保管
を追記する。

2.
&gt;foreach($this-&gt;_replyPatternData[$replyPatternFile] as $pattern =&gt; $res){
の直前に
 //■■特定の人には別パターン■■
 $userName = (string)$reply-&gt;user-&gt;screen_name;
 switch(true){
	case stristr($userName, &quot;bot&quot;)://botと名のつくアカウント名に対して
	$replyPatternFile = &quot;bot_pattern.php&quot;;//bot_pattern.phpを適用する
	$this-&gt;_replyPatternData[$replyPatternFile] = $this-&gt;readPatternFile($replyPatternFile);
	break;
	case $userName == &quot;abcd&quot;://abcdというアカウント名に対して
	case $userName == &quot;efgh&quot;://efghというアカウント名に対して
	$replyPatternFile = &quot;xxx_pattern.php&quot;;//xxx_pattern.phpを適用する
	$this-&gt;_replyPatternData[$replyPatternFile] = $this-&gt;readPatternFile($replyPatternFile);
	break;
        default://それ以外
        $replyPatternFile = $org_repfile;	//デフォルトのパターンファイル名
 }
または
 //■■特定の人には別パターン■■
 $userName = (string)$reply-&gt;user-&gt;screen_name;
 if(stristr($userName, &quot;bot&quot;)){//botと名のつくアカウント名に対して
	$replyPatternFile = &quot;bot_pattern.php&quot;;//bot_pattern.phpを適用する
	$this-&gt;_replyPatternData[$replyPatternFile] = $this-&gt;readPatternFile($replyPatternFile);
 }else if($userName == &quot;abcd&quot; || $userName == &quot;efgh&quot;){
	$replyPatternFile = &quot;xxx_pattern.php&quot;;//xxx_pattern.phpを適用する
	$this-&gt;_replyPatternData[$replyPatternFile] = $this-&gt;readPatternFile($replyPatternFile);
 }else{
        $replyPatternFile = $org_repfile;	//デフォルトのパターンファイル名
 }
を追記する。


*特定のアカウントは自動フォローしない [#hd86ba2c]
EasyBotter.php内
 foreach($followList as $screen_name){
	$response = $this-&gt;followUser($screen_name);
 }
を
 foreach($followList as $screen_name){
	//■■xxxはフォロー返ししない■■
	if(!preg_match(&quot;@bot@i&quot;,$screen_name)){
		$response = $this-&gt;followUser($screen_name);
	}
 }
と変更する。
例ではbotと名のつくアカウントすべて。

*コメント [#ub9d67da]
- 特定のアカウントへのリプライ回数制限を特定ではなく総てのＩＤに対して10回中4回以上制限するにはどこの記述を替えるのがいいでしょうか？ワイルドカード？とか思って調べてみたんですがうまく動きませんでした。どなたかわかる方いたら教えてください。  -- 名無しさん  (2010-11-17 16:38:42)
- 「特定のアカウントに対しては、別のリプライパターンを読み込ませたい 」をそのままコピペすると、Warning:  Invalid argument supplied for foreach()　が、環境によって出るみたい。その時、foreach((array)$this-&gt;_replyPatternData[$replyPatternFile] as $pattern =&gt; $res){　に変更すると、解決します。と報告。  -- ナナシ  (2010-12-21 22:02:49)
- 「特定のアカウントに対して別のリプライパターン」を「時間分けポスト」と併用しているのですが、こちらが返したリプライに対するさらなるリプライに、反応語がないとArreyで返してしまいます。対策はありますでしょうか？  -- 名無しさん  (2011-01-21 08:09:06)
- 特定のアカウントのTLに対し、個別にリプライパターンを読ませたい場合、上記の「リプライパターンの個別設定」を利用しようとしてるのですがなぜかうまくいきません。どなたかわかりますでしょうか？  -- 名無しさん  (2011-02-03 00:14:56)
- 特定のIDに対してTL反応のみさせず、リプライには通常通り返信できるようにしたいのですが可能でしょうか？  -- 名無しさん  (2011-06-03 01:31:00)
- 「特定のアカウントとのリプライ回数を制限したい」で特定のIDは制限したまま、botの回数制限は外したいんですが、何か方法はありますか？  -- 名無しさん  (2011-06-12 23:08:26)
- ↑「特定のIDは制限したまま、botの回数制限は外したい～」解決しました。  -- 名無しさん  (2011-06-16 17:52:22)
- 「特定のアカウント」ではなく、「特定の単語」でリプライパターンファイルを分ける方法があれば知りたいのですが  -- 名無しさん  (2011-12-14 00:13:44)
#comment    </description>
    <dc:date>2011-12-14T00:13:44+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/33.html">
    <title>時間分けマスターになる為に</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/33.html</link>
    <description>
      &amp;color(#ff0000){このページへ誘導されてきた方へ}
----
このページに「&amp;color(#ff0000){&amp;bold(){回答}}」はありません、脱初心者を目指す意欲的な方のお勉強の取っ掛かりをサポートするページです。

このページを読解していただくことでbot.php編集における基本・応用がこなせるようになります。
ソースのコピペは思わぬ誤作動の元となりやすく、またコピペで済ませることで誤作動の原因に気付きにくくなる欠点があります。
bot.phpを構成しているPHPのパーツを理解することで、bot.phpの全体を正しく把握し制御できるようになります。

ここでは「プログラミングができなくても～」というEasyBotterの基本にもとづき、あえてプログラミングの説明らしからぬ方法で説明している部分もあります。
プログラミング初心者にプログラミングの基礎を学んでもらうモノなので、プログラミング慣れした方には違和感あるかと思いますがご容赦ください。

またEasyBotterに関連するものに特化して説明していますので、PHP自体に興味をもたれた方は本家のマニュアルなどを参照されると良いでしょう。
EasyBotterは基本性能が備わっているので、基礎を勉強することで比較的容易に改造に着手することができます。
botをの機能を発展させたいと思う方は是非、基礎を勉強してみてください。

----

#contents
*時間分けとは？
botの動作を複雑化させる為に必要な時間分けですが、何から調べればよいのかわからない、という方も多いのではないでしょうか。
ここでは時間分けで使う内容を分解しそれぞれを理解することで、時間分けをマスターします。

[[時間分け]]を理解している方は以下の内容を正しく理解できるでしょう。
 if(date(&quot;G&quot;) == 7 &amp;&amp; date(&quot;i&quot;) == 30){
 	$response = $eb-&gt;postRandom(&quot;0730.txt&quot;);
 }
正解は「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」です。
簡単に書けば「7時30分に0730.txtからランダムポスト」で済みますが、上記のように書いたのには理由があります。

bot.phpにおいては、関数や演算子などを条件文に入れ込むことで構成されていきます。
「関数」「演算子」「条件文」というと難しいイメージを持つかもしれませんが、パターンは多くありません。
まずは時間分けの基本形を知ることで、複雑な動作を分解してみましょう。

*制御構造「if」
ここではifを使った条件分岐を説明しますが、初めに&amp;bold(){「プログラムは書かれた順に実行される」}ということを覚えていてください。
これはこの項目に限らず全てのプログラムに通じるものです。
つまり条件をいくつも提示した場合、&amp;bold(){先に書かれた条件が優先される}のです。
**ifの基本形
まずはif文の基本形を見てみましょう。
 if(条件){処理;}
たったこれだけです。
&amp;bold(){if文は英語の「もし～ならば」という意味と同じ}で、この場合は「もし条件に当てはまるなら処理をする」というものです。

 if(条件１){処理１;}
 if(条件２){処理２;}
 if(条件３){処理３;}
このように何行も並列していけばこの基本形だけで時間分けは可能ですが、スマートな書き方とは言い難いものです。
**ifの拡張機能
それではif文の拡張機能「else if」「else」を使ってみましょう。
 if(条件１){
 	処理１;
 }
 else if(条件２){
 	処理２;
 }
 else{
 	処理３;
 }
&amp;bold(){elseは英語の「その他」}という意味と同じとなります。
&amp;bold(){else ifは「他にもし～ならば」}、&amp;bold(){elseは「その他の場合は」}、となります。

ここで問題です、【条件１】にも【条件２】にも当てはまる場合、処理はどのようになるのでしょうか？
ここで&amp;bold(){「プログラムは書かれた順に実行される」}を思い出しましょう。
書かれた順、つまり最初の【条件１】に対応する【処理１】が行われることはわかりますね？
では【条件２】にも当てはまっているので【処理２】も行われるのでしょうか……答えはＮＯ。
「else」という英単語には「その他」という意味があることは先に説明しましたが、これには&amp;bold(){「既にあるものは除いて」という意味}が含まれています。
つまり、【条件１】に当てはまるものは【処理１】が終わった時点で終了、【条件１】に当てはまらなかったものだけが【条件２】の判定へ進むことができるのです。
また【条件１】にも【条件２】にも当てはまらない、つまり「その他の場合」は【処理３】が実行されます。
**if文の複雑化
if文は一つの条件で二つ以上の処理をすることもできます。
 if(条件１){
 	処理１ａ;
 	処理１ｂ;
 }
 else if(条件２){
 	処理２ａ;
 	処理２ｂ;
 }
 else{
 	処理ａ;
 	処理ｂ;
 }

また、「if」「else if」「else」の処理にさらなるif文を入れ込むこともできます。
 if(条件１){
 	if(条件ａ){
 		処理１ａ;
 	}
 	else if(条件ｂ){
 		処理１ｂ;
 	}
 	else{
 		処理１;
 	}
 }
 else if(条件２){
 	if(条件ａ){
 		処理２ａ;
 	}
 	else{
 		処理２;
 	}
 }
 else{
 	if(条件ａ){
 		処理ａ－１;
 		処理ａ－２;
 		処理ａ－３;
 	}
 }
if文は上記のような２段階に限らず、３段階４段階と増やすことができます。
**if文の要素一覧
|if|もし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない|条件分岐させる場合、必ず最初に書くもの。&amp;br()（ただし並列して実行する条件分岐は別）|
|else if|他にもし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない|「if」または「else if」の後につけることができる。&amp;br()なくても良い。|
|else|その他の場合は【処理】を実行、「}」で同列冒頭にあるif文を終了する|「if」「else if」の条件のどれにも当てはまらない場合の処理。&amp;br()なくても良い。|
|()|【条件】内容を丸括弧で囲む|「if」「else if」で使えるが、「else」では使えない。&amp;br()条件は演算子を使うことで複雑化・詳細化できる。|
|{}|【処理】内容を波括弧で囲む|「if」「else if」「else」のいずれでも必要。&amp;br()複数行可、複数の処理を書いても良い。|
|;|【処理】内容の最後に必要なセミコロン|これを忘れるとエラーになる、消し過ぎに注意。|


*関数とは？
「関数」とは一定の処理を行いその結果や値を反映させるものです。
EasyBotterでは特にbot.phpで時間わけをする時に使う「date関数」がなじみ深く、また重要な関数となります。
ここではEasyBotterで使うdate関数について説明します。
**date関数
bot.phpでの使用頻度が高い物、bot.phpの動作が工夫できるものを紹介しています。
詳細は[[PHPマニュアル&gt;http://php.net/manual/ja/function.date.php]]をご覧ください。
|単位|date(&quot;？&quot;)|値|特徴|利用法|
|年|Y|2011など|4桁の西暦||
|~|y|11など|下2桁の西暦||
|~|L|0～1|0＝平年、1＝うるう年|2月やdate(&quot;z&quot;)を使う時に有用|
|月|n|1～12|1桁の月には0をつけない|bot.phpで使う機会が多い、覚えてしまおう|
|~|m|01～12|1桁の月に0をつける||
|~|t|28～31|その月が何日まであるか|date(&quot;t&quot;)とdate(&quot;j&quot;)の値が同じ時は月末日、など|
|日|j|1～31|1桁の日には0をつけない|bot.phpで使う機会が多い、覚えてしまおう|
|~|d|01～31|1桁の日に0をつける||
|~|z|0～365|その年の何日目か（1月1日が0）|34（立春）以降は春、124/125（5月5日/立夏）以降は夏～など工夫できる|
|時|G|0～23|24時制、1桁には0をつけない|bot.phpで頻出、覚えてしまおう|
|~|H|00～24|24時制、1桁に0をつける||
|~|g|0～12|12時制、1桁には0をつけない||
|~|h|00～12|12時制、1桁に0をつける||
|~|A|AM、PM|午前午後、大文字|12時制の時に有用|
|~|a|am、pm|午前午後、小文字|~|
|分|i|00～59|1桁には0をつける|bot.phpで頻出、覚えてしまおう|
|秒|s|00～59|1桁には0をつける|CRONとの誤差が生じやすい為あまり使う事は無い|
|曜日|w|0～6|0＝日曜、1＝月曜…6＝土曜|数値なので1～5は平日、その他は週末、という分け方も|
|~|D|Mon～Sun|英語の略表記|&quot;w&quot;の意味がわからない方に…スペルミスに注意|


*演算子とは？

**代数演算子とは？
加減乗除など、主に数値の計算をするものです。（文字列などによる例外もあります）
bot.phpでは「%」を使う機会が多いのですが、その意味を間違えている方も少なくありません。
いずれも小学校で習う算数レベルなので、意味を理解すれば難しいものではありません。
***代数演算子
bot.phpでの使用頻度が高い物を紹介しています。
詳細は[[PHPマニュアル&gt;http://www.php.net/manual/ja/language.operators.arithmetic.php]]をご覧ください。
|+|Ａ + Ｂ|加算|ＡにＢを足した値|「3 + 7」の値は「10」|
|-|Ａ - Ｂ|減算|ＡからＢを引いた値|「19 - 9」の値は「10」|
|*|Ａ * Ｂ|乗算|ＡにＢを掛けた値|「2 * 5」の値は「10」|
|/|Ａ / Ｂ|除算|ＡをＢで割った値|「10 / 4」の値は「2.5」|
|%|Ａ % Ｂ|剰余|ＡをＢで割った時の余り|「10 % 7」の値は「3」|

**比較演算子とは？
名前の通り、演算子の左右にあるものを比較します。
bot.phpの編集において欠かせないものですので、是非覚えましょう。
また、使い方次第で複雑な設定をすることができます。
***比較演算子
bot.phpでの使用頻度が高い物を紹介しています。
詳細は[[PHPマニュアル&gt;http://www.php.net/manual/ja/language.operators.comparison.php]]をご覧ください。
|Ａ == Ｂ|ＡとＢが等しい|
|Ａ === Ｂ|ＡとＢが同型かつ等しい|
|Ａ != Ｂ|ＡとＢが等しくない|
|Ａ &lt;&gt; Ｂ|~|
|Ａ !== Ｂ|ＡとＢが同型でないか等しくない|
|Ａ &lt; Ｂ|ＡがＢより少ない|
|Ａ &gt; Ｂ|ＡがＢより多い|
|Ａ &lt;= Ｂ|ＡがＢ以下|
|Ａ &gt;= Ｂ|ＡがＢ以上|
これも小学生で習うことですが、「より少ない」「より多い」はその数値を含まない、「以下」「以上」はその数値を含む、という算数の基本を間違えないよう注意。

**論理演算子とは？
論理演算をおこなう為の演算子です……「論理演算」と聞くと耳慣れませんが、「ベン図」と聞くとピンと来る方もいるかと思います。
（ベン図についてはWikipediaの[[論理演算とペン図&gt;http://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E5%9B%B3#.E8.AB.96.E7.90.86.E6.BC.94.E7.AE.97.E3.81.A8.E3.83.99.E3.83.B3.E5.9B.B3]]に詳しいのでこの場では説明を省略します。）
条件の組み合わせを一つの式の中に収める為に使われるもので、AND・OR・NOTという基本で成り立ちます。
***論理演算子
bot.phpでの使用頻度が高い物を紹介しています。
詳細は[[PHPマニュアル&gt;http://www.php.net/manual/ja/language.operators.comparison.php]]をご覧ください。
|Ａ &amp;&amp; Ｂ|ＡかつＢの場合【優先度：高】|
|Ａ ｜｜ Ｂ|ＡまたはＢの場合【優先度：高】&amp;br()「｜｜」はwiki仕様の都合上全角になっています、半角に直して下さい|
|Ａ and Ｂ|ＡかつＢの場合【優先度：低】|
|Ａ or Ｂ|ＡまたはＢの場合【優先度：低】|
|Ａ xor Ｂ|ＡとＢのうちどちらかにだけ当てはまる場合|
|!Ａ|Ａに当てはまらない場合|
「Ａ &amp;&amp; Ｂ &amp;&amp; Ｃ」「Ａ || Ｂ || Ｃ」「Ａ &amp;&amp; Ｂ or Ｃ &amp;&amp; Ｄ」のように、複数の論理演算子を使うこともできます。
ちなみに「Ａ &amp;&amp; Ｂ or Ｃ &amp;&amp; Ｄ」は優先順位の関係で「ＡかつＢ、または、ＣかつＤの場合」となります。

**代入演算子とは？
文字通り「代入」する為の演算子で、代入するものは数値に限らず文字列も代入することが可能です。
代入演算子の左辺にくるものは「$a」のような[[変数&gt;http://www26.atwiki.jp/easybotter_wiki/pages/33.html#id_989275b7]]であることが殆どです。

この代入演算子はbot.php編集において必須の要素ではありません、[[脱初心者してから考える事&gt;http://www26.atwiki.jp/easybotter_wiki/pages/25.html#id_b871d05d]]で説明していますが、EasyBotterにおいては&amp;bold(){完全に脱初心者してから}とりかかる分野となります。
***代入演算子
bot.phpでの使用頻度が高い物を紹介しています。
|Ａ = Ｂ|ＡにＢを代入する|結果的にＡ＝Ｂ|
|Ａ += Ｂ|ＡにＢを加算したものを、Ａに代入する|結果的にＡ＋Ｂ|
|Ａ .= Ｂ|ＡにＢを続けて、Ａに代入する|結果的にＡＢ|
|Ａ ++|Ａに1を加算したものを、Ａに代入する|結果的にＡ＋１|
|Ａ --|Ａから1減算したものを、Ａに代入する|結果的にＡ－１|

**演算子の優先順位
全ての演算子には優先順位が設定されており、複雑な動作を構築する上で留意しておかなければなりません。
特に論理演算子は当該項目でも説明していますが、動作に大きく影響するものなので優先順位を把握し適切に使用しましょう。
詳細は[[PHPマニュアル&gt;http://www.php.net/manual/ja/language.operators.precedence.php]]をご覧ください。


*変数とは？
変数はプログラムにおける一時的なデータの事で、特定の文字列や数値に名前をつけることができます。
この変数はbot.php編集において必須の要素ではありません、[[脱初心者してから考える事&gt;http://www26.atwiki.jp/easybotter_wiki/pages/25.html#id_b871d05d]]で説明していますが、EasyBotterにおいては&amp;bold(){完全に脱初心者してから}とりかかる分野となります。
**変数の設定
変数名は「半角英数（a～z、A～Z、0～9）」及び「アンダーバー（_）」ならば下記の事項以外で特に制限はありません。
-変数名は必ず「$」から始めなければなりません
-「$」の直後に半角数字を置く事はできません
-「$」の直後は半角アルファベットまたはアンダーバーでなければなりません
-大文字と小文字は別の文字として扱われます

「$12345」という変数名は数字から始まっているのでダメですが、「$abc123」や「$_1234」はＯＫです。
また「$ABCD」「$Abcd」「$abcd」は大文字・小文字の差異がある為、全て別の変数として扱われます。
基本的に変数名に使用する文字数に制限はありません、「$a」のような1文字でも良いですし「$today_year_month_day_week」のような長いものでも大丈夫です。
自分で命名できるものですから、自分がわかるものならば大丈夫です。
ただし、文字数が多くなり過ぎるとスペルミスも起こりやすくなるので「$today_year_month_day_week」は「$today_YMDW」と短縮するなど、個人で考えて使用してください。


*最後に
ここまで読んでいただければ、このページ冒頭の[[時間分けとは？&gt;http://www26.atwiki.jp/easybotter_wiki/pages/33.html#id_70adc9ad]]で書いた
 if(date(&quot;G&quot;) == 7 &amp;&amp; date(&quot;i&quot;) == 30){
 	$response = $eb-&gt;postRandom(&quot;0730.txt&quot;);
 }
を「7時30分に0730.txtからランダムポスト」ではなく、「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」が正解である、と説明したことを理解していただけたと思います。


それでは例題です、難しい構造ではないのでわかりますね？
 if(date(&quot;G&quot;) == 7 &amp;&amp; date(&quot;i&quot;) == 30){
 	$response = $eb-&gt;postRandom(&quot;0730.txt&quot;);　　　　
 }　　　　　　　
 else if(date(&quot;G&quot;) == 12 &amp;&amp; date(&quot;i&quot;) == 0){
 	if(date(&quot;w&quot;) == 0 || date(&quot;w&quot;) == 6){
 		$response = $eb-&gt;postRandom(&quot;1200_weekend.txt&quot;);
 	}　　　　　　
 	else{　
 		$response = $eb-&gt;postRandom(&quot;1200_weekday.txt&quot;);
 	}　　　　　
 }　　　　　　
 else if(date(&quot;G&quot;) == 23 &amp;&amp; date(&quot;i&quot;) == 30){　　 　　
 	$response = $eb-&gt;postRandom(&quot;2330.txt&quot;); 　　　
 }　　　
 else{　 　
 	$response = $eb-&gt;postRandom(&quot;sonota.txt&quot;);　　　 　
 }　　　
  if(date(&quot;n&quot;) == 1 &amp;&amp; date(&quot;j&quot;) == 1 &amp;&amp; date(&quot;G&quot;) == 0 &amp;&amp; date(&quot;i&quot;) == 0){　　　
 	$response = $eb-&gt;postRandom(&quot;newyear.txt&quot;);　　　
 }　　　
正解は、「&amp;color(#ffffff){毎日7:30に0730.txtからランダムポスト、土日の12:00に1200_weekend.txtからランダムポスト、月～金曜日の12:00に1200_weekday.txtからランダムポスト、毎日23:30に2330.txtからランダムポスト、それ以外の実行はsonota.txtからランダムポスト。1月1日0時00分にnewyear.txtからランダムポスト。}」です。
日時での条件分岐はつい「月→日→時→分」という順番で条件付けしがちですが、毎日同じ時間に実行するものを日にちや曜日で変えたい場合は、先に時間を指定してから日にちや曜日で分岐させる方がスマートな構造になります。
また、先に「時」「分」のようにちょっとしたズレで数値が変わってしまうものを条件判定することで、[[時間ズレ対策&gt;http://www26.atwiki.jp/easybotter_wiki/pages/25.html#id_ce8e3a32]]にもなります。
是非、工夫を凝らしてあなたなりのbot.phpを書いてみて下さい。


*コメント
- とりあえず一通りの説明を書き終えました、内容の修正等ありましたらご自由にどうぞ。その他何かあればEasyBotterBBS内の非公式wkiスレに書いていただければと思います。  -- あずき  (2011-07-04 00:32:19)
- あずき様、更新お疲れ様でした！  -- 名無しさん  (2011-07-04 23:13:04)
- わかりやすくて目から鱗です　有難うございます  -- aisk  (2011-11-10 15:52:12)
#comment    </description>
    <dc:date>2011-11-10T15:52:12+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/36.html">
    <title>時間分け</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/36.html</link>
    <description>
      if(date(&quot;G&quot;) == 7 &amp;&amp; date(&quot;i&quot;) == 30){    </description>
    <dc:date>2011-09-22T23:38:02+09:00</dc:date>
  </item>
    <item rdf:about="http://www26.atwiki.jp/easybotter_wiki/pages/21.html">
    <title>ver.2.0*よくある質問*PHPエラー</title>
    <link>http://www26.atwiki.jp/easybotter_wiki/pages/21.html</link>
    <description>
      まずはbot.php/setting.phpに書かれている説明と、[[EasyBotter公式サイト&gt;http://pha22.net/twitterbot/]]、[[設定手順・エラー解決編&gt;ver.2.0*設置手順*エラー解決編]]を熟読しよう。
&amp;color(#ff0000){&#039;&#039;wikiを見ても分からないところが出てきたら質問スレッドで質問しよう！&#039;&#039;}
bot.phpやEasyBotter.phpを編集する上で、基本使いそうなPHP制御構造等は[[Twitter Bot関連リンク]]にお勧め解説サイトをリンクしています。
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメントを書く」から誰かに頼んで下さい。
#contents
*object(SimpleXMLElement)#10 (2) {～～エラーが出ます
**&quot;Incorrect signature&quot;エラー

 object(SimpleXMLElement)#10 (2) {
 [&quot;request&quot;]=&gt;
 string(20) &quot;/statuses/update.xml&quot;
 [&quot;error&quot;]=&gt;
 string(19) &quot;Incorrect signature&quot;
 }

というエラーが出る。

setting.phpに間違いは有りませんか？
OAuth認証コードが古いものだったりしませんか？
OAuth設定項目のアプリケーション設定がBrowserになっていませんか？Clientにして下さい。

他には data.txt なり指定されたテキストファイルの文字コードが shift-jis ではありませんか？
文字コードがおかしいと投稿時にエラーがでます。
指定するテキストファイルは全て UTF-8 に変換してください。

**&quot;Status is a duplicate.&quot;エラー

 object(SimpleXMLElement)#10 (2) {
 [&quot;request&quot;]=&gt;
 string(20) &quot;/statuses/update.xml&quot;
 [&quot;error&quot;]=&gt;
 string(22) &quot;Status is a duplicate.&quot;
 }

というエラーが出る。

「duplicate」つまり重複です。Twitterでは同じ発言を繰り返し投稿できません。少なくとも10ツイートはあける必要があります。
これはランダム投稿用データが少ない時に発生します。
また、bot.phpでpostRandom()が同時に動く時も発生する可能性があります。

*Fatal error:  Uncaught～～エラーが出ます

 Fatal error:  Uncaught &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
 &lt;tr&gt;&lt;td colspan=&quot;3&quot; bgcolor=&quot;#aaaaaa&quot; align=&quot;center&quot;&gt;&lt;b&gt;Exception trace&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td align=&quot;center&quot; bgcolor=&quot;#cccccc&quot; width=&quot;20&quot;&gt;&lt;b&gt;#&lt;/b&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; bgcolor=&quot;#cccccc&quot;&gt;&lt;b&gt;Function&lt;/b&gt;&lt;/td&gt;&lt;td align=&quot;center&quot; bgcolor=&quot;#cccccc&quot;&gt;&lt;b&gt;Location&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td align=&quot;center&quot;&gt;0&lt;/td&gt;&lt;td&gt;HTTP_OAuth_Consumer_Request-&gt;send()&lt;/td&gt;&lt;td&gt;フルパス/PEAR/HTTP/OAuth/Consumer.php:250&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;&lt;td&gt;HTTP_OAuth_Consumer-&gt;sendRequest(&#039;https://twitter.&amp;hellip;&#039;,  Array,  &#039;POST&#039;)&lt;/td&gt;&lt;td&gt;フルパス/EasyBotter.php:517&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2&lt;/td&gt;&lt;td&gt;EasyBotter-&gt;_setData(&#039;https://twitter.&amp;hellip;&#039;,  Array)&lt;/td&gt;&lt;td&gt;フルパス/EasyBotter.php:528&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td align=&quot;center&quot;&gt;3&lt;/td&gt;&lt;td&gt;EasyBotter-&gt;setUpdate(Array)&lt;/td&gt;&lt;td&gt;フルパス/EasyBotter.php:162&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td align=&quot;center&quot;&gt;4&lt;/td&gt;&lt;td&gt;EasyBotter-&gt;re in フルパス/PEAR/HTTP/OAuth/Consumer/Request.php on line 214

Twitterサーバーと連繋がうまく行ってない時（重い時）よく出るエラーのようです。
ほかにも原因がある場合がありますが、よくわかっていません。

land.to鯖では反応するものがないと「*以内に受け取ったメッセージはありません」と表示はしますが、実際リプライを受け取って返そうとするとこのエラーが出ます。
curlが使えないことによるものだと思われます（ver1.42にOAuthをつけると、curlエラーが出て動かない。）
Windows環境にてopensslが有効になってないと発生しました。

*bot.phpを実行した時、ブラウザ側が文字化けする

例：&quot;Status is a duplicate.&quot;エラーの時
&gt;Twitter縺ｸ縺ｮ謚慕ｨｿ縺ｫ螟ｱ謨励＠縺ｾ縺励◆縲
&gt;繝ｦ繝ｼ繧ｶ繝ｼ蜷搾ｼ咫 id
&gt;  object(SimpleXMLElement)#10 (2) {
&gt;  [&quot;error&quot;]=&gt;
&gt;  string(22) &quot;Status is a duplicate.&quot;
&gt;  [&quot;request&quot;]=&gt;
&gt;  string(22) &quot;/1/statuses/update.xml&quot;
&gt;}
//
//2byte文字がソース強調部分にうまく含まれません。＠wikiの仕様だとは思いますが、誰か分かる人修正お願いします。
//
EasyBotter.php
rep.php
reply_pattern.php
setting.php
bot.php
data.txt
の文字コードがUTF-8で保存してあるか確認してください。
備考：配布されているデフォルトのソースファイルではUTF-8N(UTF-8のBOMなし)になっています。    </description>
    <dc:date>2011-09-08T02:50:04+09:00</dc:date>
  </item>
  </rdf:RDF>

