2014/12/18

TypetalkのWebhookとNTTドコモの雑談対話APIとGoogle Apps Scriptで雑談ボットをつくる

先週、TypetalkにWebhookの機能が追加されました。 これは、ボットに話しかけると、指定されたURLにJSONをポストしてくれる機能で、これによってボットを簡単に作ることができるようになりました。

そこで、ちょうど最近存在を知ったばかりのNTTドコモの雑談対話APIGoogle Apps Scriptと組み合わせて、Typetalk用の雑談ボットを作ってみました。

実際の利用状況は次のような感じ。思ったよりも早くレスポンスが返されてきました。

雑談ボットは次のGistにあります。

ボットのしくみ

ボットの動作の概要を簡単に説明します。

  1. ボットにメンションしたとき、Typetalkで登録したURLにメンションの内容がJSONでPOSTされます。
  2. GAS (Google Apps Script)では、POST処理のためにdoPostという関数が実行されます。
    1. まず、JSONからメッセージを取り出して、自分へのメンション (@foobar+など) を取り除きます。これは、自分のメッセージでさらにWebhookが実行されるのを防ぐためです。
    2. GASのライブラリにあるUrlFetchAppを利用して雑談対話APIへJSONを投げます。
  3. 雑談対話APIからJSONが返されます。
  4. 返されたJSONから雑談対話のメッセージを取り出して、Typetalk用のJSONに入れて、(Typetalkトークンを利用して) ポスト専用URLに投げます。

ボットのコード (一部抜粋)

メインではない個所は省いています。 全コードはGistにありますのでそちらを参照してください。

TypetalkからWebhookのデータを受けるあたりのコードは次の通り。 eにJSON文字列があるのでパースしてメッセージを取り出しています。

function doPost(e) {
  var jsonString = e.postData.getDataAsString();
  var post = JSON.parse(jsonString).post;
  var user = '@' + post.account.name
  var message = getMessage(post.message);

  var responseMessage = getDialogueMessage(post.account.id, message)
  postMessage(user, responseMessage)
}

雑談対話APIとのデータやりとりのコードはこんな感じ。 contentTypetext/jsonにして、payloadJSON.stringifyにする必要があるとこあたりで少しはまりました。

function getDialogueMessage(userId, mes) {
  var dialogue_options = {
    'utt': mes
  }
  var options = {
    'method': 'POST',
    'contentType': 'text/json',
    'payload': JSON.stringify(dialogue_options)
  };
  var response = UrlFetchApp.fetch(dialogueUrl, options);
  var content = JSON.parse(response.getContentText());
  return content.utt;
}

まとめ

Google Apps Scriptでドコモの雑談対話APIを利用したTypetalkのボットをつくってみました。

サンプルでは雑談対話APIの会話のコンテキストをユーザごとに保持しているのですが、 Typetalkのトピックごとに保持したほうがよかったかなーと後で思いました。

雑談対話APIはパラメータをいじれば、関西弁なんかも使えたりする (一部標準語のままだったりしますが) ので試してみてもよいでしょう。次のような小粋な会話も楽しめます。

ちなみに、サンプルはしりとり機能には対応していませんのでご了承ください。

付録: ボットの利用手順

Typetalkボットの作成

まず、Typetalkのトピックでボットを作成します。トピックの編集 → ボットタブ → ボットの追加でボットを作成します。

作成したらとりあえずボットのポスト用URLをメモっておきます。Webhookはフック先のURLが確定していないので後まわし。

雑談APIの登録

docomo Developer supportでユーザ登録をして雑談対話APIの利用登録をして、APIキーを取得します。

Google Apps Scriptの登録

Googleドライブから新規 → その他 → アプリを追加

Google Apps Scriptを接続

これでGASが利用できるようになります。

Google Apps Scriptの作成

再び、Googleドライブから新規 → その他 → Google Appsスクリプト

ウェブアプリケーションとしてのスクリプト

Typetalk Docomo-Dialogue botを貼り付け

ウェブアプリケーションとして導入

次のURLをWebhookに設定します。

設定しました。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。