Skypeto: Skype chat to n-yoshi n-yoshi
Twitter: Follow laresjp on Twitter laresjp
feed: RSS 2.0 RSS or Atom Atom

噴火通知ボット @vol_jp 暴走の顛末

| go BLOG Top |

2010-07-03(土) 10:16(UTC +0900) p

先ずは、フォロー頂いている皆様、お騒がせしまして申し訳ありませんでした…
以前ご紹介しました「日本の火山噴火状況通知ボット@vol_jp ですが、昨日、久しぶりに暴走させてしまいました orz
原因らしきモノも判明し、それに対する一応の対策も実施してみましたので、その顛末などをまとめます。

昨日の状況を時系列で掲示しますと、次のようになります。

@laresjp 噴火botがなんかおかしいみたいです(´・ω・`)Fri Jul 02 09:55:59 via Saezuri


しちゃったかー RT @vol_jp: http://j.mp/c6tXGL 桜島がしました(2010-07-02 18:50:06) cite
やばい噴火botでTLを埋められてしまう!(2010-07-02 18:51:41) cite
.@vol_jp が大変なことになってるので一時的にアンフォロー。(2010-07-02 18:55:15) cite
@laresjp 噴火botがなんかおかしいみたいです(´・ω・`)(2010-07-02 18:55:59) cite
.@vol_jp がおかしくなった‥(2010-07-02 18:57:53) cite
ん? @vol_jp が暴走してるぞ‥(2010-07-02 18:59:36) cite
@tanyasuii 対応します!(2010-07-02 19:00:27) cite
いったんフォローはずした(2010-07-02 19:00:38) cite
@laresjp ありがとございますー お疲れ様です!(2010-07-02 19:01:16) cite
変なことなってますね.. RT @Y_Suzuki: .@vol_jp がおかしくなった‥(2010-07-02 19:08:07) cite
ただいま対応中です。 @vol_jp が暴走していましたので、 cron を止めて誤発のログを削除しております。(連絡ありがとうございました。 @tanyasuii )(2010-07-02 19:09:47) cite
気象庁側で何か変更があったのかもですね。しばらく様子をみます。 RT @polycarbide: 変なことなってますね.. RT @Y_Suzuki: .@vol_jp がおかしくなった‥(2010-07-02 19:13:13) cite
取り敢えず誤発のログは削除した。けど、根本原因が不明なのです… 新着判断確認フラグとして日時を入れてあるファイルが空っぽになっていたのが暴走の原因ではあるのですが、なんで空になったのかが分からない… orz #vol_jp(2010-07-02 19:18:18) cite
うむー、フラグファイルが空なら、最新日時をそのまま適用するように改修した方が良いのか。取りこぼしが生じるとしても、暴走は回避できるよな… #vol_jp(2010-07-02 19:30:12) cite
ああ、原因分かったかも。『 気象庁 | 噴火に関する火山観測報 http://j.mp/VOAMv 』にあるログから、四月以前の分が消されてる。その時に一時的にでもファイルの構造が変わったとかページが消えたとか、そんな感じで保持する情報が消し飛んだのかも。 #vol_jp(2010-07-02 19:33:55) cite
暴走開始したログも四月一日分からだし、多分コレだな。んー、 cron の頻度を下げるか? #vol_jp(2010-07-02 19:34:49) cite
ロジック改修までの間、十分おきに 9,19,29,39,49,59 だった処理を、二十分おきの 9,29,49 に変えて様子を見る。ロジックの改修方法としては、フラグが消えてたら強制的に処理時刻マイナス30分を入れるようにしよう。 #vol_jp(2010-07-02 19:39:41) cite
そして、 @vol_jp からアナウンスを流そうにも、リクエスト回数上限に達しているのでしばらく呟けない orz #vol_jp(2010-07-02 19:41:27) cite
新着確認フラグのファイル破損により暴走/連投してしまいました。先ずは誤発の過去ログを削除いたしました。障害の原因は、気象庁より頂いているデータの、一時的な欠落のようです。お騒がせして申し訳ございませんでした。 ^@laresjp(2010-07-02 21:59:47) cite
@tanyasuii @tkbss @umebosi @polycarbide お騒がせしました orz ^@laresjp(2010-07-02 22:00:09) cite
ひとまず「フラグ破損時の仮フラグ設定」処理を実装してみた。取りこぼしや重複は出るかも知れないけど、コレで暴走はしないで済む、ハズ。 #vol_jp(2010-07-02 22:06:50) cite
調子に乗って @vol_jp の処理頻度を元の10min毎に戻してきた。(2010-07-02 22:12:41) cite
Generated by URL to Twitter log

最初に警報を頂いてから、急いで自動実行を止めつつ Twitter で言及されている方を検索で確認し、今後の対策を検討。
原因としては、(多分ですが)ネタ元として抽出させて貰っている気象庁の噴火に関する火山観測報に一時的にアクセス出来なくなった等で、取得してくるデータ書式が瞬間的に想定外の文字列となり、自動処理後に生成させる「最新事案の日時保持用ファイル」が空っぽになって、その次の自動処理時に火山観測報のページを全て再度 feed しようとしてしまった、様子。
つまり、↓な感じ。

  1. (ボット) 自動処理開始、新着を確認して新ネタ無し、最新は “20100701202315” です
  2. ((気象庁) 桜島、爆発しすぎw 自重しろww)
  3. ((気象庁) 観測報のページがエライことになるので、取り敢えず年度で切るか…)
  4. (ページの改修中、一時的にアクセス不可?)
  5. (ボット) 自動処理開始、新着を確認して新ネタ無し、最新は “” です
  6. ((気象庁) 観測報の過去ログを四月分以降に切り替え完了)
  7. (ボット) 自動処理開始、新着を確認して新ネタを確認
  8. (ボット) 最新日時 “” と比較し、新着は “20100401135517” であると判断
  9. (ボット) 四月一日からの未掲示分を順次 Tweet 開始
  10. (ボット) 暴走開始、そのまま API 上限まで呟きまくり
  11. (フォロワーの皆さん) 「暴走してる!」
  12. (n-yoshi) 「対応します!! orz」

…多分、桜島が噴火/爆発的噴火しすぎで、観測報ページが大変なコトになりそうだッてんで、一年分を全部掲載することを諦めたのでしょう()
つか、先にネタにした時よりも更に記録を伸ばし、半年で既に600回以上爆発している桜島が無茶すぎる()
早晩666回とか突破しそうだし、年間で1,000回突破することも十分考えられますな…
実際、暦的な区切りを外せば、昨年7月からの活発化以来、365日で1,000回以上とか既に達成しているワケで orz

最後に、改修したコードを載っけておきます。

<?php
// 日本時間に設定
date_default_timezone_set('JST');

// OAuth
// twitteroauth.phpを読み込む。パスはあなたが置いた適切な場所に変更してください
require_once("パス");

// Consumer keyの値
$consumer_key = "キー";
// Consumer secretの値
$consumer_secret = "秘密";
// Access Tokenの値
$access_token = "トークン";
// Access Token Secretの値
$access_token_secret = "秘密トークン";

// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

/*
// TwitterへPOSTする。パラメーターは配列に格納する
// in_reply_to_status_idを指定するのならば array("status"=>"@hogehoge reply","in_reply_to_status_id"=>"0000000000"); とする。
$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"Test OAuth update."));
 TwitterへPOSTする以外にも、TLの取得、呟きの削除などAPIをOAuth認証で行うことが出来ます。
   例えば、TLを取得するのなら
	  $req = $to->OAuthRequest("http://twitter.com/statuses/friends_timeline.xml","GET",array("count"=>"50"));
	  $req_array = simplexml_load_string($req);
	  foreach($req_array as $tweets){~}
   呟きをお気に入りに追加するのなら
	  $req = $to->OAuthRequest("https://twitter.com/favorites/create/00000000.xml","POST",array());
   ...といった感じです。詳しくはTwitterのAPI仕様書を。
*/

// bit.ly で短縮
//要PHP5.2.xかjson_decode関数
// jampurl.phpを読み込む。パスはあなたが置いた適切な場所に変更してください
require_once("パス");

/* 使い方
//短くしたいURL
  $sLongUrl = "http://maps.google.co.jp/maps?oe=UTF-8&q=%E6%97%A5%E6%9C%AC&um=1&ie=UTF-8&sa=N&hl=ja&tab=wl";
//bit.lyのログイン名
  $sLogin = "hoge";
//bit.lyのAPIキー
  $sApiKey = "R_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
echo short_url($sLongUrl,$sLogin,$sApiKey );
*/
$sLogin = "ユーザ名";
$sApiKey = "キー";


// 最終インシデントの読み込みとオフセット時刻への設定, rflp ReadFlagLogPointer, ostm OffSetTiMe
$rflp = fopen("最終状態保持のファイル", "r");
$ostm = fgets($rflp);
fclose($rflp);

// フラグを確認し、もしフラグが空ならオフセット時刻を処理時刻マイナス30minに設定, ntfb NowTimeFoldBack
$ntfb = (time() - 1800);
if($ostm == "") $ostm = date("YmdHis", $ntfb);

// ターゲットURL, pfx PreFiX, TwitterFeeD
$pfx ="www.seisvol.kishou.go.jp/tokyo/STOCK/volinfo";
$url = "http://$pfx/gensho.html";

// ターゲットの中身を吸い出す, ccs cContentSource, ksc KiShouChou
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$ksc = curl_exec($ch);
curl_close($ch);

// エンコード変換
$ksc = mb_convert_encoding($ksc, 'UTF-8', 'SJIS');

// 情報を検索
// <P><A href='VG20100408092527.html'> 噴火に関する火山観測報(桜島爆発)(2010年04月08日09時25分発表) </A></P>
// <P><A href='VG20100602145141.html'> 噴火に関する火山観測報(桜島噴火)(2010年06月02日14時51分発表) </A></P>
preg_match_all('/VG([0-9]{14})\.html.*火山観測報\((.*)(爆発|噴火)\)/', $ksc, $erpinfo, PREG_SET_ORDER);
// preg_match_all('/<description>vol_jp.*VG([0-9]{14}).*<\/description>/', $twt, $twtinfo, PREG_SET_ORDER);

// オフセット時刻までの data を取得し整形して表示, li Loopi, dtl DeTaiL
for($i = 0; $erpinfo[$i][1] > $ostm; $i++);
if($i != 0) {
	for($li = $i-1; $li>=0 ;$li--) {
		$dtltm = $erpinfo[$li][1];
		$dtlvl = $erpinfo[$li][2];
		$dtlurl = "http://$pfx/VG$dtltm.html";
		// j.mp で短縮
		$shrturl = jamp::short_url($dtlurl,$sLogin,$sApiKey);
		// 詳細を展開し、ポストに含める info を抽出し Twitter へポスト, erpltr LeTteR, erpcnt CouNT, erpdt DaTe
		$chdtl = curl_init();
		curl_setopt($chdtl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($chdtl, CURLOPT_URL, $dtlurl);
		$kscdtl = curl_exec($chdtl);
		curl_close($chdtl);
		$kscdtl = mb_convert_encoding($kscdtl, 'UTF-8', 'SJIS');

		// 現  象:爆発
		// 現  象:噴火
		// 日  時:2010年04月08日09時19分(080019UTC)第2報
		// 今年396回目
		if(preg_match('/第([0-9]+)報/', $kscdtl, $erpltrinfo)) {
			$erpltr = " 第 $erpltrinfo[1] 報";
		} else {
			$erpltr = "";
		}
		
		if(preg_match('/今年([0-9]+)回目/', $kscdtl, $erpcntinfo)) {
			$erpcnt = " (今年 $erpcntinfo[1] 回目)";
		} else {
			$erpcnt = "";
		}
		preg_match('/(....年..月..日..時..分)/', $kscdtl, $erpdtinfo);
		$erpdt = $erpdtinfo[1];
		
		preg_match('/現  象:(.*)/', $kscdtl, $erpphenomenoninfo);
		$erpphnm = $erpphenomenoninfo[1];

		// 結果を呟く
		$ga ="が";
		$smst = "しました";
		$dtl = "$erpdt$erpltr $shrturl $dtlvl$ga$erpphnm$smst$erpcnt";
//		echo("$dtl<br />");
		$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"$dtl"));
		echo $req;
		sleep(3);
	}
}

// 最新インシデントの日時情報を取得し、フラグに書き込み, eflg ErupFLaG, wflp WriteFlagLogPointer
$eflg = $erpinfo[0][1];
$wflp = fopen("最終状態保持のファイル","w");
fputs($wflp, $eflg);
fclose($wflp);
// echo($eflg);

?>

関連するかも知れない?


, Permalink, 関連つぶやき
cat: 呟き録, 電脳系
tag: , , , ,
0 Trackback

トラックバック

この記事のトラックバック URL


Twitter

Powered by Topsy

オススメ(殿堂)

ThinkPad Bluetooth ワイヤレス・トラックポイント・キーボード
ThinkPad Bluetooth ワイヤレス・トラックポイント・キーボード
ThinkPad
トラックポイント付きの無線キーボード

オススメ(amazon)

Twitter

オススメ(ニコ動)

オススメ(link)


検索

このblogをググる



タグクラウド


最近のエントリ

カレンダー

2024年3月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

分類別

保管庫


購読

marker

Firefox meter

CC LICENSE


since 2001-09-25

Powered by WordPress