2010-07-03(土) 10:16(UTC +0900) p Tweet
先ずは、フォロー頂いている皆様、お騒がせしまして申し訳ありませんでした…
以前ご紹介しました「日本の火山噴火状況通知ボット」 @vol_jp ですが、昨日、久しぶりに暴走させてしまいました orz
原因らしきモノも判明し、それに対する一応の対策も実施してみましたので、その顛末などをまとめます。
昨日の状況を時系列で掲示しますと、次のようになります。
@laresjp 噴火botがなんかおかしいみたいです(´・ω・`)
しちゃったかー 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 しようとしてしまった、様子。
つまり、↓な感じ。
- (ボット) 自動処理開始、新着を確認して新ネタ無し、最新は “20100701202315” です
- ((気象庁) 桜島、爆発しすぎw 自重しろww)
- ((気象庁) 観測報のページがエライことになるので、取り敢えず年度で切るか…)
- (ページの改修中、一時的にアクセス不可?)
- (ボット) 自動処理開始、新着を確認して新ネタ無し、最新は “” です
- ((気象庁) 観測報の過去ログを四月分以降に切り替え完了)
- (ボット) 自動処理開始、新着を確認して新ネタを確認
- (ボット) 最新日時 “” と比較し、新着は “20100401135517” であると判断
- (ボット) 四月一日からの未掲示分を順次 Tweet 開始
- (ボット) 暴走開始、そのまま API 上限まで呟きまくり
- (フォロワーの皆さん) 「暴走してる!」
- (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); ?>
関連するかも知れない?
オススメ(殿堂)
オススメ(amazon)
オススメ(ニコ動)
オススメ(link)
検索
タグクラウド
Skype
lifehack
MOVIX
blog
WILLCOM
Tips
ThinkPad
UI
コロIIな
Twitter
IO
Google
VOCALOID
web-site
ATOK
robotics
Wi-Fi
TV
VoIP
language
セキュリティ
Skypeクレジット
京セラ
Skype Public Chat
feed
VVoIP
SkypeOut
iTunes
SkypeIn
Eye-Fi
キーボード
京ぽん
mobile
防災
鹿児島
東芝
FON
Firefox
Fresh Reader
amazon
RD
アニメ
Palm
NHK
strage
IM
地震
NTT
EV
PSTN
最近のエントリ
カレンダー
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
分類別
保管庫
- 2020年1月
- 2019年6月
- 2016年8月
- 2014年9月
- 2014年6月
- 2013年9月
- 2013年8月
- 2013年4月
- 2013年1月
- 2012年10月
- 2011年12月
- 2011年11月
- 2011年10月
- 2011年9月
- 2011年8月
- 2011年7月
- 2011年6月
- 2011年5月
- 2011年4月
- 2011年3月
- 2011年2月
- 2011年1月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年9月
- 2010年8月
- 2010年7月
- 2010年6月
- 2010年5月
- 2010年4月
- 2010年3月
- 2010年2月
- 2010年1月
- 2009年12月
- 2009年11月
- 2009年10月
- 2009年9月
- 2009年8月
- 2009年7月
- 2009年6月
- 2009年5月
- 2009年4月
- 2009年3月
- 2009年2月
- 2009年1月
- 2008年12月
- 2008年11月
- 2008年10月
- 2008年9月
- 2008年8月
- 2008年7月
- 2008年6月
- 2008年5月
- 2008年4月
- 2008年3月
- 2008年2月
- 2008年1月
- 2007年12月
- 2007年11月
- 2007年10月
- 2007年9月
- 2007年8月
- 2007年7月
- 2007年6月
- 2007年5月
- 2007年4月
- 2007年3月
- 2007年2月
- 2007年1月
- 2006年12月
- 2006年11月
- 2006年10月
- 2006年9月
- 2006年8月
- 2006年7月
- 2006年6月
- 2006年5月
- 2006年4月
- 2006年3月
- 2006年2月
- 2006年1月
- 2005年12月
- 2005年11月
- 2005年10月
- 2005年9月
- 2005年8月
- 2005年7月
- 2005年6月
- 2005年5月
- 2005年4月
- 2005年3月
- 2005年2月
- 2004年12月
- 2004年11月
- 2004年10月
- 2004年9月
- 2004年8月
- 2004年7月
- 2004年6月
- 2004年5月
- 2003年10月
- 2003年7月
- 2003年4月
- 2003年3月
- 2003年2月
- 2003年1月
- 2002年12月
- 2002年11月
- 2002年10月
- 2002年9月
- 2002年8月
- 2002年7月
- 2002年6月
- 2002年5月
- 2002年4月
- 2002年3月
- 2002年2月
- 2002年1月
- 2001年12月
- 2001年11月
- 2001年10月
- 2001年9月
購読
marker
CC LICENSE
since 2001-09-25