這邊主要是想補充其他前輩們,沒有教齊全的「入門篇」
所以先去右邊的連結學好入門吧!教得很清楚,但居然沒有後續教學! 實作 LINE 聊天機器人 ( Google Apps Script )
我覺得很可惜,因為這個方式不會耗我們的本地端資源,全在雲端處理就好了!不然架伺服器、開實體IP、開服務,這樣超級麻煩Der!
下面的碼是目前研究的進度,所以還在研究中,現在有點懶,有心情的時候會再回來把教學弄友善一點。
上面連結的入門已經會了之後,我又參考了別人的碼,先不解釋下面的功能是什麼,
全部複製進xxxxx.gs裡面,把所有的channelToken換成自己的就能跑了,先跑看看再修改成自己的,我的碼寫的沒有很乾淨,但有點基礎的人應該是看得懂。
含有基本各種的回應、也有實驗的碼、Flex訊息的傳送方式(GS的寫法我找超久!結果官方文件裡有,放在不是很明顯的地方,所以我是第一個非官方範例)
// 回覆訊息
function replyMsg(replyToken, messageType, messageText, channelToken, sourceId, packageId, stickerId) {
var url = 'https://api.line.me/v2/bot/message/reply';
switch (messageType) {
case 'text':
if (messageText == 'text share' | messageText == '文字分享' ) {
var opt = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + channelToken,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{'type': 'text',
"text": "810快樂天堂(暫名) 懶人包下載點\nhttps://drive.google.com/uc?authuser=0&id=1TFyDJCP96LMQ2ICykzGZbizr2_p87Wf-&export=download\n\n(口耳相傳不廣告,收集玩家中,達150人正式開服、開放贊助)"
}]
})
};
}
else if (messageText == 'share'| messageText == '分享') {
var opt = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + channelToken,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
"type": "flex",
"altText": "this is a flex message",
"contents": {
"type": "bubble",
"header": {
"type": "box",
"layout": "horizontal",
"contents": [
{
"type": "text",
"text": "【仿正】810快樂天堂(集眾階段暫名)",
"weight": "bold",
"size": "sm",
"color": "#AAAAAA",
"contents": []
}
]
},
"hero": {
"type": "image",
"url": "https://drive.google.com/uc?authuser=0&id=1DNdd-Yn-LTaZhG_I4B4ji8MXxPfCt5v5&export=download",
"size": "full",
"aspectRatio": "20:13",
"aspectMode": "cover",
"action": {
"type": "uri",
"label": "Action",
"uri": "https://linecorp.com/"
}
},
"body": {
"type": "box",
"layout": "horizontal",
"spacing": "md",
"contents": [
{
"type": "box",
"layout": "vertical",
"flex": 2,
"contents": [
{
"type": "text",
"text": "打造喜歡的天堂 (階段一:找齊朋友)",
"weight": "bold",
"size": "md",
"wrap": true,
"contents": []
},
{
"type": "box",
"layout": "baseline",
"margin": "md",
"contents": [
{
"type": "icon",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/review_gold_star_28.png"
},
{
"type": "icon",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/review_gold_star_28.png"
},
{
"type": "icon",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/review_gold_star_28.png"
},
{
"type": "icon",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/review_gold_star_28.png"
},
{
"type": "icon",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/review_gold_star_28.png"
},
{
"type": "text",
"text": "5.0",
"color": "#999999",
"margin": "md",
"contents": []
}
]
},
{
"type": "text",
"text": "口耳相傳 不廣告",
"size": "md",
"flex": 1,
"align": "center",
"gravity": "top",
"contents": []
},
{
"type": "separator"
},
{
"type": "text",
"text": "收集玩家中 目標150人",
"size": "md",
"flex": 2,
"align": "center",
"gravity": "center",
"contents": []
},
{
"type": "separator"
},
{
"type": "text",
"text": "目標達成:正式開服、開放贊助",
"size": "md",
"flex": 2,
"align": "center",
"gravity": "center",
"contents": []
},
{
"type": "separator"
},
{
"type": "text",
"text": "好的環境共同打造",
"size": "md",
"flex": 1,
"align": "center",
"gravity": "bottom",
"contents": []
}
]
}
]
},
"footer": {
"type": "box",
"layout": "horizontal",
"contents": [
{
"type": "button",
"action": {
"type": "uri",
"label": "下載懶人包",
"uri": "https://drive.google.com/uc?authuser=0&id=1TFyDJCP96LMQ2ICykzGZbizr2_p87Wf-&export=download"
}
},
{
"type": "button",
"action": {
"type": "message",
"label": "分享本社群",
"text": "(請分享此訊息給您的好友)邀請您加入「150人就開服開贊助-仿正玩家交易區」! https://line.me/ti/g2/rp5X1qUk-lEvq2MWupyilA?utm_source=inv"
}
}
]
}
}
}
]
})
};
}
else if (messageText == 'error') {
/*
var opt = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + channelToken,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{'type': 'text', 'text': '母湯喔!'}]
})
};
*/
}
else {
/*
var opt = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + channelToken,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{'type': 'text',
'text': messageText
}]
})
};
*/
}
break;
case 'image':
pushMsg(channelToken, '圖片唷', sourceId);
break;
case 'video':
pushMsg(channelToken, '影片唷', sourceId);
break;
case 'audio':
pushMsg(channelToken, '聲音唷', sourceId);
break;
case 'location':
pushMsg(channelToken, '地點唷', sourceId);
break;
case 'sticker':
try{
var opt = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + channelToken,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{'type': 'sticker', packageId: '1', stickerId: '5'}]
})
};
}
catch(ex) {
console.log(ex);
var channelToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
var msg = JSON.parse(e.postData.contents);
var replyToken = msg.events[0].replyToken;
replyMsg(replyToken,'text', '123', channelToken,0,0,0)
}
break;
default:
pushMsg(channelToken, '什麼都沒有喔', sourceId);
break;
}
UrlFetchApp.fetch(url, opt);
}
// 發送訊息
function pushMsg(channelToken, message, usrId) {
var url = 'https://api.line.me/v2/bot/message/push';
var opt = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + channelToken,
},
'method': 'post',
'payload': JSON.stringify({
'to': usrId,
'messages': [{'type': 'text', 'text': message}]
})
};
UrlFetchApp.fetch(url, opt);
}
// e 是Line 給我們的資料
function doPost(e) {
var channelToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
var msg = JSON.parse(e.postData.contents);
console.log("info:" + e.postData.contents);
var LineHelpers = (function (helpers) {
"use strict";
helpers.getSourceId = function (source) {
try {
switch (source.type) {
case 'user':
return source.userId;
break;
case 'group':
return source.groupId;
break;
case 'room':
return source.roomId;
break;
default:
console.log('LineHelpers, getSourceId, invalid source type!');
break;
}
} catch (ex) {
console.log('LineHelpers, getSourceId, ex = ' + ex);
var channelToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
var msg = JSON.parse(e.postData.contents);
var replyToken = msg.events[0].replyToken;
replyMsg(replyToken,'text', 'LineHelpers錯誤:'+ex, channelToken,0,0,0)
}
};
return helpers;
})(LineHelpers || {});
try {
var events = msg.events;
if (events != null) {
for (var i in events) {
var event = events[i];
var type = event.type;
var replyToken = msg.events[i].replyToken; // 要回復訊息 reToken
var packageId = msg.events[i].message.packageId;
var stickerId = msg.events[i].message.stickerId;
var messageType = event.message.type;
var messageId = event.message.id;
var sourceType = event.source.type;
var sourceId = LineHelpers.getSourceId(event.source);
//var userId = event.source.userId; // 取得個人userId
//var groupId = event.source.groupId; // 取得群組Id
//var timeStamp = event.timestamp;
var messageText = msg.events[i].message.text; // 使用者Message字串
switch (type) {
case 'postback':
break;
case 'message':
replyMsg(replyToken,messageType, messageText, channelToken, sourceId, packageId, stickerId);
break;
case 'join':
pushMsg(channelToken, '我是IM Bot!Hello!', sourceId);
break;
case 'leave':
pushMsg(channelToken, 'Good Bye!', sourceId);
break;
case 'memberLeft':
pushMsg(channelToken, '我是IM Bot!Bye!', sourceId);
break;
case 'memberJoined':
pushMsg(channelToken, '我是IM Bot!Hello~', sourceId);
break;
case 'follow':
pushMsg(channelToken, 'Hello!', sourceId);
break;
case 'unfollow':
pushMsg(channelToken, 'Bye bye!', sourceId);
break;
default:
pushMsg(channelToken, '123', sourceId);
break;
}
}
}
} catch(ex) {
console.log(ex);
var channelToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
var msg = JSON.parse(e.postData.contents);
var replyToken = msg.events[0].replyToken;
replyMsg(replyToken,'text', 'error', channelToken,0,0,0)
}
}