自動化・効率化ならKTパソコンスクール

powerd by うなぎいもプロジェクト

Google Apps Scriptで自然な会話ができるLINEボットを作成

カテゴリー │Google Apps Script



Google Apps Scriptで自然な会話ができるLINEボット(天気予報を答えることができる機能付き)を作成してみました。このLINEボットを試してみたい方は下のQRコードか、または、@976ixtvzでIDを検索して、友達追加してください。↓


このLINEボット作成にはLINE Messaging APIとリクルート社のTalk API、OpenWeatherMapのWeather APIを使用しました。

Messaging APIは簡単に言うと、LINEのボット作成用のAPIです。Talk APIはChatbotを作成するためのAPIです。ディープラーニングの一種であるRNNを使って、入力文からの応答文生成による日常会話応答機能を提供します。Weather APIは天気予報を取得するAPIです。以下はLINEボット作成の手順です。↓

① LINE Developersに登録しアクセストークンを取得(詳しくはこちらを見るか、「LINE Developersに登録」で検索、その他、設定変更の必要あり)
② Talk APIのAPIキーをこちらから取得
③ OpenWeatherMapのアカウントがない場合はこちらから作成
④ サインインした後、Weather APIのAPIキーをこちらから取得
⑤ Googleドライブのマイドライブ上でGoogle Apps Scriptを作成、下に記載のコードを貼り付け
⑥ 「公開」⇒「ウェブ アプリケーションとして導入」
⑦ 下の画像↓のとおりに設定して「更新」の後、「OK」(⑥⑦の手順はコードを編集した場合は毎回行う)
Google Apps Scriptで自然な会話ができるLINEボットを作成


下は作成したGoogle Apps Scriptのコードです。↓(「LINE Messaging APIのアクセストークンをここに貼り付け」「Talk APIのキーをここに貼り付け」「Weather APIのキーをここに貼り付け」のところはそれぞれ取得したものを貼り付けてください。)

//LINE Messaging APIのアクセストークン
var CHANNEL_ACCESS_TOKEN = 'LINE Messaging APIのアクセストークンをここに貼り付け';

var LINE_ENDPOINT = 'https://api.line.me/v2/bot/message/reply';

var TALK_API_KEY = 'Talk APIのキーをここに貼り付け'; //A3RT(talk) - APIキー
var TALK_API_ENDPOINT = 'https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk';

var WEATHER_API_KEY = 'Weather APIのキーをここに貼り付け'; //OpenWeather APIキー
var WEATHER_API_ENDPOINT = 'https://api.openweathermap.org/data/2.5/forecast/daily';

function doPost(e) {
var events = JSON.parse(e.postData.contents).events;
events.forEach(function(event){
if(event.type === 'message'){
reply(event);
}else if(event.type === 'follow'){
follow(event);
}else if(event.type === 'unfollow'){
unFollow(event);
}
});
}

function reply(e) {
var obtained_message = e.message; //取得したメッセージ
var obtained_text = obtained_message.text; //取得したメッセージ中のテキスト
var lat = 34.780035; //KTパソコンスクールの緯度
var lon = 138.007834; //KTパソコンスクールの経度
var weather_str = '天気';
var today_str = '今日';
var tomorrow_str = '明日';
var day_after_tomorrow_str1 = '明後日';
var day_after_tomorrow_str2 = 'あさって';
var reply_message; //返信する内容

if(obtained_text.indexOf(weather_str) !== -1){ //取得したメッセージに天気の文字があったら
var weather_json = getResponceFromOpenWeatherAPI(lat, lon); //OpenWeather APIのレスポンスをJSONで取得する
reply_message = getWeather(weather_json, 0);

if(obtained_text.indexOf(tomorrow_str) !== -1){ //取得したメッセージに明日の文字があったら
reply_message = getWeather(weather_json, 1);

//取得したメッセージに明後日、または、あさっての文字があったら
}else if(obtained_text.indexOf(day_after_tomorrow_str1) !== -1 ||
obtained_text.indexOf(day_after_tomorrow_str2) !== -1){
reply_message = getWeather(weather_json, 2);
}
}else{
var talk_json = getResponceFromTalkAPI(obtained_text); //A3RT(talk) - APIのレスポンスをJSONで取得する

if(talk_json.message === 'ok'){
reply_message = talk_json.results[0].reply;
}else{
reply_message = obtained_text; //エラーの場合はオウム返しする
}
}

var message = {
'replyToken' : e.replyToken,
'messages' : [
{
'type' : 'text',
'text' : reply_message,
}
]
};

var replyData = {
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify(message)
};

var response = UrlFetchApp.fetch(LINE_ENDPOINT, replyData);
return response.getResponseCode();
}

//A3RT(talk) - APIのレスポンスをJSONで取得する
function getResponceFromTalkAPI(query){
var formData = {
'apikey': TALK_API_KEY,
'query': query,
}

var options = {
'method': 'post',
'payload': formData
};

var responce = UrlFetchApp.fetch(TALK_API_ENDPOINT, options);
var json = JSON.parse(responce.getContentText());

return json;
}

//OpenWeather APIのレスポンスをJSONで取得する
function getResponceFromOpenWeatherAPI(lat, lon){
var queryString = '?lat=' + lat + '&lon=' + lon + '&appid=' + WEATHER_API_KEY + '&units=metric&lang=ja&type=get';
var url = WEATHER_API_ENDPOINT + queryString;
var options =
{
'method': 'get',
};

var responce = UrlFetchApp.fetch(url, options);
var json = JSON.parse(responce.getContentText());

return json;
}

//天気を取得
function getWeather(weather_json, index){
var weather = weather_json.list[index].weather[0].description;
var temp_max = round(weather_json.list[index].temp.max, 0);
var temp_min = round(weather_json.list[index].temp.min, 0);
var speed = round(weather_json.list[index].speed, 1);
var day = '今日';

if(index === 1){
day = '明日';
}else if(index === 2){
day = '明後日';
}

var reply_message = day + 'のKTパソコンスクール付近の天気は' + weather + 'です。最高気温は'
+ temp_max + '℃、最低気温は' + temp_min + '℃、風速は毎秒' + speed + 'mです。';
return reply_message;
}

//四捨五入
function round(number, precision){
var shift = function (number, precision, reverseShift){
if(reverseShift){
precision = -precision;
}
var numArray = ("" + number).split("e");
return +(numArray[0] + "e" + (numArray[1] ? (+numArray[1] + precision) : precision));
};
return shift(Math.round(shift(number, precision, false)), precision, true);
}



天気予報は今日から明後日までに対応しています。明日の天気予報を知りたいときは「明日の天気は?」のようにすると答えます。下はやり取りのサンプルです。↓
Google Apps Scriptで自然な会話ができるLINEボットを作成

  • このエントリーをはてなブックマークに追加
  • LINEで送る

同じカテゴリー(Google Apps Script)の記事


上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
Google Apps Scriptで自然な会話ができるLINEボットを作成
    コメント(0)