Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

Google Home・DialogflowからAzure Functionsを呼び出してSharePointのタスク件数を応答してみる

前回、Google HomeとIFTTT・Azure Functionsを連携させて、SharePointにタスクの作成を行う方法を紹介しました。

kageura.hatenadiary.jp

ただ、IFTTT連携の欠点はあくまでWebhooksにリクエストを投げるのみで、そのレスポンスをGoogle Home(Google Assistant)に返すことができない、対話的なアプローチができないということです。

そこで、今回はDialogflowというGoogle Assistantから連携できるチャットボット作成アプリを使って、SharePointと連携させてみましょう、ということをやってみたいと思います。

dialogflow.com

基本的なDialogflowの作り方はたくさん書いている人が居るので、そちらを参考にされることをオススメします!(ぶんなげ)

qiita.com

個人的にこの記事がいっちばんわかりやすかったです!ありがとうございます!

作るもののイメージ

今回は単純に「SharePointの昨日のタスクを教えて!」と話しかければ「昨日のSharePointのタスクは3件です」みたいな解答をしてくれるものを作りたいと思います。

システム構成は以下のような感じで、DialogflowののWebhooksの機能を使って、Azure FunctionsのHTTPトリガーを呼び出します。

f:id:sugimomoto:20171119234916p:plain

ただ、私がマイクロソフト寄りの人間なので、Azure Functionsを使っていますが、

正攻法はGoogle が提供しているGCPのFunctionだと思います。あしからず。

でも、皆さんC#で書きたいですよね? 私はC#で書きたいです。

SharePointとの連携には、SharePoint CData Driverを利用しています。

www.cdata.com

同じ感覚で、Dynamics 365やExchangeのタスクにも連携できるので、今後色々なSaaSと連携したい場合はかなり有用です。

Dialogflowの作成

というわけで、まずDialogflowの準備をします。

Dialogflowのコンソールに移動して、Agentを作成。

特に細かな設定はありませんので、そのまま適切な名前をつけて、JapaneseLanguageに設定してもらえればOKです。

f:id:sugimomoto:20171119235945p:plain

そして、メインの会話パターンを設定するIntentを作成。

f:id:sugimomoto:20171119234927p:plain

名前はとりあえず、SharePoint Task Botとしました。

応答するためのメッセージですが、指定日のタスクの件数をカウントするので、日付情報を含めたメッセージパターンを登録します。

以下のような感じ。

f:id:sugimomoto:20171119234953p:plain

そして、もっとも重要なのが、単語のパラメータ化(Entities)です。

今回は「昨日」「今日」「一昨日」といったキーワードを日付情報として扱って、Azure Functionsに渡したいので、「昨日」「今日」「一昨日」の文字列部分を選択して、表示される一覧の中から「@sys.date-time」を選びます。

f:id:sugimomoto:20171119235004p:plain

これをすることで、メッセージを受け取った際に、このキーワードをDialogflowが識別できれば、Azure Functionsに対して、パラメータとして日付情報が渡ってきます。

以下のような感じ。

    "parameters": {
      "date-time": "2017-11-19",
      },

私は今後のことも考えて、SharePointキーワード化(エンティティ化)しておきました。

将来的にはプロダクト(Exchange・SharePoint・DynamicsCRM)を判別して、それぞれのタスクを取れるように、みたいなイメージにするためです。今回は特に不要といえば不要です。

f:id:sugimomoto:20171119235014p:plain

User Saysは多ければ多いほど、いいっぽいです。

このIntent、このEntityだ!と判別することがスムーズになる感じですね。

最後に一番最下部にあるFulfilmentを開いて「Use webhook」にチェックを入れれば、一旦Dialogflow側は設定完了です。

f:id:sugimomoto:20171119235022p:plain

Azure Functionsの作成

次にAzure Functionsを準備します。

Azure Functionsで注意するべき点はDialogflowから送られてくるJsonのBodyを受け取るところと、レスポンスのJson形式ですね。

やり取りするべきJsonの仕様等は以下で公開されています。

Fulfillment  |  Dialogflow

サンプルのJsonがあるので、C#でモデルクラスを作るのは容易いですが、パラメータのところだけ、動的になるので注意しましょう。

今回私が作ったAzure Functionsのソースコードは以下で公開しています。

github.com

先程解説したパラメータが渡ってくるJson情報の中から、日付情報を見つけて、それを元に、SharePointのタスク件数を算出しています。

Dialog flowにAzure Functionsを紐付け

Azure Functionsを構成したら、Dialogflowのメニューから[Fulfilment]を選択、Web hookをEnabledにして、[URL]にAzure FunctionsのURLを貼り付けます。

併せて、その際にDomainsに「Enable webhook all domains」を設定しておきます。

f:id:sugimomoto:20171119235034p:plain

あとはSAVEすればOKです。

Google Assistantへの設定と動作確認

Google Assistantで呼び出す場合は、[Integrations]からGoogle Assistantを有効化します。

f:id:sugimomoto:20171119235040p:plain

Dialogで最初のIntentやtriggerのIntentを設定する箇所がありますが、今回はそのまま。

「Update Draft」をクリック

f:id:sugimomoto:20171119235047p:plain

これで、Google Assistantへの設定が完了です。

[Visit Console]をクリックすると、動作確認画面に移動できます。

f:id:sugimomoto:20171119235054p:plain

ちょっと面倒なのがアプリの呼び出しですね。

一番最初に「アプリ名につないで」って言う必要があります。

以下のような感じで呼び出せました。

f:id:sugimomoto:20171119235106p:plain

気になる点

実は、DialogflowのWebhools呼び出しのタイムアウトが5秒なんですよね。。。

時々Azure Functionsが起動する前に、タイムアウトされてしまうような気がするんです。

料金プランとかでどうにかならないですかねぇ・・・。