API.AIで日本語でもトレーニング機能が機能するようになっています。天野研ではLINE/Facebook messengerでAPI.AIを利用したボットを運用しています。そこで、未知の対応できないメッセージがあったときにメールで通知を受け取ることを考えてみました。
API.AIにはfulfillmentという項目で外部サービスと連携(webhook)する機能があります。ここではgoogle apps scriptによる簡易サーバーでこのwebhookを受け取り、メールで通知することとします。
google apps script側の設定
google apps scriptはいろいろな形式で利用できますが、ここではgdrive/spreadsheetから利用することとします。せっかくなのでspreadsheetに履歴を記録しながら動作させます。
gdrive上の適当なフォルダーにspreadsheetを作成してください。そこから「ツール」→「スクリプトエディタ」を実行します。ここに以下のようなコードを記入します。
function doPost(e) {
var now = new Date();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var sheetLog = ss.getSheets()[0];
try {
var json = JSON.stringify(e);
var values = JSON.parse(json);
var contents = JSON.parse(values.postData.contents);
sheetLog.appendRow([ now, json, contents.result.metadata.intentName ]);
if (contents.result.metadata.intentName = "Default Fallback Intent") {
// 対応できないメッセージがあった
var subject = "api.ai : check training data";
var body = "" + now + "\n";
body += "about : \n";
body += " " + contents.result.resolvedQuery + "\n";
MailApp.sendEmail("!!! YOUR MAIL ADDRESS !!!", null, subject, body);
}
} catch (err) {
sheetLog.appendRow([ now, err ]);
}
}
API.AIからはPOST形式で通信がやってきますので、ここではdoPostというメソッドで受信します。そしてspreadsheetの末尾にデータを追記しつつ、「Default Fallback Intent」だった場合にメールを送信しています。
スクリプトエディタで「公開」→「Webアプリケーションとして導入」します。ここで以下のようにします。
- プロジェクトバージョン:新規作成
- 次のユーザーとしてアプリケーションを実行:自分
- アプリケーションにアクセスできるユーザー:全員(匿名ユーザーを含む)
上の操作はソースコード修正時にも常に必要です。これを行わないと修正した内容が反映されいません。
上の後、URLが表示されます。これを次のAPI.AIの設定で利用します。
API.AI側の設定
API.AI側では2カ所の設定が必要です。
まず全体設定です。左上のメニューから「Fulfillment」を選んでください。
- Webhook : ENABLED(と表示されるようにクリック)
- URL : 上で得たURLをCopy & Paste
- DOMAINS : Enable webhook for all domains
上のようにして「Save」します。これでFulfillmentが有効になりますが、呼び出しは個々のIntentごとに設定が必要で、デフォルトではどのIntentからも呼び出されません。
このため、次に個々のIntentごとの設定です。webhookさせたいIntentを選んでください。ここでは「Default Fallback Intent」とします。
ページ加担に「Fulfillment」がありますので、ここで「Use webhook」をonにします。
上の二つの設定を行うことで、google apps scriptがコールされるようになります。
この実装例では毎回メール通知していますが、多数のアクセスがある場合にはspreadsheetに記録だけして、定期的にメール送信するといった工夫が必要でしょう。


“API.AIにおける独自webサービスとの連携(その1.メール通知)” への1件の返信