要建立 LINE 聊天機器人,必須建立 LINE 官方帳號,也就是代表該機器人的帳號。有了官方帳號後,就可以設計後端程式透過 LINE Messaging API 被動回應使用者訊息或是主動發送推播訊息:
被動回覆訊息:這是由使用者發送訊息給官方帳號,再由後端程式接收後以官方帳號身分回覆給使用者。我們必須建立能讓官方帳號與後端程式互傳資料的通道(channel),才能讓訊息在兩者之間往返。
主動發送推播訊息:由我們的程式以 LINE 官方帳號身分直接傳送訊息給使用者或群組,這需要透過使用者的 LINE User Id 或是群組的 LINE group Id(這跟加聯絡人時看到的 LINE Id 是不一樣的東西)指定傳傳送對象。
首先就來建立讓 LINE 官方帳號與後端程式互傳資料的通道,建立的過程中就會連帶建立官方帳號,也就是代表聊天機器人的帳號。請依照以下步驟進行:
請先連至 LINE 開發者網站 - https://developers.line.biz/en/
按網頁右上角的 Log in
你可以使用原本的 LINE 帳號登入,或者是按底下的建立帳號建立獨立的商用帳號,請自行選擇後登入
輸入綁定 LINE 的電子郵件帳號密碼登入,或者透過行動條碼登入
打開 LINE APP,掃描 QR code,輸入驗證碼登入
首次登入 LINE 開發者網頁會要求填入基本資料,這裡的資料和你的 LINE 帳號是分開的,可以自由填寫
請填入後勾選同意授權條款,再按 Create my accout 建立帳號
登入 LINE 開發者網站後第一步就是要建立 provider,你可以把商用帳號視為一個組織,組織下可能分為不同部門或開發者,而 provider 就代表單一部門或是某位開發者
請鍵入自訂的名稱後按 Create 完成
建立好 provider 後會要求你建立 Messaging API channel,這就是建立可用於 Messaging API 讓官方帳號與後端程式互傳資料的通道,請在剛剛建立好的 provider 總覽頁面中按 Create a Messaging API channel
建立 Messaging API Channel 的第一步就是建立 LINE 官方帳號 ,這個步驟要在官方帳號專屬的頁面進行,請按 Create a LINE Official Account 開啟頁面
按登入後繼續
首次建立 LINE 官方帳號會需要手機簡訊認證,請按進行簡訊認證
輸入電話號碼後按傳送簡訊,這裡的電話號碼不需要是你的 LINE 帳號綁定的電話號碼,只要是可以接收簡訊即可
收到簡訊後輸入認證碼按認證完成
再按返回服務即可
接著就要設定 LINE 官方帳號的資訊,其中公司名稱可以不填,業種請自行選取
再按完成即可
我們只是要利用這個官方帳號傳送訊息的功能,並沒有要用來推廣業務,可以先略過認證帳號的步驟,請直接按稍後進行認證
略過加入將剛剛建立的官方帳號加入你的 LINE 好友的步驟,稍後會手動完成。按前往主頁進行設定
幫你的官方帳號建立頭像,可以按一下左上方的頭像
你可以把設計好的頭像圖檔拖放進來,沒有設定頭像也沒有關係,並不影響功能
啟用剛剛所建立官方帳號的 Messaging API 功能,這樣才能讓這個官方帳號與稍後要建立的後端程式互動
進入設定頁面,按左側邊欄的 Messaging API 後再按一下右邊的啟用 Messaging API
完成後回到 LINE 開發者頁面進一步設定剛剛建立好的 Messaging API channel
切換到 Messaging API 頁籤,可以看到這個官方帳號的 LINE ID(@044tugny),請利用這個 ID 將它加入你的 LINE 好友,或者也可以用手機掃底下的 QR code
Bot basic ID:@044tugny
手機加入機器人後會看到如下的歡迎畫面
往下捲找到 LINE Official Account features 區段
按一下 Auto-reply messages 右側的 Edit,會開啟新的設定頁面,關閉自動回應功能,否則每次收到使用者的訊息時 LINE 都會自動幫我們回應不必要的罐頭訊息。
按一下 Allow bot to join group chats 右側的 Edit,同樣會開啟新的設定頁面。開啟加入群組的設定,否則官方帳號無法加入群組
回到 LINE 開發者頁面,重新整理頁面,確認剛剛的設定都生效
往下找到 Channel access token 區段,按Issue產生存取令牌
這個存取令牌是稍後要建立的後端程式使用 Messaging API 發送訊息的通行證,將其記錄下來
Channel access token:
2eOFRL3HbtynSELtUieqUzPPbUYUbDeSSlFdbrxI5fDC9VAWmuAfS6djoEiyHheU7yoMY92APUMLsQxIpjLjBSS//TmRzBnsoOo1KiiHLXdJySyTPK3C84rA+b/kNdIGvrT0VGH63+NcurLGapeg6gdB04t89/1O/w1cDnyilFU=
後端程式基本上就是一個網站,每次官方帳號收到使用者送來的訊息時,就會連往後端程式,把訊息轉送過去。當後端程式需要回覆訊息時,就必須以剛剛看到的存取令牌作為通行許可證明,將訊息送到 LINE 的伺服器,由 LINE 轉送訊息給使用者。
由於後端程式必須是一個公開在網路上的網站,為了省去自行架設網站的麻煩,我們採用 Goolge 的 Apps Script 服務快速架設網站。(範本)
// 存取使用者(每個使用者獨立)的屬性
var userProperties = PropertiesService.getUserProperties();
// 存取這個 script(在專案設定中)的屬性
var scriptProperties = PropertiesService.getScriptProperties();
// LINE 官方帳號的存取令牌
var accessToken = scriptProperties.getProperty("line_channel_access_token");
// LINE Messaging API 網址
var messagingAPIVBaseURL = 'https://api.line.me/v2/bot/message/';
var replyURL = messagingAPIVBaseURL + 'reply';
var pushURL = messagingAPIVBaseURL + 'push';
// 教用 LINE Messaging API
function callMessagingAPI(apiURL, messages) {
UrlFetchApp.fetch(apiURL, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + accessToken.trim(),
},
'method': 'post',
'payload': JSON.stringify(messages),
});
}
// 加入文字到訊息中
function addTextMessage(messages, txt) {
messages.messages.push({
'type': 'text',
'text': txt,
});
}
// 加入貼圖到訊息中
function addSticker(messages, packageId, stickerId) {
messages.messages.push({
'type': 'sticker',
"packageId": packageId,
"stickerId": stickerId
});
}
// 加入圖片到訊息中
function addImage(messages, imgURL) {
messages.messages.push({
"type": "image",
"originalContentUrl": imgURL,
"previewImageUrl": imgURL
});
}
// 傳送訊息給指定的使用者
// 查詢字串參數:
// id: LINE 使用者的識別碼(不是 LINE ID 喔)
// t: 文字訊息
// pid: 貼圖的套件識別碼
// sid: 貼圖的識別碼
// img: 圖片的網址
function doGet(e){
var userId = e.parameter.to;
if (!userId) return;
var messages = {
'to': userId,
'messages': [],
}
var txt = e.parameter.t;
if (txt) addTextMessage(messages, txt);
var packageId = e.parameter.pid;
var stickerId = e.parameter.sid;
if(packageId && stickerId) addSticker(messages, packageId, stickerId);
var imgURL = e.parameter.img;
if (imgURL) addImage(messages, imgURL);
var returnText;
if (messages.messages.length > 0) {
callMessagingAPI(pushURL, messages);
returnText = 'OK Push message sent.';
}
else
returnText = 'ERROR No content';
// 原本傳回 TextOutput 物件,但受限於 Apps Script 的安全考量,會以重新導向的方式傳回
// 雖然 MicroPython 的 requests 支援重新導向,但是在 1.24.0 的實作中重新導向時會沿用原網址的主機
// 但 Apps Script 重新導向的網址主機卻和原始網址的主機不同,導致回應 404
// 因此這裡改成傳回 HTMLOutput 物件,就不會重新導向了
// var textOutput = ContentService.createTextOutput(returnText)
var htmlOutput = HtmlService.createHtmlOutput('<b>' + returnText + '</b>');
// return textOutput;
return htmlOutput;
}
// 回覆使用者 ID
function doPost(e) {
var msg = JSON.parse(e.postData.contents);
var replyToken = msg.events[0].replyToken;
// var userMessage = msg.events[0].message.text;
var messages = {
'replyToken': replyToken,
'messages': [],
}
var id = msg.events[0].source.userId;
if ("groupId" in msg.events[0].source)
id = msg.events[0].source.groupId;
else if ("roomId" in msg.events[0].source)
id = msg.events[0].source.roomId;
addTextMessage(messages, "Id:" + id);
callMessagingAPI(replyURL, messages);
}
按專案名稱處可以更改名稱
按左側的專案設定 > 往下捲找到指令碼屬性區段後按新增指令碼屬性
在屬性欄位填入名稱 "line_channel_access_token",值欄位填入剛剛在 LINE 開發者網頁生成的存取令牌後按儲存指令碼屬性完成。
後端程式會在需要的時候從這裡讀取存取令牌,如此可以避免將存取令牌揭露在程式碼中。指令碼屬性是跟著帳戶,所以即使享專案給別人時,也不會把指令碼屬性一併分享,非常安全。