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

ひばり放送を再発信する Twitter ボットについて

| go BLOG Top |

2011-03-15(火) 19:11(UTC +0900) p

昨晩突貫工事で作ったボットが問題なく稼働しているようなので、改めてお知らせ。
(表記揺れに中てられてグダッてる部分も見受けられますが())


clip IT!
from Twitter
「ひばり放送 防災さがみはら @hibari_housou


やってることは火山噴火通知ボットと同様なモノで、情報提供ページを巡回して情報を抽出して加工して呟きとして再送信する、と云うモノです。
名前は、相模原市の防災放送「ひばり放送」をそのまま戴き、「ひばり放送 防災さがみはら @hibari_housou」としました。

実は、以前から 「 阿部よしひろ(相模原市議) @AbeYoshi 」(所謂「ツイッター議員」のはしり)に
『せっかくのひばり放送なんだし、メールサービスもあるのだし、原稿は電子化されてるのだろうから Twitter でも流すように言ってくれよ』
と Twitter で一方的に要望を投げていたのですが、なかなかハナシが進まないまま今次の震災が起きてしまいまして…

で、震災後にも改めて『マダー?』と訊いてみたけど、やはりすぐに出来るモノではないらしく。
しかし、既に色々な防災/減災サービスや復興支援サービスがドンドン出来ているし、相模原市の中でもまとめ資料などを公開してるヒトもいるし、自分はボットの作り方も知ってるし、もう勝手に作ってしまえ、てコトで、既存のボットを参考にザクッと突貫工事を行いました、と。
以下、呟き録とコードなどを載せておきます。

@AbeYoshi ひばり放送の新着を Twitter に流す公式アカウントの件、今からでもナンとかならんですかね?Sun Mar 13 13:53:49 via Twit for Windows

私も言って来ているし、役所も頑張っているのですが、すみません。。。さがみはらメールマガジン「防災」「安全・安心」のサイト。 → http://www.bousai-mail.jp/sagamihara/ 放送されたひばり放送の内容や地震情報など、見られます。RT @laresjpSun Mar 13 14:00:26 via Tween

@AbeYoshi 非公式ボットを作ったのでお知らせ。 『 ひばり放送 防災さがみはら (hibari_housou) on Twitter http://twitter.com/hibari_housou@hibari_housouMon Mar 14 16:48:03 via Twit for Windows

とり急ぎ登録。おもしろいですね。市役所にも話してみます。RT @laresjp: 非公式ボットを作ったのでお知らせ。 『 ひばり放送 防災さがみはら (hibari_housou) on Twitter http://bit.ly/fwqPhs@hibari_housouMon Mar 14 19:36:50 via Tween

ひばり放送の原稿を公開しているページをご案内する、相模原市非公認の勝手ボットを作ったよ! @hibari_housou 『 相模原市の防災放送を呟くボット | にっき (n-yoshi@laresjp) http://j.mp/gZxmiNMon Mar 14 17:21:31 via bitly

なお、名称やロゴマークその他、思いっきり公式を騙ってるカタチになってますので、相模原市から要請などがあればすぐに取り下げます。
また、正式に公式の「ひばり放送ボット」を作る用意があるなら、アカウントや以下のコードなど、全てを合わせて市側に返上するつもりですので、相模原市の担当者におかれましては、先ずはご一報頂けると幸いです。
(ついでに、表記揺れもなるべくなくすように気を遣って頂けると助かります orz)

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

// OAuth
// パスを読み込む。パスはあなたが置いた適切な場所に変更してください
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("jampurl.php");

/* 使い方
//短くしたい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, bs BousaiSagamihara, 
$rflp = fopen("最終状態保持のファイル", "r");
// test
// $rflp = fopen("最終状態保持のファイルテスト", "r");
$ostm = fgets($rflp);
fclose($rflp);


// http://www.bousai-mail.jp/sagamihara/hibari/ 
// http://www.bousai-mail.jp/sagamihara/hibari/view.cgi?log_id=5221 
// ターゲットURL, pfx PreFiX, 
$pfx ="www.bousai-mail.jp/sagamihara/hibari";
$url = "http://$pfx/";

// ターゲットから詳細 URL と log_id の数値を取得, bsi BousaiSagamiharaIndex
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$bsi = curl_exec($ch);
curl_close($ch);

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

// 情報を検索, bsinfo
// <a href="view.cgi?log_id=5221">ひばり放送(防災緊急放送)</a><br>
preg_match_all('/view\.cgi\?log_id=([0-9]{4}).*ひばり放送((.*)放送)/', $bsi, $bsinfo, PREG_SET_ORDER);




// オフセット時刻までの data を取得し整形して表示, li Loopi, dtl DeTaiL, nt NoTice
for($i = 0; $bsinfo[$i][1] > $ostm; $i++);
if($i != 0) {
	for($li = $i-1; $li>=0 ;$li--) {
		$dtltm = $bsinfo[$li][1];
		$dtlnt = $bsinfo[$li][2];
		$dtlurl = "http://$pfx/view.cgi?log_id=$dtltm";
		// j.mp で短縮
		$sLongURL = $dtlurl;
		$shrturl = short_url($sLongURL,$sLogin,$sApiKey);
		// 詳細を展開し、ポストに含める info を抽出し Twitter へポスト, sbat AnnounceTime, sbtp TyPe, sbaa AnnounceArea, sbsmry SuMmaRY
		$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');

		// <div align="center">ひばり放送</div>
		// 03月14日15:51配信<br>
		// <br>
		// ひばり放送(防災緊急放送)<br>
		// 放送日時:3月14日(月)15時20ごろ<br>放送区域:緑区<br>放送内容:「相模原市市役所ひばり放送から東京電力の計画停電による市内の停電地域の情報をお知らせします(略)

		if(preg_match('/放送日時:(.*)分ごろ</', $kscdtl, $sbat)) {
			$sbatl = "$sbat[1]分頃放送分";
		} else if(preg_match('/放送日時:(.*)時ごろ</', $kscdtl, $sbat)) {
			$sbatl = "$sbat[1]時頃放送分";
		} else if(preg_match('/放送日時:(.*)ごろ</', $kscdtl, $sbat)) {
			$sbatl = "$sbat[1]分頃放送分";
		} else {
			$sbatl = "";
		}
		
		if(preg_match('/ひばり放送\((.*)放送\)</', $kscdtl, $sbtp)) {
			$sbtpl = "($sbtp[1])";
		} else {
			$sbtpl = "";
		}
		
		if(preg_match('/>放送区域:(.*)<.*放送内容/', $kscdtl, $sbaa)) {
			$sbaal = "ひばり放送 $sbaa[1]宛";
		} else {
			$sbaal = "";
		}
		
		if(preg_match('/放送内容.*ひばり放送から(.*)をお知らせします。/', $kscdtl, $sbsmry)) {
			$sbsmryl = "本文 「$sbsmry[1]…」";
		} else {
			$sbsmryl = "";
		}
		
		// 結果を呟く
		// ひばり放送 緑区宛 3月14日(月)15時20分頃放送分 (防災緊急) 本文 「東京電力の計画停電による市内の停電地域の情報…」 詳細URL
		$dtl = "$sbaal $sbatl $sbtpl $sbsmryl $shrturl";
		// post
		$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"$dtl"));
		echo $req;
// test
// echo("$dtl<br />");
		sleep(3);
	}
}

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

?>

関連するかも知れない?


, Permalink, 関連つぶやき
cat: Twitter(ツイッター), ご当地ネタ
tag: , , , , , ,
0 Trackback

トラックバック

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


Twitter

Powered by Topsy

オススメ(殿堂)

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

オススメ(amazon)

Twitter

オススメ(ニコ動)

オススメ(link)


検索

このblogをググる



タグクラウド


最近のエントリ

カレンダー

2017年10月
« 8月    
1234567
891011121314
15161718192021
22232425262728
293031  

分類別

保管庫


購読

marker

Firefox meter

CC LICENSE


since 2001-09-25

Powered by WordPress