LINEとGoogle Apps Scriptで自然な会話をするBotを作成してみた

はじめに

AI技術が進み、会話型のチャットなどもたくさんありますが、チャットボットはどこか機械的というか、人間味を感じないところがあるのも事実です。ですがこれまでとは違い、より人間味が増した会話型のチャットボットができるサービスを見つけたので、実際にLINEでやりとりができるようにLINE Botを作ってみました。自然な会話になっているかどうか見てみてください。

自然な会話ができるLINE BotをGoogle Apps Scriptで作ってみた

「百聞は一見に如かず」ということでまずは作成したLINE Botをご覧ください。

本当に人間相手とLINEをしているように感じませんか?当然、おかしな返事が返ってくることはありますが、それでもなかなかのクオリティです。これが利用できるサービスは「Chaplus」といい、無料でAPIを公開しています。2020年7月現在はベータ版での提供となりますが、これを使ってLINE Botを作成した手順をお伝えしていきます。

用意するもの

必要なものは4つです。

  • LINE Messaging API
  • Chaplus API
  • スプレッドシート
  • Google Apps Script

1つずつ作成手順にそって説明していきます。

LINE Messaging APIを設定する

LINE Messaging APIでLINE Botの設定をします。

LINE Developersに登録

LINE Messaging APIを利用するにはLINE Developersに登録する必要があります。登録はLINEの個人アカウントを利用して簡単にできます。「友だち追加」のQRコードから読み込むことで登録することができます。フリープランのためお金はかかりません。

プロバイダーを作成

LINE Developersの登録が完了したら、プロダクト → Messaging API → 今すぐはじめよう の順に押下します。

上記画像のページの遷移したら、「チャネルの種類」は「Messaging API」のままで、プロバイダー名を入力します。プロバイダー名は管理者名のようなものなので、わかりやすいものだと何でもOKです。「チャネルアイコン」と「チャネル名」はLINE上に表示されるLINE Botのアイコンと名前になるのでお好きなように設定してください。その他は必要に応じて入力していきましょう。利用規約に同意し、「作成」ボタンをクリックします。

LINE Botを友だち追加

メッセージングAPI設定でQRコードを読み取り友だち追加をしておきます。この時点でトークを送ってもまだ会話は成立しません。

応答設定

LINE公式アカウントマネージャーのページへ行き、「応答設定」をクリックします。

「応答モード」はBotにエックを入れ、「応答メッセージ」はオフにチェックを入れます。「Webhook」はのちほどURLを設定するので、オンにチェックを入れておきます。「あいさつメッセージ」はどちらでも大丈夫です。
ひとまずこれでLINE Messaging APIの設定は完了です。WebhookのURLとチャネルアクセストークンの設定が残っているので、このままページは閉じないでください。

ChaplusでAPIキーを取得する

チャットボットを提供しているサービス、ChaplusのAPIキーを取得します。「Chaplus」の公式ページへ行き、メールアドレスと利用目的・用途を入力し、「利用規約に同意して登録」ボタンをクリックします。登録したメールアドレス宛に【Chaplus API β】 API KEY発行のご連絡のタイトルでメールを受信したらメール本文にAPIキーがあるので控えておきます。

Google Apps Scriptにコードを記述する

まずスプレッドシートを開けます。これはLINE Botへの投稿内容を管理するためです。開けたら中はなにもいじる必要はないので、ツールからスクリプトエディタを開けます。Google Apps Scriptのエディタが開いたら以下の内容でコードを記述します。


var TOKEN = 'LINE Botのチャネルアクセストークン';

function doPost(e) {
  var event = JSON.parse(e.postData.contents).events[0];
  var replyToken= event.replyToken;

  if (typeof replyToken === 'undefined') {
    return;
  }

  var userId = event.source.userId;
  var username = getUserName(userId);

  if(event.type == 'message') {
    var userMessage = event.message.text;
    var replyMessage = getChaplusMessage(userMessage, username);
    appendRow(userMessage);
    sendMessage(replyToken, replyMessage);
    return ContentService.createTextOutput(
      JSON.stringify({'content': 'ok'})
    ).setMimeType(ContentService.MimeType.JSON);
  }
}

function sendMessage(replyToken, replyMessage) {
  var url = 'https://api.line.me/v2/bot/message/reply';
  UrlFetchApp.fetch(url, {
     'headers': {
       'Content-Type': 'application/json; charset=UTF-8',
       'Authorization': 'Bearer ' + TOKEN,
     },
     'method': 'post',
     'payload': JSON.stringify({
       'replyToken': replyToken,
       'messages': [{
         'type': 'text',
         'text': replyMessage,
       }],
     }),
   });
}

function getUserName(userId){ 
  var url = 'https://api.line.me/v2/bot/profile/' + userId;
  var userProfile = UrlFetchApp.fetch(url,{
    'headers': {
      'Authorization' :  'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
  })
  return JSON.parse(userProfile).displayName;
}


function getChaplusMessage(mes, username) {
  var utterancePairs = [
    {
      "utterance":"おはよう!",
      "response":"やっほー!",
      "utterance":"じゃあね",
      "response":"バイバーイ",
      "utterance": "おやすみ",
      "response" : "おやすみなさ〜い"
    }
  ];
  var dialogue_options = {
    'utterance': mes,
    'username' : username,
    'agentState' : {
      'agentName' : 'test', //LINE Botのチャネル名を入力してください
      'age' : '25歳', //任意で数字を変更してください
      'tone' : 'normal' //normal(標準)、kansai(関西弁)、koshu(甲州弁)、dechu(赤ちゃん言葉)の中から設定できます
    }
  }
  var options = {
    'method': 'POST',
    'contentType': 'text/json',
    'payload': JSON.stringify(dialogue_options)
  };

  var chaplusUrl = "https://www.chaplus.jp/v1/chat?apikey=ChaplusのAPIキー";
  var response = UrlFetchApp.fetch(chaplusUrl, options);
  var content = JSON.parse(response.getContentText());

  var answer = content.bestResponse.utterance;
  return answer;
}

function appendRow(text) {
  var spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  var sheet = spreadsheet.getSheetByName("シート名");
  sheet.appendRow([new Date(),text]);
  return text;  
}

「LINE Botのチャネルアクセストークン」「ChaplusのAPIキー」「スプレッドシートID」「シート名」はご自身で取得・設定したものを入力してください。


var utterancePairs = [
    {
      "utterance":"おはよう!",
      "response":"やっほー!",
      "utterance":"じゃあね",
      "response":"バイバーイ",
      "utterance": "おやすみ",
      "response" : "おやすみなさ〜い"
    }
  ];

このコードは自分で返信内容を設定しています。好きなように設定できます。また、必要なければ削除しても大丈夫です。


var dialogue_options = {
    'utterance': mes,
    'username' : username,
    'agentState' : {
      'agentName' : 'test', //LINE Botのチャネル名を入力してください
      'age' : '25歳', //LINE Botの年齢を任意で設定してください
      'tone' : 'normal' //normal(標準)、kansai(関西弁)、koshu(甲州弁)、dechu(赤ちゃん言葉)の中から設定できます
    }
  }

このコードの「agentName」「age」「tone」は任意のものに設定してください。年齢によって言葉遣いが多少変わります。関西弁や甲州弁はもう少し改善されることを期待したいですが、雰囲気は十分に伝わるかと思うので、標準語以外もオススメです。

Webhook URLを設定する

ここまで来るとあと少しで完成です。Google Apps Scriptのコードの記述が終わったら、Webアプリケーションとして導入…をします。その際、許可を求められるので許可・承認をしてください。Webアプリケーションの公開URLがWebhook URLとなるのでコピーして、LINE Messaging API側でWebhook URLを入力し、保存すればOKです。

おわりに

関西弁を試してみると、おかしな関西弁になりますが、なかなかおもしろい返事をしてくれるのでクスッと笑えますよ。導入自体はすぐに終わるのでサクッと作成してみてください。