Help us understand the problem. What is going on with this article?

Dialogflow(旧:API.AI) のイベントをCloud functionsで受け取りユーザーにテキストを返してみる #dialogflow

More than 1 year has passed since last update.

API.AIのイベントを受け取る

API.AIではWebhookを設定することが出来ます。これによりユーザーから届いたリクエストを外部のサーバーで処理することができます。今回はActions on GoogleのイベントをCloud functionsで受取り、テキストをユーザーに返してみます。

今回使用するサービス

API.AIのプロジェクトを用意

今回はGoogle I/O 2017 API.AIのセッションのベーグル注文を日本風で試してみるで作成したプロジェクトをそのまま使用したいと思います。

Actions on Gooleの有効化

IntegrationsのActions on Gooleのチェックを入れ有効化し、Settingからプロジェクトを作成します。Add actions to your appで「USE API.AI」か「Use Actions SDK」のどちらかを選択する画面に来たら「USE API.AI」を選択し画面の内容を確認したら「OK」で戻ります。
※日本語非対応のためのシュミレーターは試せません

Cloud functionsの準備

index.jsとpackage.jsonを用意

プロジェクト用のディレクトリに index.jspackage.jsonを作成します。

index.js
'use strict';

process.env.DEBUG = 'actions-on-google:*';
const App = require('actions-on-google').ApiAiApp;

//API.AI actions
const ORDER_SUSHI = 'order.sushi';

exports.ordersushi = (request, response) => {
  const app = new App({request, response});
  console.log('Request headers: ' + JSON.stringify(request.headers));
  console.log('Request body: ' + JSON.stringify(request.body));

  // Fulfill action business logic
  function orderSushiHandler (app) {
    // Complete your fulfillment logic and send a response
    console.log('Requested ' + ORDER_SUSHI);
    app.ask('Sushi requested!!');
  }

  const actionMap = new Map();
  actionMap.set(ORDER_SUSHI, orderSushiHandler);

  app.handleRequest(actionMap);
};

ORDER_SUSHI には Intentsのアクション名を入れます

Screen Shot 0029-05-30 at 7.55.14.png

package.json
{
  "name": "sushi-order-demo",
  "description": "This is your Action's webhook",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "~6.0"
  },
  "scripts": {
    "lint": "semistandard --fix \"**/*.js\"",
    "start": "functions deploy ordersushi --trigger-http",
    "deploy": "gcloud beta functions deploy ordersushi --trigger-http --stage-bucket order-sushi"
  },
  "dependencies": {
    "actions-on-google": "^1.0.0"
  },
  "devDependencies": {
    "semistandard": "^9.1.0"
  }
}

プロジェクトをアップロードする

以下のコマンドでプロジェクトをCloud Storageにアップロードします。

terminal
gcloud beta functions deploy ordersushi --trigger-http --stage-bucket order-sushi

アップロードが終わるとURLが返ってくると思います。そのURLを控えておいてください。

httpsTrigger:
url: https://us-central1-yourproject.cloudfunctions.net/ordersushi

API.AIにWebhookを設定する

Webhookの有効化

横のメニューから「Fulfillment」を選択し、Webhookを有効化します。
そして先ほどのURLを入れます。

Screen Shot 0029-05-30 at 8.07.18.png

Webhookの設定

Intents の Sushi OrderのUse webhookにチェックを入れます。

Screen Shot 0029-05-30 at 8.11.36.png

テストしてみよう

Actions on Gooleでテストしたいところですが、まだシュミレーターが日本語非対応なのでAPI.AIのシュミレーターでテストしてみましょう。

Text Responseの削除

テスト前にText Responseの「へい、かしこまりました!」は削除します。代わりにfunctionsで「Sushi requested!!」を返します。

実行

右のシュミレータで実行します。「寿司食べたい、さび有り、まぐろ」と入力し、注文が確定すると。。。

Screen Shot 0029-05-30 at 8.19.29.png

ちゃんと「Sushi requested!!」が返されましたね!

ログの確認

以下のコマンドでfunctionsのログを見る

terminal
gcloud beta functions logs read ordersushi

Requested order.sushiが確認できました!

terminal
I ordersushi  xxxxxxxx  2017-05-29 23:15:38.465  Requested order.sushi
flatfisher
釣りが好きです
mixi
全ての人に心地よいつながりを
http://mixi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした