LINEとDialogflowを接続するプロトタイプを作成してみた #LINE_API

2019.02.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、中村です。

LINEをI/Fとした日本語チャットボット構築ではAIエンジンとしてDialogflowを利用することがあります。自前で実装したりもしていたのですが、v2になってからDialogflowモジュールを活用する方向にシフトしました。LINEからのイベントはWebhookにて送信されます。今回はAPI Gateway・Lambdaを利用してサーバーレス構成で接続部分を作成しました。

現在はプロトタイプですが、LINEが提供している各イベントへの対応を予定しています。

プロトタイプを作成する

このプロトタイプには、このような機能があります。

  • LINEの署名検証
  • 接続確認チェック
  • DialogflowへdetectIntentリクエスト
  • ユーザーへ応答メッセージ返答
  • 1個目のメッセージは、fulfillmentText
  • 2~5個目のメッセージは、fulfillmentMessagesのpayload

デプロイは、DialogflowモジュールがLambdaでエラーになった時のワークアラウンド – CodePipelineとCodeBuildにて作成しているものですが修正があります。

Dockerfileのnode.jsインストール後に下記の記載を追加する必要があります。

# typescript
RUN npm -g install typescript

ローカルでdocker buildを行い、ECRリポジトリにPushしましょう。またtypescriptはコンパイルが必要なため、buildspec.ymlも修正が必要です。

---
version: 0.2
phases:
  pre_build:
    commands:
      - cd functions/api
      - npm install
      - cd ../../
  build:
    commands:
      - echo Build started on `date`
      - cd functions/api
      - tsc
      - cd ../../
      - "/usr/local/bin/apex deploy"
  post_build:
    commands:
      - echo Build completed on `date`

ソースについては、githubを参照してほしいのですが、いくつか説明をしたいと思います。 まず必要なモジュールについてですが、Dialogflow, bot-sdk, @types/node, @types/dialogflowです。@typesは公式ではありませんが、typeのエラーによりビルドエラーとなってしまうのでインストールします。 また環境変数として、DialogflowのプロジェクトID、クライアントEmail、秘密鍵、LINEは、チャネルアクセストークンとチャネルシークレットを定義します。

Dialogflowは、作成したプロジェクトページにてプロジェクトIDとクライアントEmailを取得できます。このプロジェクトページに表示されているクライアントEmailをクリックすると、Google Cloud Platformのサービスアカウントページに遷移します。同様のEmailアドレスが一覧に表示されていると思うので、詳細ページに遷移し編集をクリックします。キーを作成をクリックすると、JSONファイルで認証データがダウンロードされます。

LINEのチャネルアクセストークンとチャネルシークレットは、管理コンソールにて取得できます。 取得したデータは、project.jsonへ記述します。(TODO: 認証データをgithubに置いてしまう形なので、ここは別途いい方法を検討中です)

機能部分

  • 署名検証 bot-sdkには、validateSignatureというメソッドがあります。booleanが返されるので分岐します。

  • 接続確認 接続で送信されるリクエストのuserIdは固定になっています。これをキーに分岐します。

  • Lambda Proxy Lambdaで署名検証を行うため、API GatewayではLambda Proxyを選択します。この場合、bodyがstringで返されるためJSONをパースする必要があります。

  • メッセージ送信 dialogflowからのレスポンスは配列で返されます。LINEへは同時に5件までメッセージ送信できるので、配列を操作してメッセージを生成します。payloadについてはLINEの仕様に合うように実装している想定です。

API Gateway

LINEのwebhookは、HTTP POSTで送信されるのでメソッドをPOSTとし、Lambda Proxyを利用します。

Github

cm-nakamura-yuki/blog-chatbot-api

テスト

Dialogflowは作成時から変更していません。こんにちはなどは、「こんにちは!」と返します。インテントを認識できない場合は、「すみません。よく分かりませんでした。」・「今のは少しわかりにくかったです。」と返しています。

まとめ

いかがでしたでしょうか。 まだまだ改善しなくてはいけないですが、まずプロトタイプができました。 接続可能な口を用意しておくことで、Dialogflowの開発により注力できそうです。

弊社では、「Amazon Connect」の導入を検討している方を対象とした無料相談会を毎週開催中です。

また音声を中心とした各種ソリューションの開発支援も行なっております。