今天…嗯,來聊聊 LINE Bot 好了。很多人想做,但好像常常卡在一些很基本的地方。網路上教學很多,但都寫得很急,好像假設你什麼都會了。我想慢慢講,從頭開始,把一些沒人提的細節講清楚。
一句話結論
做一個 LINE Bot,其實就是去 LINE Developers 網站申請一個「頻道」(Channel),拿到兩把「鑰匙」(Channel Secret 跟 Channel Access Token),然後寫一支程式,放在一個有公開網址的地方 (Webhook URL),LINE 就能在收到訊息時,用那兩把鑰匙來跟你寫的程式溝通。
在開始之前,先想一下...
大部分教學都直接跳到步驟一二三。但我覺得,更重要的是,為什麼要做?還有,錢的問題。
你想做的,是單純好玩,讓朋友在群組裡可以用指令查東西?還是想做一個客服機器人,幫你的小生意自動回覆客人問題? 這兩種情況,複雜度和成本完全不同。
LINE 的 Messaging API 有免費額度,但那個額度…說真的,很少。 官方把這個叫做「溝通方案」(Communication Plan),免費的方案一個月只有少量免費訊息。 如果你的機器人只是自己跟幾個朋友玩,那絕對夠用。但如果是要商用,好友一多,隨便一個群發就爆了。 超過額度,訊息就發不出去,除非你升級付費方案。 這點一開始就要想清楚,不然做到一半才發現要花錢,感覺會很差。
好,那我們開始吧:帳號申請
嗯,這部分比較制式,但有些小地方還是要注意。
首先,你要去 LINE Developers Console。 用你自己的 LINE 帳號登入就可以了。
- 建立 Provider:登入後第一件事是建立一個 "Provider"。 你可以把它想像成一個公司或開發團隊的名稱。 雖然這個名字使用者看不到,只在後台管理用,但還是取個有意義的吧。
- 建立 Channel:在 Provider 底下,我們要建立一個 "Channel"。 這裡要選「Messaging API」。 這一步會要求你填很多資料,像是機器人的頭像、名稱、介紹等等。 這些是會顯示給使用者看的,所以要認真填。
- 同意條款:最後會有一堆使用者條款,要勾選同意才能建立。
完成之後,你就擁有一個 LINE Bot 的「頻道」了。 不過它現在還什麼都不會,像個空殼子。
串接 API 的關鍵:Webhook 跟 Token
接下來是整個過程最核心,也最容易卡關的地方。剛剛我們拿到一個空殼,現在要告訴這個空殼,當有人跟它說話時,它該去哪裡找「大腦」來回應。這個「大腦」就是我們自己寫的程式。
這裡有三個關鍵字:
- Channel Secret:這是一把鑰匙,用來驗證從 LINE 平台傳過來的請求,是不是真的來自 LINE,而不是有人偽造的。 你可以在後台的 "Basic settings" 頁面找到它。
- Channel Access Token:這是另一把鑰匙。當你的程式要主動傳訊息給使用者時,需要用這把鑰匙來跟 LINE 平台證明「我是這個 Bot 本人」。 你可以在 "Messaging API" 頁籤裡找到它,通常需要按一個 "Issue" 或 "Reissue" 的按鈕才會產生。
- Webhook URL:這是一個網址。 它的作用是告訴 LINE:「嘿,只要有使用者傳訊息給我的 Bot,你就把訊息內容用 POST 的方式,送到這個網址來。」 這個網址必須是 `https` 開頭,也就是說,它必須是一個安全的連線。
嗯… Webhook 這裡最麻煩。因為我們開發程式通常是在自己的電腦 (localhost) 上,本機是沒有公開、安全的 https 網址的。所以 LINE 根本找不到你的電腦。怎麼辦?
這時候就需要一個叫做 `ngrok` 的工具。 `ngrok` 能做的事情很單純:它會在你的電腦上開一個安全的通道,並給你一個公開的、臨時代替用的 https 網址,然後把所有送到這個網址的請求,都轉發到你本機的程式上。 這樣我們在開發測試時,就能讓 LINE 平台找到我們的本機電腦了。
來寫點程式吧:一個不只是回音的機器人
網路上最多的範例就是「回音機器人」(Echo Bot),你跟它說什麼,它就回傳什麼。 這很適合拿來測試 Webhook 有沒有設定成功,但…老實說,很無聊。我們來做個稍微有點用的。
這個機器人會做兩件事:
- 你傳文字給它,它會告訴你傳了幾個字。
- 你傳貼圖給它,它會回覆一張固定的貼圖。
這裡用 Python 和 Flask 框架當作例子。你需要先安裝 `line-bot-sdk` 和 `flask`。
# (這是 Python 程式碼範例)
from flask import Flask, request, abort
from linebot.v3 import WebhookHandler
from linebot.v3.exceptions import InvalidSignatureError
from linebot.v3.messaging import Configuration, ApiClient, MessagingApi, ReplyMessageRequest, TextMessage, StickerMessage
from linebot.v3.webhooks import MessageEvent, TextMessageContent, StickerMessageContent
import os
app = Flask(__name__)
# 從環境變數取得你的 Channel Access Token 和 Channel Secret
# 比較安全,不要直接寫在程式碼裡
channel_access_token = os.getenv('YOUR_CHANNEL_ACCESS_TOKEN')
channel_secret = os.getenv('YOUR_CHANNEL_SECRET')
configuration = Configuration(access_token=channel_access_token)
handler = WebhookHandler(channel_secret)
@app.route("/callback", methods=['POST'])
def callback():
# 取得 X-Line-Signature 標頭值
signature = request.headers['X-Line-Signature']
# 取得請求主體為文字
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# 處理 webhook 主體
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessageContent)
def handle_text_message(event):
text = event.message.text
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=f'你說了 {len(text)} 個字。')]
)
)
@handler.add(MessageEvent, message=StickerMessageContent)
def handle_sticker_message(event):
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
# 回傳一張固定的官方貼圖
# Package ID 和 Sticker ID 可以參考官方文件
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[StickerMessage(package_id='446', sticker_id='1988')]
)
)
if __name__ == "__main__":
app.run()
寫好程式後,在你的終端機執行它,然後用 `ngrok` 把你程式跑的 port (預設是 5000) 公開出去。你會得到一個像 `https://xxxx-xxxx-xxxx.ngrok-free.app` 的網址。把這個網址後面加上 `/callback` (因為我們程式碼裡的路徑是 `/callback`),貼到 LINE Developers 後台的 Webhook URL 欄位,然後打開 "Use webhook" 的開關。這樣就完成了。
免費的能用到什麼程度?
這是個很現實的問題。就像前面提到的,LINE Messaging API 的費用方案是很多人沒注意到的陷阱。 它基本上是免費增值模式,利用 API 做「回覆訊息」(Reply Message) 是免費的,但「主動推播」(Push Message) 就要錢了,而且是算人頭的。
什麼是回覆訊息?就是使用者先密你,你在短時間內回覆他,這算一次 Reply。我們上面的範例都是這種。 這種不算在每月訊息額度內。
什麼是主動推播?就是不管使用者有沒有密你,你主動發訊息給所有好友,或是一群人。 這種訊息就要算錢,會消耗你方案的免費額度。免費方案的額度很少,一下子就用完了。
| 方案類型 | 月費 | 免費訊息則數 | 我的看法... |
|---|---|---|---|
| 溝通計畫 (免費) | 0 元 | 200 則 (台灣地區) | 嗯...只適合自己開發測試,或是超級小眾的同好會。好友超過 50 人,一個月發 4 次公告就爆了。 |
| 輕用量計畫 | 約 NT$800 | 3,000 則 | 適合剛起步的小店家,但還是要很省著用。加購訊息很貴,這個方案不能加購,用完就沒了。 |
| 高用量計畫 | 約 NT$1,200 | 6,000 則 | 真的要做生意,大概都要從這個方案起跳。好處是超過的訊息可以加購,雖然單價還是不便宜,但至少服務不會中斷。 |
*注意:方案名稱和費用可能會變動,上面是大概的印象,請以 LINE 官方公告為準。
常見錯誤與修正
- Webhook 驗證 (Verify) 失敗:這大概是 90% 的新手會遇到的問題。點下 "Verify" 按鈕後出現紅色錯誤。原因很多,最常見的是:ngrok 網址打錯、程式沒在跑、防火牆擋住了、或是程式碼有問題沒辦法正常回應 LINE 的驗證請求。 先確認 ngrok 轉發的 port 跟你的程式是同一個。
- Bot 沒有反應:訊息傳了,但機器人已讀不回。通常是 Webhook 已經設定成功,但你的程式邏輯有問題。例如,`handler.handle(body, signature)` 這段程式碼出錯,導致後面的訊息處理函式根本沒被執行。這時候就要看你伺服器的 log 了。
- 改了程式碼,但機器人行為沒變:如果你是用 Google App Script 之類的平台,每次修改程式碼都要「重新部署」,然後把「新的」網址貼回 LINE Developers 後台。 如果你是用 ngrok,每次重開 ngrok,網址都會變,也要記得去後台更新。
- 金鑰 (Token/Secret) 管理不當:Channel Secret 和 Access Token 非常重要,絕對不要直接寫在程式碼裡面然後上傳到 GitHub。 最好的方式是存在環境變數裡,就像範例程式碼那樣。
嗯...大概就是這樣。從申請到寫出一個稍微有點功能的機器人,再到理解費用的問題。做 LINE Bot 不難,但細節很多。希望這些整理對你有幫助。
你呢?你做 LINE Bot 主要是想解決什麼問題,或是有什麼酷炫的點子嗎?可以在下面留言聊聊。
