LoginSignup
5
5

More than 5 years have passed since last update.

Dialogflow と Firebase Cloud Functions で Actions On Google の Node.js Client Library v2対応

Posted at

以前、Dialogflow と Firebase Cloud Functions で Actions On Google 作り を書いてから半年ほど。。時代の流れは早いもので、そのレポートの通りやっても動かない!!

ということで、簡単なポイントまとめです。

前のレポートの通りにやって動かないのは、Firebase Cloud Functions のテンプレートを利用すると DialogflowApp の Node.js Client Library が v2 になるからです。

Screen Shot 2018-07-02 at 15.39.45.png

無理矢理 v1 を使用することもできますが、上図(Actions on Google のリファレンスより引用)のように v1 は、既に"deprecated"になっています。なので、それに従い、v2 を使うやり方にシフトします。
v1 と v2 でどのように変わったのかを、ソースコードベースでレポートしたいと思います。

比較

途中略してますが、大体同じになるようにソースコードを書いています。以下の2つを見比べてみてください。

v1

index_v1.js
'use strict';

process.env.DEBUG = 'actions-on-google:*';

const { DialogflowApp } = require('actions-on-google');
const functions = require('firebase-functions');

exports.funcDecisionAction = functions.https.onRequest((request, response) => {
    const app = new DialogflowApp({ request, response });

    function funcHandler(app) {
        let speechStr = "";
        let func_id = app.getArgument(funcid);
        console.log(app.getRawInput());

        ....

        if (speechStr === "") {
            speechStr = "値ないよ!最初からやり直して!!";
            app.tell(speechStr);
        } else {
            app.ask(speechStr);
        }
    }

    const actionMap = new Map();
    actionMap.set('action.funcdecision', funcHandler);

    app.handleRequest(actionMap);
});

v2

index_v2.js
'use strict';

const { dialogflow } = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({ debug: true });

app.intent('funcdecisionIntent', (conv, { funcid }) => {
    let speechStr = "";
    let func_id = funcid;
    console.log(conv.input.raw);

    ....

    if (speechStr === "") {
        speechStr = "値ないよ!最初からやり直して!!";
        conv.close(speechStr);
    } else {
        conv.ask(speechStr);
    }
});

exports.funcDecisionAction = functions.https.onRequest(app);

Dialogflow 側に"funcdecisionIntent"という名前の Intent、"funcid"という名前の Entity があるものとします。(v1の方では、更に Intent に"action.funcdecision"という Action名がつけられているとします。)

ポイントとしては下記が挙げられます。

  • "app"の代わりに"conv"
  • ".tell"が".close"に
  • 処理に Intent 名を直接指定するように(action名をつけなくてよくなった、最後にまとめて action名と処理の紐付けを行わなくてよくなった)
  • Entity名を引数に指定して処理で使う

v2の方がより直感的で無駄がなくなったように感じますね。

まとめ

すごい大雑把ですが、以上です。
不足点多くて、もっと詳細に知りたい!って人は公式のリファレンスなど見に行ってください!私的には、Samples を見るのがおすすめです!

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5