GoogleHomeで潮汐情報 その5

前回は、firebaseで外に出れず悩んだところまで行きました。
JavsScript移植するか、どうするか悩んだ結果、WebHookのREST APIを直接飲んでしまえばいいことに気づき、潮汐情報を取得するAPIに仕立てることにしました。

いまさらPHPなんて使いたくないのですが、手っ取り早いのでそのままスタートしてみることにします。

メニューのFulfillmentからWebhookを有効にします。そして、URLを記載します。このとき、URLはhttpsである必要がありますので注意してください。

こうすると、Intentのページにfulfillmentのセクションが追加されます。

ここで、Use Webhookとするとことで、このIntentに対してWebhookが呼び出されます。

次に、このURLに該当するAPIを書き始めます。おそらく、JSONが飛んできているはずなので、JSONをダンプしてみることにします。

<?PHP

$entityBody = file_get_contents('php://input');

ob_start();
var_dump(json_decode($entityBody));
$result =ob_get_contents();
ob_end_clean();

$fp = fopen("/tmp/action-on-google-dump.txt", "a+" );
fputs($fp, $result);
fclose( $fp );

フレームワーク?なにそれ? という感じでべた書きです。

シミュレーターでテストしてみます。

シミュレーター上の戻りは同じですが、APIが呼ばれたサーバにはJSONが飛んできていることが確認できました。

その内容を見てみるとわかるのですが、resultのセクションに値があります。

  ["result"]=>
  object(stdClass)#15 (10) {
    ["source"]=>
    string(5) "agent"
    ["resolvedQuery"]=>
    string(27) "明日の名古屋の潮は"
    ["speech"]=>
    string(0) ""
    ["action"]=>
    string(9) "calc_tide"
    ["actionIncomplete"]=>
    bool(false)
    ["parameters"]=>
    object(stdClass)#16 (2) {
      ["date"]=>
      string(10) "2017-11-10"
      ["geocity"]=>
      string(9) "名古屋"
    }

パラメータに指定した、dateに2017-11-10が、geocityに名古屋がはいっていますね。
「明日の名古屋の潮は」と言ったのにちゃんと日付に変換されているところがいいです。

また、もう一つ注意すべきのはactionです。ここで、Intentに指定したActionの名前が入っています。

これがわかれば、あとは応答を返すだけです。とはいっても、どう返せば・・・と調べたところ、一番シンプルな応答は次のようになるようです。

{
  'speech': 'しゃべってほしいメッセージ',
  'displayText': '画面に表示するメッセージ',
  'source': '適当な名前'
}

というわけで、ちょっと書き換えます。

$entityBody = file_get_contents('php://input');
$json = json_decode($entityBody);

$action = $json->result->action;

function speak($message) {
        echo "
                {
                'speech': '$message',
                'displayText': '$message',
                'source': 'webhook-tide'
                }
        ";
}

if($action == "calc_tide") {
        $date = $json->result->parameters->date;
        list($year, $month, $day) = split("-", $date);
        $portName = $json->result->parameters->geocity;
        $message = sprintf("%sの%sの情報です。", $date, $portName);
        speak($message);
}

日付と港の名前を取得して、返すようにしています。

いいですね! うまくいっています。

あとは、これをちゃんとした情報に変えてやればOKです。

if($action == "calc_tide") {
        $date = $json->result->parameters->date;
        list($year, $month, $day) = split("-", $date);
        $portName = $json->result->parameters->geocity;
        $message = createTideMessage($year, $month, $day, $portName);
        speak($message);
}

createTideMessageは、独自に持っている、情報をメッセージで取得する関数です。

うまくいきました!

年を言わなくても、ちゃんと見つけてくれます。(年を言っていないのに、来年になっているのがいいですね!)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)