「地震で自動停止させる」の編集履歴(バックアップ)一覧に戻る

地震で自動停止させる - (2013/04/17 (水) 04:43:27) のソース

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

このページは[[BOTを止めるものじゃなく、止まるものに>http://twbot.blogspot.com/2011/03/bot_13.html]](「簡単じゃない twitter bot」 の作り方メモ)を参考に、
[[EasyBotter -地震で自動停止を導入しました。->http://koi-ha-utsukusii.lovepop.jp/hoitan_WP/?p=139]](ハーイ!ともみです!)にて紹介されたものです。

----
*おおまかな手順
+地震の震度を取得するPHPを作成する。
+震度を取得した日時を記録しておくテキストファイルを作成する。
+botが動作中か停止中かフラグを記録するテキストファイルを作成する。
+手動で停止状態から復帰させるPHPを作成する。
+bot.phpを改造する。
+全部をアップロードして動作させる。

おまけ
手動で停止させるPHPを作成する。

**地震の震度を取得するPHPを作成する
EasyBotterOrg.phpという名前のファイルを作る。

> <?php
> class Easy_botter_org{
> function jisin(){
> //=============================
> //地震判定プログラム
> //=============================
> /*     goo 天気 地震情報RSSを読み込み、震度6以上の場合、震度を返す*/
> 
> $earthquake_pubtime_txt = 'earthquake_pubtime.txt';
>  
> //前回のRSS読み込み日時を調べる
> $last_pubtime = file_get_contents($earthquake_pubtime_txt);
> if ($last_pubtime == ''){
> $last_pubtime = date('Y-m-d H:i:s',time()-300);
> }
>  
> //$last_pubtime = '2011-03-11 14:00:00';//TEST
>  
> $xml = file_get_contents('http://weather.goo.ne.jp/earthquake/index.rdf');//地震情報 - goo 天気
> $xml_tree = simplexml_load_string($xml);
>  
> if (count($xml_tree->channel->item) > 0){
> $ts = strtotime((string)$xml_tree->channel->item[0]->pubDate);
> file_put_contents($earthquake_pubtime_txt, date('Y-m-d H:i:s',$ts));//読み込み済RSSの日時を保存
> chmod($earthquake_pubtime_txt, 0666);
> }
>  
> $shindo_num = '';
> $shindo_str = '';
> $shindo_pubtime = '';
> $shindo_text = '';
> $shindo_basyo = '';
> $result = array();
> 
> foreach($xml_tree->channel->item as $k => $v){
>   $text = (string)$v->title;
>   $pubtime = date('Y-m-d H:i:s',strtotime((string)$v->pubDate));
>  
>   if ($pubtime <= $last_pubtime){
> continue;
>   }
>  
>   if ($pubtime < date('Y-m-d H:i:s',time() - 3600)){//前回から60分(3600秒)以内なら処理しないで次へ
> continue;//TEST時はここをコメントアウト
>   }
>  
>   //震度を取得し、指定以上ならフラグ立て、処理を終了
>   preg_match('/震度([0-9]+)[強弱]*/',$text,$matches);
>   preg_match('/\[震源地\](.*)\[最大震度\]/',$text,$matches_basyo);
>   $shindo = $matches[1];
>  
>   if (is_numeric($shindo) && (int)$shindo >= 6){//震度6の場合
> $result['num'] = (int)$matches[1];
> $result['str'] = $matches[0];
> $result['pubtime'] = $pubtime;
> $result['text'] = $text;
> $result['basyo'] = trim($matches_basyo[1]," ");
> $result['word'] = $shindo_str."の地震が".$shindo_basyo."で起きましたので、停止いたします。";//ツィートされます。
> break;
> }
>   }
>  
> echo $result['text']."<br /><br />";
>  
> return $result;
>  
> }
> }


**震度を取得した日時を記録しておくテキストファイルを作成する。
earthquake_pubtime.txtという名前のテキストファイルを作る。
中身は何も書かなくてOK

**botが動作中か停止中かフラグを記録するテキストファイルを作成する。
flg_joutai.txtという名前のテキストファイルを作る。
中身は何も書かなくてOK

**手動で停止状態から復帰させるPHPを作成する。
start.phpというファイルを作成する。
> <?php
> 
> //=============================
> //フラグファイル読み出し
> // 状態フラグ $joutai
> //    [0]stop:動作停止中
> //=============================
>     $joutai_txt = file_get_contents("flg_joutai.txt");
>     if($joutai_txt !== ""){
>         $joutai = unserialize($joutai_txt);
>     }
> 
> //=============================
> //フラグ設定
> //=============================
> $joutai[0] = FALSE;
> 
> //=============================
> //フラグファイル格納。
> //=============================
>     $response = file_put_contents("flg_joutai.txt" , serialize($joutai));
> 
> ?>

**bot.phpを改造する。
bot.php内
> <?php
> //=============================
> //EasyBotterを呼び出します
> //=============================
> require_once("EasyBotter.php");
> $eb = new EasyBotter();
>  
> //=============================
> //震度を取得します
> //=============================
> require_once("EasyBotterOrg.php");
> $ebo = new Easy_botter_org();
>  
> //=============================
> //フラグファイル読み出し
> // 状態フラグ $joutai
> //    [0]stop:動作停止中
> //=============================
>     $joutai_txt = file_get_contents("flg_joutai.txt");
>     if($joutai_txt !== ""){
>         $joutai = unserialize($joutai_txt);
>     }
>  
> //=============================
> //停止中なら止めてしまう。
> //=============================
> if($joutai[0]){
>     die("地震で停止しています");
> }
> //この一文は、手動でbot.phpを叩くと表示されます。ツイートはされません。
> 
> //=============================
> //地震判定(毎回)
> //=============================
>  
> $shindo = $ebo->jisin();
>  
> if( $shindo['num'] > 0){ //値が返ってきてたら
>   $joutai[0] = TRUE; //停止フラグを立てる
> }
>  
> //=============================
> //フラグファイル格納。
> //=============================
>     $response = file_put_contents("flg_joutai.txt" , serialize($joutai));
>  
> //=============================
> //ここから下に、通常時のbotの動作を書き込みます。
> //=============================
> 
> 
> 
> 
> ?>

**アップロード
ファイルは全て、bot.phpと同じ階層にアップしてください。

きちんと動作すると、flg_joutai.txtを開いた時以下の表示が出ます。
通常時は
>a:1:{i:0;b:0;}
停止中は
>a:1:{i:0;b:1;}

停止からまた動かす時は、手動でstart.phpを実行すれば治ります。


**おまけ 手動で停止させるPHPを作成する。
※利用上の注意
pha氏が書いた[[EasyBotterが勝手に動作させられる可能性とその対策>http://pha22.net/twitterbot/gosado.php]]と同じ理屈で、他人にbotを勝手に止められてしまいます。
[[EasyBotterが勝手に動作させられる可能性とその対策>http://pha22.net/twitterbot/gosado.php]]も併せてお読みください。

stop.phpというファイルを作成する。
> <?php
> 
> //=============================
> //フラグファイル読み出し
> // 状態フラグ $joutai
> //    [0]stop:動作停止中
> //=============================
>     $joutai_txt = file_get_contents("flg_joutai.txt");
>     if($joutai_txt !== ""){
>         $joutai = unserialize($joutai_txt);
>     }
> 
> //=============================
> //フラグ設定
> //=============================
> $joutai[0] = TRUE;
> 
> //=============================
> //フラグファイル格納。
> //=============================
>     $response = file_put_contents("flg_joutai.txt" , serialize($joutai));
> 
> ?>

これを、これまでと同じ階層にアップする。
手動でstop.phpを実行すれば停止します。
再度動かす場合は、前述のとおり手動でstart.phpを実行すれば治ります。
目安箱バナー