気象庁 API プログラミング解説

気象庁防災情報XMLフォーマット

気象庁防災情報XMLでは、防災情報をXMLで取得できます。

ところで気象庁の資料を読んでいると、JMAXMLという用語が出てきます。これについての解説がありませんが、気象庁の英語での略称がJMA (Japan Meteorological Agency) ですので、JMAのXMLの意味だと考えられます。

導入

防災情報はPubSubHubbubプロトコルで通知されるため、まずはこれを理解する必要があります。気象庁防災情報XMLフォーマット | 電文公開情報

そのうえでSubscriberの構築と、Hubへの登録を行います。

Subscriberの構築

防災情報が更新されるたびに、HubからSubscriberへHTTPリクエストがあります。そのリクエストのボディに、防災情報のXMLファイルのURLが記載されています。よってまずは、そのHTTPリクエストを受け取るためのSubscriberを用意しなければなりません。そのサンプルコードが、気象庁XMLを入手しよう 利活用セミナー 第1回に掲載されていますが、これを参考にすると次のようになります。

<?php
define( 'VERIFY_TOKEN', 'ABC' );

if( $_SERVER[ 'REQUEST_METHOD' ] == 'GET' )
{
    $hubmode = @$_GET[ 'hub_mode' ];
    $hubchallenge = @$_GET[ 'hub_challenge' ];

    if( $hubmode == 'subscribe' || $hubmode == 'unsubscribe')
    {
        if( $_GET[ 'hub_verify_token' ] != VERIFY_TOKEN )
        {
            header( 'HTTP/1.1 404 "Unknown Request"', false, 404 );
            exit();
        }

        header( 'HTTP/1.1 200 "OK"', false, 200 );
        header( 'Content-Type: text/plain' );

        // チャレンジコードを返す
        echo $hubchallenge;
    }
    else
    {
        header( 'HTTP/1.1 404 "Not Found"', false, 404 );
    }
}

if( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' )
{
    // フィードを受け取る
    $contents = file_get_contents( 'php://input' );

    if( isset( $_SERVER[ 'HTTP_X_HUB_SIGNATURE' ] ) )
    {
        $sign = explode( '=', $_SERVER[ 'HTTP_X_HUB_SIGNATURE' ] );
        if( $sign[ 1 ] != hash_hmac( 'sha1', $contents, VERIFY_TOKEN ) )
        {
            header( 'HTTP/1.1 404 "Invalid X-Hub-Signature"', false, 404 );
            exit();
        }
    }

    if( FALSE === ( $feed = simplexml_load_string( $contents ) ) )
    {
        exit();
    }
    else
    {
        $filename = date( 'YmdHis' ).'.xml';
        file_put_contents( $filename, $contents );
    }
}

Subscriberのコードを作成したら、これをHubからアクセスできるところへアップロードします。そして気象庁へこれを登録するのですが、その前に動作確認をしておきます。それにはGoogle Pubsubhubbub Hubのdebugページが便利です。

Hubへの登録

HubへのSubscriberの登録は、気象庁への利用申請を通して行います。詳細は、ユーザー登録について - 気象庁防災情報XMLフォーマットにあります。

確認

Hubへの登録が完了すると、登録したSubscriberへGoogleのHubからチャレンジコードを伴ってリクエストがあります。ちなみにそのときのUser-Agentは、AppEngine-Google; (+http://code.google.com/appengine; appid: s~alert-hub)です。

防災情報 (フィード)

防災情報のフィードは、次のようなAtom形式で送信されてきます。

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
<title>JMAXML publishing feed</title>
<subtitle>this feed is published by JMA</subtitle>
<updated>2013-12-16T15:10:01+09:00</updated>
<id>urn:uuid:f57b5866-0c8c-3c92-9aff-10a715cdf48b</id>
<link href="https://www.jma.go.jp/" rel="related"/>
<link href="http://xml.kishou.go.jp/feed/extra.xml" rel="self"/>
<rights>Published by Japan Meteorological Agency</rights>

<entry>
  <title>気象警報・注意報</title>
  <id>urn:uuid:555e7d36-2136-39e0-86bf-dbb842769bbe</id>
  <updated>2013-12-16T06:09:38Z</updated>
  <author><name>札幌管区気象台</name></author>
  <link href="http://xml.kishou.go.jp/data/555e7d36-2136-39e0-86bf-dbb842769bbe.xml" type="application/xml"/>
  <content type="text">【石狩・空知・後志地方気象警報・注意報】後志地方では、風雪に注意してください。石狩、後志地方では、高波や電線等への着雪に注意してください。石狩、空知、後志地方では、なだれに注意してください。</content>
</entry>
<entry>
  <title>気象警報・注意報</title>
  <id>urn:uuid:a31ad5aa-bbc8-3f07-8872-70bfdfce3015</id>
  <updated>2013-12-16T06:09:38Z</updated>
  <author><name>熊谷地方気象台</name></author>
  <link href="http://xml.kishou.go.jp/data/a31ad5aa-bbc8-3f07-8872-70bfdfce3015.xml" type="application/xml"/>
  <content type="text">【埼玉県気象警報・注意報】埼玉県では、17日まで空気の乾燥による火の取り扱いに注意してください。</content>
</entry>

</feed>

参考

複数の技術系サイトから、まとめて検索