Google Home・DialogflowからAzure Functionsを呼び出してSharePointのタスク件数を応答してみる
前回、Google HomeとIFTTT・Azure Functionsを連携させて、SharePointにタスクの作成を行う方法を紹介しました。
ただ、IFTTT連携の欠点はあくまでWebhooksにリクエストを投げるのみで、そのレスポンスをGoogle Home(Google Assistant)に返すことができない、対話的なアプローチができないということです。
そこで、今回はDialogflowというGoogle Assistantから連携できるチャットボット作成アプリを使って、SharePointと連携させてみましょう、ということをやってみたいと思います。
基本的なDialogflowの作り方はたくさん書いている人が居るので、そちらを参考にされることをオススメします!(ぶんなげ)
個人的にこの記事がいっちばんわかりやすかったです!ありがとうございます!
作るもののイメージ
今回は単純に「SharePointの昨日のタスクを教えて!」と話しかければ「昨日のSharePointのタスクは3件です」みたいな解答をしてくれるものを作りたいと思います。
システム構成は以下のような感じで、DialogflowののWebhooksの機能を使って、Azure FunctionsのHTTPトリガーを呼び出します。
ただ、私がマイクロソフト寄りの人間なので、Azure Functionsを使っていますが、
正攻法はGoogle が提供しているGCPのFunctionだと思います。あしからず。
でも、皆さんC#で書きたいですよね? 私はC#で書きたいです。
SharePointとの連携には、SharePoint CData Driverを利用しています。
同じ感覚で、Dynamics 365やExchangeのタスクにも連携できるので、今後色々なSaaSと連携したい場合はかなり有用です。
Dialogflowの作成
というわけで、まずDialogflowの準備をします。
Dialogflowのコンソールに移動して、Agentを作成。
特に細かな設定はありませんので、そのまま適切な名前をつけて、JapaneseLanguageに設定してもらえればOKです。
そして、メインの会話パターンを設定するIntentを作成。
名前はとりあえず、SharePoint Task Botとしました。
応答するためのメッセージですが、指定日のタスクの件数をカウントするので、日付情報を含めたメッセージパターンを登録します。
以下のような感じ。
そして、もっとも重要なのが、単語のパラメータ化(Entities)です。
今回は「昨日」「今日」「一昨日」といったキーワードを日付情報として扱って、Azure Functionsに渡したいので、「昨日」「今日」「一昨日」の文字列部分を選択して、表示される一覧の中から「@sys.date-time」を選びます。
これをすることで、メッセージを受け取った際に、このキーワードをDialogflowが識別できれば、Azure Functionsに対して、パラメータとして日付情報が渡ってきます。
以下のような感じ。
"parameters": {
"date-time": "2017-11-19",
},
私は今後のことも考えて、SharePointもキーワード化(エンティティ化)しておきました。
将来的にはプロダクト(Exchange・SharePoint・DynamicsCRM)を判別して、それぞれのタスクを取れるように、みたいなイメージにするためです。今回は特に不要といえば不要です。
User Saysは多ければ多いほど、いいっぽいです。
このIntent、このEntityだ!と判別することがスムーズになる感じですね。
最後に一番最下部にあるFulfilmentを開いて「Use webhook」にチェックを入れれば、一旦Dialogflow側は設定完了です。
Azure Functionsの作成
次にAzure Functionsを準備します。
Azure Functionsで注意するべき点はDialogflowから送られてくるJsonのBodyを受け取るところと、レスポンスのJson形式ですね。
やり取りするべきJsonの仕様等は以下で公開されています。
サンプルのJsonがあるので、C#でモデルクラスを作るのは容易いですが、パラメータのところだけ、動的になるので注意しましょう。
今回私が作ったAzure Functionsのソースコードは以下で公開しています。
先程解説したパラメータが渡ってくるJson情報の中から、日付情報を見つけて、それを元に、SharePointのタスク件数を算出しています。
Dialog flowにAzure Functionsを紐付け
Azure Functionsを構成したら、Dialogflowのメニューから[Fulfilment]を選択、Web hookをEnabledにして、[URL]にAzure FunctionsのURLを貼り付けます。
併せて、その際にDomainsに「Enable webhook all domains」を設定しておきます。
あとはSAVEすればOKです。
Google Assistantへの設定と動作確認
Google Assistantで呼び出す場合は、[Integrations]からGoogle Assistantを有効化します。
Dialogで最初のIntentやtriggerのIntentを設定する箇所がありますが、今回はそのまま。
「Update Draft」をクリック
これで、Google Assistantへの設定が完了です。
[Visit Console]をクリックすると、動作確認画面に移動できます。
ちょっと面倒なのがアプリの呼び出しですね。
一番最初に「アプリ名につないで」って言う必要があります。
以下のような感じで呼び出せました。
気になる点
実は、DialogflowのWebhools呼び出しのタイムアウトが5秒なんですよね。。。
時々Azure Functionsが起動する前に、タイムアウトされてしまうような気がするんです。
料金プランとかでどうにかならないですかねぇ・・・。