LoginSignup
9
11

More than 5 years have passed since last update.

GASでRepl-AIを使う方法

Last updated at Posted at 2017-07-02

はじめに

最近、SlackBotを作りました。
そのBotの雑談用APIにNTT Docomoが公開しているRepl-AIというサービスを使用したのですが、なかなかうまくいかない箇所があったので、ノウハウを共有したいと思います。

0.準備

以下のものを使えるようにしてください。

  1. Google Apps Script(以下GAS)
  2. Repl-AI(プロジェクトの作成も忘れずに…)
  3. 連携させるチャットサービスなど(Slack,ChatWork, etc…)

※今回はRepl-AIのプロジェクトの作成方法、チャットサービスとの連携に関しては省略します。「解説しろ」という方がいらっしゃいましたら、コメントいただけると幸いです。

1.ユーザーIDを取得する

Repl-AIのAPIドキュメントには以下のように書いてあります。

「ユーザーID取得」では、ボットと話すために必要なユーザーIDを取得できます。 ユーザーIDとは、ボットが話している相手(エンドユーザー)が誰かを理解するために必要なIDです。 ボットはユーザーIDにひもづけて、話し相手の情報や会話のステータスを覚えるため、「対話」を利用開始する前に、必ずユーザーIDを取得してください。

つまり、雑談を始める前にユーザーIDを取得し、さらにそれを保持しておく必要があるということです。(保持しておかないとAPIを利用するたびに新しいユーザーとして雑談が始まる)
まずはユーザーIDを取得します。

getUserID.gs
var REPLAI_API_URL  = "";
var REPLAI_API_KEY = "";
var REPLAI_API_BOTID = "";

function getReplAiUserId() {
    var appUserId = '';
    var payload = {
        "botId": REPLAI_API_BOTID
    };
    var headers = {
        "x-api-key": REPLAI_API_KEY,
        "Content-Type": "application/json"
    };
    var param = {
        "method": "POST",
        "payload": JSON.stringify(payload),
        "headers": headers,
        "dataType": "json",
        "contentType": "application/json"
    };
    var res = UrlFetchApp.fetch(REPLAI_API_URL + '/registration', param);
    appUserId = JSON.parse(res).appUserId;
    return appUserId;
}
  • REPLAI_API_URL
  • REPLAI_API_KEY
  • REPLAI_API_BOTID

は適宜置き換えてください。
このメソッドの戻り値はユーザーIDです。
Repl-AIのドキュメントにはリクエストヘッダにContent-Typeapplication/json、リクエストボディにbotIdを指定するように書かれていましたが、上記のように書かないとユーザーIDを取得することができませんでした。
ここに一番はまりました。

2.ユーザーIDを保存する

取得したユーザーIDはどこかに保存しておかなければなりません。
今回はSpreadSheetを使用することにしました。
appUserIdTableという名前のSpreadSheetファイルをgsファイルと同じディレクトリに作成しました。
シートにはこんな感じで項目を設定しておきます。(なくてもかまいませんが、ちょっと見やすくなります)
image.png
次に、取得したユーザーIDを含むユーザーの情報をSpreadSheetに書き込みます。

insertNewUserData.gs
var SHEET_ID = "";
var SHEET_NAME = "appUserId";

var userData = {
    name: name,
    appUserId: getReplAiUserId(),
    lastUpdate: new Date()
};

function insertNewUserData(userData) {
    var splSheet = SpreadsheetApp.openById(SHEET_ID);
    var sheet = splSheet.getSheetByName(SHEET_NAME);
    sheet.insertRowAfter(sheet.getLastRow());
    sheet.getRange(sheet.getLastRow() + 1, 1).setValue(userData.appUserId);
    sheet.getRange(sheet.getLastRow(), 2).setValue(userData.name);
    sheet.getRange(sheet.getLastRow(), 3).setValue(userData.lastUpdate);
}

SHEET_IDはSpreadSheetファイルを開いた時のURLから取得できます。
https://docs.google.com/spreadsheets/d/SHEET_ID/edit
また、userDatanameは雑談するユーザーの名前です。

3.新規ユーザーと既知のユーザーの処理を分ける

SpreadSheetのデータを検索して、データが存在すればそのデータを使用、存在しなければinsertNewUserDataの実行というように処理を分けます。

getDataFromUsername.gs
function getDataFromUsername (name) {
    var splSheet = SpreadsheetApp.openById(SHEET_ID);
    var sheet = splSheet.getSheetByName(SHEET_NAME);
    var data = sheet.getDataRange().getValues();
    var row, column;

    for (row = 0; row < data.length; row++) {
        if (data[row][1] === name) {
            var userData = {
                appUserId: data[row][0],
                name: data[row][1],
                lastUpdate: data[row][2],
            };
            return userData;
        }
    }
    //ユーザー情報が見つからない場合
    var userData = {
        name: name,
        appUserId: getReplAiUserId(),
        lastUpdate: new Date()
    };
    insertNewUserData(userData);
    return userData;
}

先述した通り、nameは雑談するユーザーの名前です。
それをもとに新規ユーザーかどうかの判定を行っています。
このメソッドは上記の判定・処理を行った後、userDataを返します。

4.ユーザーデータの更新

SpreadSheetに記録するユーザーデータには、lastUpdateというパラメータがあります。これは、最後にAPIを叩いた時刻です。
これを更新する処理を記述します。

updateLastTime.gs
function updateLastTime(name) {
    var splSheet = SpreadsheetApp.openById(SHEET_ID);
    var sheet = splSheet.getSheetByName(SHEET_NAME);
    var data = sheet.getDataRange().getValues();
    var row;

    for (row = 0; row < data.length; row++) {
        if (data[row][1] === name) {
            sheet.getRange(row + 1, 3).setValue(new Date());
            return;
        }
    }
    return;
}

5.実際にRepl-AIを使用する

ここまででAPIを使用するのに必要なパラメータの取得、処理ができました。
あとはAPIを叩くだけです。

getReplAiMessage.gs
var REPLAI_API_BOTID = "";

function getReplAiMessage (message, user, scenario) {
    var response = '';
    var userData = getDataFromUsername(user);
    var appUserId = userData.appUserId;
    var payload = {
        "appUserId": appUserId,
        "botId": REPLAI_API_BOTID,
        "voiceText": message,
        "initTalkingFlag": false,
        "initTopicId": scenario,
        "appRecvTime": userData.lastUpdate,
        "appSendTime": userData.lastUpdate
    };
    var headers = {
        "x-api-key": REPLAI_API_KEY,
        "Content-Type": "application/json"
    };
    var param = {
        "method": "POST",
        "payload": JSON.stringify(payload),
        "headers": headers,
        "dataType": "json",
        "contentType": "application/json"
    };
    var res = UrlFetchApp.fetch(REPLAI_API_URL + '/dialogue', param);
    response = JSON.parse(res).systemText.expression;
    updateLastTime(user);
    return response;
}

REPLAI_API_BOTIDは作成したBotのBot IDを、messageはユーザーがBotに対して話しかける文章を、scenarioは使用したいシナリオのシナリオIDを指定してください。
このメソッドはBotの返答のメッセージを返します。

まとめ

あとは、これをお好みのチャットサービスなどと連携させるだけで、Botとの雑談が楽しめます。
Repl-AIは以前のDocomoの雑談APIと比べて、独自のやりとりを作成したり、調べ物などをしてくれるため、できることがより増えました。
皆さんも面白い、楽しいBotを作ってみてください。

9
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11