subscriber の構築をして気象庁の防災情報を取得

2018/03/11PHPPHP,subscriber,気象庁,XML,電文

記事内に広告が含まれています。

subscriber の構築する方法

私が住んでいる宝塚市では、平成29年度から防災無線の整備をはじめ、それを受信するラジオは自治会長が防災ラジオを持っています。
自治会長が防災ラジオを持っていても住民は情報を得ることができません。

気象庁では電文公開の仕組みを用意しています。
PubSubHubbub[パブサブハバブ]という仕組みです。
この仕組みを利用するには、受信側で「subscriber」を構築しなくてはなりません。

【手順】
1.subscriberを構築する
2.作ったsubscriberの動作確認
3.気象庁に申請
4.気象庁からsubscriberに疎通テスト
5.定期的防災情報を受信

簡単に言えば、こんな感じです。

1.subscriberを構築する

このようなプログラムを書いてみました。

function main(){

	// ログ用クラス
	$uFnc = new utilFunc();

	$uFnc->LogPut("main() start");
	$method = $_SERVER['REQUEST_METHOD'];
	$uFnc->LogPut($_SERVER["REMOTE_ADDR"]);
	if ($method == 'GET') {
		doGet();
	} else if ($method == 'POST') {
		doPost();
	}
	$uFnc->LogPut("main() end");
}

function doGet(){

	// ログ用クラス
	$uFnc = new utilFunc();

	$uFnc->LogPut("doGet() start");
	$verify_token = "hogehoge";
	
	// subscribe (or unsubscribe) a feed from the HUB
	$hubmode      = $_REQUEST['hub_mode']         ;
	$hubchallenge = $_REQUEST['hub_challenge']    ;
	$hub_topic    = $_REQUEST["hub_topic"]        ;
	$hub_token    = $_REQUEST["hub_verify_token"] ;


	if ($hubmode == 'subscribe' || $hubmode == 'unsubscribe') {
		if ($_REQUEST['hub_verify_token'] != $verify_token) {
			header('HTTP/1.1 404 "Unknown Request"', null, 404);
			exit("Unknown Request");
		}
		// response a challenge code to the HUB
		header('HTTP/1.1 200 "OK"', null, 200);
		header('Content-Type: text/plain');
		// チャレンジコードを返す
		echo $hubchallenge;
	} else {
		header('HTTP/1.1 404 "Not Found"', null, 404);
		exit("Unknown Request");
	}
}

function doPost(){

	// ログ用クラス
	$uFnc = new utilFunc();

	$uFnc->LogPut("doPost() start");

	// receive a feed from the HUB
	
	// feed Receive
	$string = file_get_contents("php://input");
	$uFnc->LogPut("input data:".$string);

	// ファイル保存とか
	$fp = fopen("./atom/".date('YmdHis') . "_atom" . ".xml", "w");
	fwrite($fp, $string);
	fclose($fp);


	// 後は適当にParseしよう
	if (FALSE === ($feed = simplexml_load_string($string))) {
		$uFnc->LogPut("doPost() feed Parse ERROR");
		exit("feed Parse ERROR");
	}
	$uFnc->LogPut(var_export($feed,true));
	
	foreach ($feed->entry as $entry) {
		$url = $entry->link['href'];
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, 60);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		$fp = fopen("./xml/".basename($url), "w");
		curl_setopt($ch, CURLOPT_FILE, $fp);
		curl_exec($ch);
		curl_close($ch);
		fclose($fp);
	}
	$uFnc->LogPut("doPost() end");
}

2.作ったsubscriberの動作確認

作ったsubscriber が正しく構築できているかの確認が必要です。
この確認にはgoogle先生の助けをかります。
Welcome to the Google PubSubHubbub Hub!こちらで作成したプログラムを登録し、テストを実施します。

【テストの準備】
1.Subscribe/Unsubscribeの項目で登録を行います。
2.[Callback URL]には、作成したsubscriberのURLを設定
3.[Topic URL]にはYahooニュースなどで公開されているRSSのURLを指定
4.[Verify type]にはAsynchronous
5.[Mode]にはSubscribe
6.[Verify token]はsubscriber構築で設定したキー項目「hogehoge」を設定
これは、気象庁から送られてくる情報が正しい情報であるかを確認するためのもの。
自由な文言を設定します。
7.上記を入力し"Do it"のボタンをクリック

これで登録は完了
次は、テストの実施。

【テスト実施方法】
1.Subscriber Diagnosticsの項目で登録を行います。
2.[Callback URL/Topic URL]に、登録した時と同じURLを設定
3.上記を入力し"Get Info"のボタンをクリック
4.実施結果でStateがverifiedとでればOK

3.気象庁に申請

こちらをご確認ください。
ユーザー登録についてこちらの手順に書かれているフォーマットで気象庁にメールにて申請をします。
実は、こちらは結構アナログで、気象庁職員さんが一通ずつメール確認を行い、手続き行います。
基本受信確認の連絡はなく、「4.気象庁からsubscriberに疎通テスト」を気象庁側で実施されます。
疎通テストの実施形跡がない場合は、上記リンク内にあるメールアドレスに問い合わせをして下さい。

4.気象庁からsubscriberに疎通テスト

申請後、気象庁から構築したsubscriberに疎通テストが行われます。
テスト実施後、成功すれば防災情報の配信が実施されます。

5.定期的防災情報を受信

実際の配信には「POST」で送られてきますので、POSTで受け取った情報は
好きなように加工して使用することができます。

しかし、未だ

私は、まだ受信ができていません。
受信側のサーバ(レンタルサーバ)にsubscriberを構築し、気象庁からのアクセスがあることは確認できたのですが、「Web サイトへのアクセスが集中しているため Web ページを表示できません(ステータスコード HTTP 408/HTTP 409)」が発生し、気象庁との疎通テストがNG状態。
このエラーは、
・レスポンスの最後に改行がある
・verify_tokenを読み飛ばす設定(もしくは設定しない)にすると受信できる
という事例が報告されており、改善されるようですが。
この後の確認は、まだ実施できていません。
気象庁の職員は結構、親切でエラー状況など教えてくれますので、あきらめず、引き続き試行錯誤していこうかと思います。

[次の記事](続)subscriber の構築をして気象庁の防災情報を取得

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ