はじめに
docomoの雑談対話APIが2018年6月末でサービス終了し、自然対話APIに変更されます。
私はLINE bot([at]ffr6825b)の運営で、Google Apps ScriptからこのAPIを利用していたのですが、変更に必要な作業をまとめた記事が少ないと感じたので解説します。
ちなみに、自然対話APIも10月から有料になってしまうそうです(料金未定)。
誰か他にいい日本語会話APIをご存知でしたら教えてください!
GASを使うと、サーバー無しかつ無料で常時稼働のbotを作れるという点がとても魅力的です。
また、データベースの代わりとしてGoogle Spreadsheetを簡単に連携できるのも便利です。
参考: GASとLINE Messaging APIで同棲生活を便利にした話 - DMM inside
主な変更点
- エンドポイントが変更された
- ContextIDが廃止され、AppIDが必要になった
- オプションの設定
変更後のコード
LINEからクライアントのユーザIDを取得できるので、それをキーとしてAppIDを発行しGASのプロパティに保存しています。
口調の設定(t)は10や20などの番号から、kansai(関西弁)、akachan(赤ちゃん)、指定なし(デフォルト)の指定へと変わりました。
appRecvTime(アプリが最後に取得パラメータを受信した時刻)とappSendTime(送信パラメータを送信した時刻)は何に使うのかよくわかりませんが、適当に指定すれば動きます。
var APIKey = DOCOMO_API_KEY;
// ユーザIDとメッセージから回答を出力する
function getDialogueMessage(userId, mes) {
var dialogueUrl = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=' + APIKey;
var appId = getAppId(userId);
var requestOption = {
'language': "ja-JP",
'botId': "Chatting",
'appId': appId,
'voiceText': mes,
"clientData":{
"option":{
't': 'kansai',
}
},
'appRecvTime': Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd HH:mm:ss"),
'appSendTime': Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd HH:mm:ss")
};
var option = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(requestOption),
};
// ドコモAPIにメッセージを投げて返答を受け取る
var response = UrlFetchApp.fetch(dialogueUrl, option);
var content = JSON.parse(response.getContentText());
return content.systemText.expression;;
}
// AppIDを取得する(文脈の記憶に必要)
function getAppId(userId) {
// GASのプロパティに保存されていればそれを利用
var props = PropertiesService.getScriptProperties();
var key = 'appId-'+userId;
var userAppId = props.getProperty(key);
if (userAppId) { return userAppId; }
// なければユーザ登録
var option = {
method: "post",
contentType: "application/json",
payload: JSON.stringify({
botId: "Chatting",
appKind: "LINE bot"
})
};
var registerUrl = "https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY=" + APIKey;
var res = UrlFetchApp.fetch(registerUrl, option);
var json = JSON.parse(res.getContentText());
// GASのプロパティに値を保存
props.setProperty(key, json.appId);
return json.appId;
}
わからなかったこと
clientDataでニックネームや誕生日を指定すると、ユーザのニックネーム・誕生日になってしまいました。
botに指定する方法はないのでしょうか?
参考文献
[1] 自然対話(雑談対話) | docomo Developer support | NTTドコモ