Saturday, February 22, 2020

title pic EasyBotter -地震で自動停止を導入しました。-

Posted by hoitan on 2011年6月5日

BOTを止めるものじゃなく、止まるものに(「簡単じゃない twitter bot」 の作り方メモ)

こちらを参考に、地震の際に自動で止まる仕組みを導入してみました。
やっぱり、こういうときは止まったほうがいいという、イノウエさんの意見はごもっともかと思いまして。
リンク元のソース、ほぼそのままですが、下記のソースを別ファイルに書いておきます。

<?php
class Easy_botter_org{
function jisin(){
//=============================
//地震判定プログラム
//=============================
/*
goo 天気 地震情報RSSを読み込み、震度6以上の場合、震度を返す
*/

$earthquake_pubtime_txt = 'earthquake_pubtime.txt';//処理済みpubDateを保存するファイル


//処理済pubDateの読み込み
$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));//処理済pubDate 保存
  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){//処理済みitemはスルーして次へ
    continue;
  }

  if ($pubtime < date('Y-m-d H:i:s',time() - 3600)){//60分以内でなければ処理しないで次へ
    continue;//TEST時はここをコメントアウト
  }

  //震度を取得し、6以上ならフラグ立て、処理を終了
  preg_match('/震度(&#91;0-9&#93;+)&#91;強弱&#93;*/',$text,$matches);
  preg_match('/\&#91;震源地\&#93;(.*)\&#91;最大震度\&#93;/',$text,$matches_basyo);
  $shindo = $matches&#91;1&#93;;

  if (is_numeric($shindo) && (int)$shindo >= 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;

}
}

こちらを、EasyBotterOrg.php内に書いておきます。
これを作っておけば、この関数をたたけば、震度やらなにやらが入った、配列が返ってくるわけです。

bot.phpから、上記の関数を読み出せばいいので、

<?php
//=============================
//EasyBotterを呼び出します
//=============================
require_once("EasyBotter.php");
$eb = new EasyBotter();

//=============================
//EasyBotterの独自機能を呼び出します
//=============================
require_once("EasyBotterOrg.php");
$ebo = new Easy_botter_org();


//=============================
//フラグファイル読み出し
// 状態フラグ $joutai
//    &#91;0&#93;stop:動作停止中
//=============================
	$joutai_txt = file_get_contents("flg_joutai.txt");
	if($joutai_txt !== ""){
		$joutai = unserialize($joutai_txt);
	}


//=============================
//停止中なら止めてしまう。
//=============================
if($joutai&#91;0&#93;){
	die("地震で停止しています");
}

//=============================
//フラグ更新
//=============================
//=============================
//地震判定(毎回)
//=============================

$shindo = $ebo->jisin();

if( $shindo['num'] > 0){ //値が返ってきてたら
	if(出勤してたら){ 
	  $dousa[0]['data'] = ""; //今回つぶやくように設定して
	  $dousa[0]['word'] = $shindo['word'];
	}
  $joutai[0] = TRUE; //停止フラグを立てる
}

//=============================
//フラグファイル格納。
//=============================
	$response = file_put_contents("flg_joutai.txt" , serialize($joutai));

//=============================
//つぶやきましょう。
//=============================
if($dousa[0] !== NULL){
	if($dousa[0]['word'] !== ""){
		$response = $eb->setUpdate(array("status"=>$dousa[30]['word']));

	} else if($dousa[0]['data'] !== ""){
		$response = $eb->postRandom($dousa[0]['data']);
	}
}

?>

こんな感じです。停止しますをつぶやかせるのは・・・。というのもありますが、とりあえず、ともみさんは、地震のときに、会社に出勤していたら、つぶやくようにしています。
他の時にはだまって、止まります。

あとは、復活用に手動で実行するプログラムとして、

<?php

//=============================
//フラグファイル読み出し
// 状態フラグ $joutai
//    &#91;0&#93;stop:動作停止中
//=============================
	$joutai_txt = file_get_contents("flg_joutai.txt");
	if($joutai_txt !== ""){
		$joutai = unserialize($joutai_txt);
	}

//=============================
//フラグ設定
//=============================
$joutai&#91;0&#93; = FALSE;

//=============================
//フラグファイル格納。
//=============================
	$response = file_put_contents("flg_joutai.txt" , serialize($joutai));

?>

こんなのを用意してます。もうひとつ、

//=============================
//フラグ設定
//=============================
$joutai[0] = TRUE;

と、ここだけを変えたものを用意していてですね、地震以外で緊急停止したい場合に、手動でも止められるようにしています。

※2011年6月9日修正
setupdateは引数配列でした。。。


top