前言...要做一個 LINE 點名機器人
最近很多人想做 LINE 的自動化,特別是點名、簽到這種。網路上查了一下,發現教學文很多,但好像...嗯...有點複雜。要嘛是直接推薦你用付費平台,點一點很方便,但細節都包起來了,你不知道它怎麼動的。要嘛就是直接給你一堆程式碼,對新手來說,可能光是看到就想關掉了。
我自己是覺得,如果只是要一個簡單的、群組裡喊「簽到」然後自動記錄到表單的功能,應該可以有更單純的方法。特別是完全免費的。所以,這篇筆記,算是記錄一下我自己摸索的過程。目標是,用大家都有的 Google 帳號,搭配 LINE,大概花個...嗯,號稱 5 分鐘,實際上可能要個 10 分鐘吧,把這個功能做出來。
這個方法會用到 Google Apps Script,聽起來很像程式,但別怕,大部分是複製貼上。重點是理解它每一步在幹嘛,而不是真的要從頭寫。這方法的好處是,完全免費,而且因為是你自己做的,所以資料都抓在自己手上,很安心。
為什麼不直接用現成的服務就好?
這個問題很好,說真的,如果你的需求很複雜,或者你是店家要管會員,用現成的服務,像是 BotBonnie 或 GOSU PARTY 那些,絕對比較快,功能也強大。 但...有幾個點可以想一下。
第一是錢。雖然很多服務有免費方案,但通常訊息量或好友數一多,就要收費了。 以 LINE Messaging API 自己的計價方式來看,免費方案一個月也只有 500 則訊息,如果你的群組有 50 個人,大家喊個幾次就爆了。 自己用 Google Apps Script 做,基本上沒有這個煩惱。
第二是學習。用現成的服務,你學會的是「操作那個服務的後台」。但如果自己走一遍流程,你會大概知道 API、Webhook 這些東西是怎麼一回事。 以後想做點別的應用,腦袋裡才會有個底。就好像,買組合櫃很方便,但自己動手做過一個,以後看到木材大概就知道能怎麼拼。
所以,我自己是覺得,如果只是內部團隊、小社團要用,或是單純想學點新東西,那自己動手做絕對是個好選擇。
怎麼做?一步一步來
好,我們開始。整個過程,就像是讓 LINE(店員)、Google Apps Script(總機)、Google Sheets(紀錄本)三個東西學會互相溝通。
第一步:去 LINE Developers 申請一個機器人帳號
這一步的目標是拿到兩樣東西:一個是機器人的「身份證」,另一個是跟它溝通的「密碼」。
- 首先,你需要一個 LINE 帳號,然後去 LINE Developers Console 網站。用你的 LINE 登入。
- 登入後,你會看到建立「Provider」(供應商)的按鈕。你可以把它想像成是「機器人開發公司」,就填你自己的名字或團隊名就好。
- 有了 Provider 之後,在裡面建立一個新的 Channel,選擇「Messaging API」。
- 接著要填機器人的基本資料,像是頭像、名字。名字可以取「點名小幫手」之類的。最重要的,「方案」請選「Developer Trial」或「Free」,基本上免費方案就夠用了。
- 建立好之後,點進你的機器人頻道,找到「Messaging API」這個頁籤。裡面有兩個最重要的東西,先把它們找個地方貼起來:
- Channel access token (long-lived):這就是我說的「密碼」。等一下我們的程式要跟 LINE 溝通,就要靠它。點一下「Issue」按鈕就會產生。
- Webhook URL:這個欄位現在先空著,但要記得它在哪。它就像是我們要告訴 LINE 的「總機電話號碼」。 當有人傳訊息給機器人時,LINE 就會打這支電話。
到這邊,我們等於是已經生出一個機器人了,只是它現在還笨笨的,什麼都不會。
第二步:建立一個 Google Sheet 當作我們的資料庫
接下來,我們要準備一個地方來存誰簽到了。Google Sheets (試算表) 是最方便的選擇。
- 打開你的 Google 雲端硬碟,新增一個「Google 試算表」。
- 幫它取個名字,例如「LINE 點名紀錄」。
- 在第一列,建立幾個欄位標題,用來記錄資訊。最基本的可以有:
Timestamp(簽到時間),UserID(簽到的人是誰),DisplayName(他的 LINE 名字),Message(他傳了什麼訊息)。
就這樣。這個試算表現在是空的,等一下程式會自動把資料填進來。
第三步:寫一點點 Google Apps Script 程式碼
這是最核心的一步,但也是複製貼上最多的一步。我們要寫一個小程式,擔任「總機」的角色。
- 回到剛剛那個 Google 試算表,點選頂端選單的「擴充功能」 > 「Apps Script」。
- 你會進到一個寫程式的畫面。把裡面原本的程式碼都刪掉,然後把下面的程式碼完整貼上去。
function doPost(e) {
// 解析 LINE 傳來的資料
var event = JSON.parse(e.postData.contents).events;
var replyToken = event.replyToken;
var messageText = event.message.text;
var userId = event.source.userId;
var timestamp = new Date(event.timestamp);
// 如果訊息不是「簽到」,就什麼都不做
if (messageText.trim().toLowerCase() !== '簽到') {
return;
}
// 取得使用者名稱
var userName = getUserDisplayName(userId);
// 把資料寫進 Google Sheet
// ***注意:這裡要換成你自己的試算表網址跟工作表名稱***
var sheet = SpreadsheetApp.openByUrl("【你的 Google Sheet 網址】").getSheetByName("工作表1");
sheet.appendRow([timestamp, userId, userName, messageText]);
// (選用) 回覆一個簡單的訊息告訴使用者成功了
// 如果不想回覆,可以把下面這段刪掉
replyMessage(replyToken, "簽到成功!");
}
function getUserDisplayName(userId) {
// ***注意:這裡要換成你自己的 Channel Access Token***
var channelAccessToken = "【你的 Channel Access Token】";
var url = "https://api.line.me/v2/bot/profile/" + userId;
var response = UrlFetchApp.fetch(url, {
"headers": {
"Authorization": "Bearer " + channelAccessToken
}
});
return JSON.parse(response.getContentText()).displayName;
}
function replyMessage(replyToken, message) {
// ***注意:這裡要換成你自己的 Channel Access Token***
var channelAccessToken = "【你的 Channel Access Token】";
var url = "https://api.line.me/v2/bot/message/reply";
UrlFetchApp.fetch(url, {
"method": "post",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer " + channelAccessToken
},
"payload": JSON.stringify({
"replyToken": replyToken,
"messages": [{
"type": "text",
"text": message
}]
})
});
}
貼上去之後,有兩個地方絕對要修改:
【你的 Google Sheet 網址】:換成你第二步建立的那個試算表的完整網址。【你的 Channel Access Token】:換成你第一步從 LINE Developers Console 拿到的那串長長的密碼。程式碼裡面有兩處要改,都要改。
這段程式碼的意思很簡單:當 LINE 打電話來 (doPost),它會看一下訊息是不是「簽到」,如果是,就去問 LINE 這個人叫什麼名字,然後把時間、ID、名字、訊息寫進我們的 Google Sheet 紀錄本。 最後再回覆一句「簽到成功!」。
第四步:把所有東西連起來
最後一步,就是告訴 LINE 我們總機的電話號碼。
- 在 Google Apps Script 編輯器頁面,點右上角的「部署」 > 「新增部署作業」。
- 在「選取類型」那邊,選擇「網頁應用程式」。
- 在「誰可以存取」的選項,一定要改成「所有人」。 這是因為 LINE 的伺服器是「任何人」,如果沒開放,它就打不進來。
- 點下「部署」。它會給你一串「網頁應用程式」的網址。這就是我們的總機電話號碼,把它複製下來。
- 回到你第一步打開的 LINE Developers Console 頁面,找到「Messaging API」頁籤裡的「Webhook URL」欄位。把剛剛複製的網址貼進去,然後按下「Update」或「更新」。
- 最後,記得把下面的「Use webhook」或「使用 Webhook」這個開關打開。
好了,大功告成!現在可以把你的機器人加到 LINE 群組裡,然後試著打「簽到」看看。如果一切順利,你的 Google Sheet 裡應該就會出現一筆新的紀錄了。如果不成功,八成是 Token 或網址貼錯,或是權限沒開對。
這方法跟付費平台差在哪?
說了這麼多,這個 DIY 的方法跟市面上的服務到底差在哪裡?簡單整理一下。
| 項目 | DIY (Google Apps Script) | 付費平台 (No-Code) |
|---|---|---|
| 成本 | 幾乎是零。只要你不超過 Google 和 LINE 的超高用量限制,就都是免費的。 | 有免費方案,但功能和訊息量受限。進階功能或高用量通常要月費。 |
| 設定難度 | 需要複製貼上程式碼,還要到不同後台設定。第一次可能會有點卡。 | 很低。通常是圖形化介面,用滑鼠點一點、拉一拉就好。 |
| 彈性 / 擴充性 | 超高。只要你懂一點程式,想加什麼功能都可以,例如統計人數、自動回覆不同內容等等。 | 受限於平台提供的功能。如果平台沒做,你就沒辦法用。 |
| 維護 | 基本上是「設後不理」,但如果 LINE 或 Google 改了 API,可能需要自己回來修改程式碼。 | 平台會負責維護。你什麼都不用管。 |
總結...還有一些限制
所以,這個方法,我自己覺得,很適合那種「一次性」或「內部使用」的需求。例如公司部門要登記下午茶、讀書會要點名、朋友揪團...等等。它的好處就是免費、彈性大,而且資料掌握在自己手上。
不過它也有很明顯的限制。第一,它很陽春,沒有漂亮的按鈕或圖文選單。第二,如果同時有一大堆人傳訊息,Google Apps Script 可能會反應不過來,造成漏單或延遲。第三,它沒什麼防呆機制,如果有人打錯字,例如打成「簽道」,那機器人就不會理他。
NP_ANS_END但無論如何,走過這一遍,至少對 LINE Bot 的運作原理會有個基本的認識。以後再看到相關的應用,也比較能想像背後是怎麼實現的。這大概是最大的收穫吧。
換你試試看
你還希望這個機器人有什麼功能?像是自動回覆「[某某某] 簽到成功!」還是可以輸入「名單」就吐出目前的簽到總人數?在下面留言分享看看你的想法吧!
