気象庁XMLをAWS+Nginx+MEANで取得 その2

このエントリーをはてなブックマークに追加

前回はとりあえず気象庁XMLを受け取る為のMEANな環境構築に少し触れたぐらい(Google先生観てね、で終わった会)ですが、今回は実際気象庁XMLを受け取る為に必要なAPIについて書いてみます。一応筆者の環境で受信確認はできたのでとりあえずは動く成果物です(笑)

まず第一にPubSubHubbubプロトコルでHubに対してSubscriberが「私は購読する意思がありますよー」という意思表明をする為にHubからGETリクエストで飛んでくる「チャレンジコード」に対して適切なレスポンスを返す必要があります。これを逃してしまうとHubからは「この人は購読する意思がないんだな」と判定されて購読の登録失敗、あるいは継続破棄されます。実際にどんなGETリクエストパラメータが飛んでくるかと言うと以下のような感じです。

?hub.verify_token=(気象庁に申請したverify_token)&hub.challenge=VBDYB_(長いので略)xyST4D7x&hub.topic=(購読対象トピックのURL)&hub.mode=subscribe&hub.lease_seconds=432000′

このリクエストのパラメータをパースしてhub.challengeの中身をそのままレスポンスで返せばチャレンジコードの応答成功となります。極端な話hub.challengeだけ注目すればレスポンスするだけなので購読の意思表示ができるのですが、本当に意図したチャレンジコードだったのか確かめる手段としてverify_tokenをがあります。気象庁XMLの場合はHUBへの登録は気象庁が行う為、ユーザー登録時にverify_tokenを指定することができます。hubからはこのverify_tokenがGETパラメータの中に入ってくる為、この値が自分が申請したものと一致するかどうかを確かめておくほうがセキュリティ的にはBETTERです。実際のNodejS+Expressのコードは以下の通り。

app.get(callbackUrl, function(req, res) {
    var params = url.parse(req.url, true).query;
    var hubchallenge = params["hub.challenge"];
    var hubverify = params["hub.verify_token"];

    if (hubverify != MY_VERIFY_TOKEN) {
      // 何かしらのエラー処理
    }

    if ((hubmode == "subscribe" || hubmode == "unsubscribe")) {

        res.setHeader("Content-Length", hubchallenge.length);
        res.setHeader("Connection", 'closed');
        res.writeHead(200, {"Content-Type": 'text/plain'});
        res.end(hubchallenge);
    }
    else {
      // 何かしらのエラー処理
    }
});

とりあえず上記のようなコードがあればHubへの購読意思表明は成功します。

次回はPublisher -> Hub -> Subscriberと渡ってくるfeedについて書きます。

Written on September 24, 2014
このエントリーをはてなブックマークに追加