-
LINE Official Accountを作成 (今回は初級編で利用したものを使用)
-
プロバイダーとのチャンネルをつくる (オプショナルは無視してOK) プロバイダー: LINEのプラットフォームを利用してサービスを提供しようとしている主体
チャンネル: プロバイダーとLINEのプラットフォームをつなぐシステム
function doPost(e){
let sheet = SpreadsheetApp.getActive().getActiveSheet();
sheet.appendRow([new Date(), e.postData.contents]);
// e.postData.contents に LINE からの json 形式データがある
}
-
Official Account ManagerのSettings > Messaging APIにあるWebhook URLにペーストして保存
-
LINE Devlopersコンソール > プロバイダー > 該当するチャンネル > Messaging APIからQRコードをスマホのLINEでスキャンしてテキストを送ってみる or 検証ボタンを押す
-
スプレッドシートにタイムスタンプと長いテキストが来てたら成功
今回はテキストが送られるというイベントでWebhookが作動しましたが、それ以外のイベントはこちらを見てみてください
- HTTPリクエストで来た長いテキストを確認 JSONオブジェクトはこんな感じ (詳しくはこちら)
{
"destination":"U********************",
"events":[
{
"type":"message",
"message":{
"type":"text",
"id":"4**************",
"quoteToken":"a***********************************************",
"text":"ちゃんとGASに送れてるかなー"
},
"webhookEventId":"01*********************",
"deliveryContext":{
"isRedelivery":false
},
"timestamp":1710674716872,
"source":{
"type":"user",
"userId":"U********************************"
},
"replyToken":"d*******************************",
"mode":"active"
}
]
}
doPost()
に色々な機能をつけていきます。
今までのコードはもう使わなくてOKです (コメントアウトしちゃう)。
- JSON stringをJavascriptのオブジェクトに変換
function doPost(e) {
let parsed = JSON.parse(e.postData.contents);
}
- 後で使う情報を
parsed
から取り出す
function getContents(data) {
let events = data.events;
for(let i = 0; i < events.length; i++) {
let event = events[i];
if(event.type == 'message'){
if(event.message.type == 'text'){
let texts = event.message.text;
return {event, texts}
}
}
}
}
doPost()
を更新
function doPost(e) {
let parsed = JSON.parse(e.postData.contents);
let contents = getContents(parsed); // 追加
let conEvent = contents.event; // 追加
let conTexts = contents.texts; // 追加
}
conEvent
: あとでトークンを取り出すためのもの
conTexts
: 次のステップで遊んでLINEに送り返すテキスト
conTexts
を反転する (別に他のことやってもいいよ〜)
function reverseChars(s) {
let ums = s;
ms = ums.split('').reverse().join('');
return ms
}
またdoPost()
を更新
function doPost(e) {
let parsed = JSON.parse(e.postData.contents);
let contents = getContents(parsed);
let conEvent = contents.event;
let conTexts = contents.texts;
let replyMes = reverseChars(conTexts); // 追加
}
- 返信する
messages
にreplyToken
をつける (replyMesToken
はあとでHTTP POSTする時のbody
になる)
function addReplyToken(event, repTexts) {
let repToken = event.replyToken;
let replyMesToken = {
replyToken: repToken,
messages: [{ type: 'text', text: repTexts }],
};
return replyMesToken
}
はいdoPost()
を更新
function doPost(e) {
let parsed = JSON.parse(e.postData.contents);
let contents = getContents(parsed);
let conEvent = contents.event;
let conTexts = contents.texts;
let replyMes = reverseChars(conTexts);
let repTokenAdded = addReplyToken(conEvent, replyMes); // 追加
}
- LINEプラットフォームに送信する (詳しくはこちら)
function reply(contents){
let channelAccessToken = "下の画像で得るトークンをペースト";
let replyUrl = "https://api.line.me/v2/bot/message/reply";
let options = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + channelAccessToken
},
payload: JSON.stringify(contents)
};
UrlFetchApp.fetch(replyUrl, options);
}
送信に必要なチャンネルアクセストークンを発行しコピーペースト (LINE Devlopersコンソール > プロバイダー > 該当するチャンネル > Messaging APIから一番下までスクロール)
doPost()
を更新〜
function doPost(e) {
let parsed = JSON.parse(e.postData.contents);
let contents = getContents(parsed);
let conEvent = contents.event;
let conTexts = contents.texts;
let replyMes = reverseChars(conTexts);
let repTokenAdded = addReplyToken(conEvent, replyMes);
reply(repTokenAdded); // 追加
}
function doPost(e) {
// let sheet = SpreadsheetApp.getActive().getActiveSheet();
let parsed = JSON.parse(e.postData.contents);
let contents = getContents(parsed);
let conEvent = contents.event;
let conTexts = contents.texts;
let replyMes = reverseChars(conTexts);
let repTokenAdded = addReplyToken(conEvent, replyMes);
reply(repTokenAdded);
// sheet.appendRow([new Date(),JSON.stringify(repTokenAdded)]);
}
function getContents(data) {
let events = data.events;
for(let i = 0; i < events.length; i++) {
let event = events[i];
if(event.type == 'message'){
if(event.message.type == 'text'){
let texts = event.message.text;
return {event, texts}
}
}
}
}
function reverseChars(s) {
let ums = s;
ms = ums.split('').reverse().join('');
return ms
}
function addReplyToken(event, repTexts) {
let repToken = event.replyToken;
let replyMesToken = {
replyToken: repToken,
messages: [{ type: 'text', text: repTexts }],
};
return replyMesToken
}
function reply(contents){
let channelAccessToken = "チャンネルアクセストークン";
let replyUrl = "https://api.line.me/v2/bot/message/reply";
let options = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + channelAccessToken
},
payload: JSON.stringify(contents)
};
UrlFetchApp.fetch(replyUrl, options);
}
-
デプロイしたらWeb app URLをコピーしてOfficial Account ManagerのSettings > Messaging APIにあるWebhook URLにペーストして保存 GASアプリのURLはデプロイするごとに変わってしまうので新しくWebhookに登録する必要がある...がもしURLをそのままにできる方法があれば知りたいっす
-
LINEからメッセージを送ってみる
どうでしたか?自分が送信したテキストが逆から書かれて返信されましたか?
LINE_chatbot_demo.mov
終わり
神戸大学国際人間科学部の学部共通科目「プログラミング基礎演習1・2」より「Google Apps Script で LINE Bot を作成する」
LINE Developersより「Messaging APIを始めよう」