前回学んだGoogle Apps Scriptと、LINEのMessaging APIを組み合わせて、LINEのチャットボットを作成します。自動返信用の辞書や、定期的実行など、Googleスプレッドシートならではの機能も活用していきます。
それほど多くないコードで作成できるので、まずはやり方を見て一緒に流れをつかみましょう。(授業後にソースコードを共有します)
<内容>
・LINE チャットボットを作成する
・自動返信機能を追加する
・一斉送信機能を追加する
▼ LINE Messaging API
https://developers.line.biz/ja/services/messaging-api/
▼ LINEボットの画面イメージ
■授業中に書かれたソースコード
// LINE developers のTOKEN
// https://developers.line.biz/
var ACCESS_TOKEN = '*********'; // ここにACCESS_TOKENを入れる
var sheet = SpreadsheetApp.getActive().getSheetByName('Line')
/* ***************
00: 基本
*************** */
// POSTアクセスが来た場合の処理 (今回はBOTに何かしらのアクションをされた場合が該当)
function doPost(e) {
// イベント(ユーザーからの何かしらのアクション)
var event = JSON.parse(e.postData.contents).events[0]
// イベントから主要な要素を抽出
var eventType = event.type
var userId = event.source.userId
/* 1. 友達登録の場合 → ユーザーデータを保存 */
if (eventType == 'follow'){
stockUserData(userId)
}
/* 2. メッセージ受信の場合 → 応答メッセージを返す */
else {
var replyToken = event.replyToken;
var userMessage = event.message.text;
replyLine(replyToken, userMessage)
}
}
/* ***************
10: 返信系(Reply)
*************** */
// Lineに「返信」する
function replyLine(replyToken, userMessage){
/* 返答メッセージを生成する */
var dictionary = sheet.getRange("A6:B100").getValues();
var message = ""
// userMessage = スクーのミッションは?
// dictionary[i][0] = "ミッション"
// 辞書から「キーワード」を検索
for(var i=0; i < dictionary.length; i++){
if(userMessage.match(dictionary[i][0])) message = dictionary[i][1]
if(message != "") break
}
// 辞書にあてはまるものがなければ、相槌を打つ
if (message == ""){
message = userMessage + "だってにゃ? それはいいにゃ〜!"
}
// 「応答」メッセージ用のAPI URL
var url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': message,
}],
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
/* ***************
20: 送信系(Push)
*************** */
// 「Line」シートの「A2」のテキストを、全員に送信する
function sendStaticMessageToAll(){
var message = sheet.getRange("A2").getValue();
sendMessageToAll(message)
}
// 登録されている人全員に送信する
function sendMessageToAll(message) {
// userIdをすべて取得する
var sheet = SpreadsheetApp.getActive().getSheetByName('LineUsers')
var userIdsArray = sheet.getRange(2, 4, sheet.getLastRow() - 1, 1) // D2:Dx
var userIds = userIdsArray.getValues() // [['aaaaa'],['bbbbb'],['ccccc']]
// 各userIdに対してメッセージを送信していく
for(var i = 0; i < userIds.length; i++) {
userId = userIds[i][0]
pushLine(message, userId)
}
}
// Lineに「投稿」する
function pushLine(message, user_id){
// メッセージ「送信」用のAPI URL
var url = 'https://api.line.me/v2/bot/message/push';
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'to': user_id,
'messages': [{
'type': 'text',
'text': message,
}],
}),
});
}
/* ***************
30: その他の関数
*************** */
/* Line系 */
// ユーザーの情報をLineAPIで取得し、SpreadSheetに保存する
function stockUserData(userId){
var url = 'https://api.line.me/v2/bot/profile/' + userId;
var response = UrlFetchApp.fetch(url,{
'headers': {
'Authorization' : 'Bearer ' + ACCESS_TOKEN,
}
})
var userData = JSON.parse(response)
// APIから得られた情報から、要素を抽出
var name = userData.displayName
var pictureUrl = userData.pictureUrl
var statusMessage = userData.statusMessage
// シートに出力する
var sheet = SpreadsheetApp.getActive().getSheetByName('LineUsers')
var range = sheet.getRange(sheet.getLastRow() + 1, 2, 1, 3) // Bx:Dx
range.setValues([[name, pictureUrl, userId]])
}