先說結論
OK,今天要來聊聊 LINE Bot。很多人想自己做一個,但常常卡在第一步。老實說,我自己摸索的時候也撞牆了好幾次。所以結論先說:做一個 LINE Bot,核心就是搞懂「Webhook」跟「回傳 LINE 指定的 JSON 格式」。 聽起來很技術,但簡單講,Webhook 就是 LINE 用來通知你「欸!有人傳訊息給你囉!」的門鈴;然後你家的程式就要準備好一個對應格式的包裹(JSON),請 LINE 平台送回去給使用者。
整個流程跑通了,就能玩出很多花樣。今天不講太深的理論,直接來看幾個可以馬上拿來用的實用情境,從最簡單的到比較進階的,順便附上一些程式碼的思路。
所以,LINE Bot 到底能幹嘛?5 個實用情境
大部分網路上的教學都是做一個「鸚鵡機器人」(Echo Bot),就是你傳什麼、它回什麼。 這很適合新手入門,但說真的不太實用。我們來看看一些更有趣的例子。
-
情境 1:關鍵字自動回覆(基本款 FAQ)
這最常見,也最簡單。使用者輸入「營業時間」、「價錢」或「地址」,Bot 就會回覆預設好的答案。對小店家或個人工作室來說,這可以省下超多回覆重複問題的時間。基本上就是一堆 `if-else` 判斷式,沒什麼難度,但效果很好。 -
情境 2:每日定時推播(天氣預報、本日優惠)
這個跟回覆不一樣,是 Bot「主動」傳訊息給使用者,也就是所謂的 Push Message。 你可以設定每天早上八點發送天氣預報,或是每天中午推播午餐特價資訊。這需要搭配排程工具 (scheduler) 來觸發,但能有效提升使用者黏著度。 -
情境 3:簡單的問卷調查(Quick Reply 引導)
想收集使用者意見,但又不想做一個完整的問卷網頁?可以用 Quick Reply 功能。 比如你問「請問您喜歡哪種咖啡?」,然後提供「拿鐵」、「美式」、「卡布奇諾」三個按鈕。使用者點了之後,Bot 馬上就能記錄選項,並接著問下一個問題。互動感比填寫表單好多了。 -
情境 4:秀出漂亮的商品卡(Flex Message)
如果只會傳文字訊息,那真的太無聊了。 LINE 的 Flex Message 是一個大殺器,可以讓你用類似網頁排版的方式,組合圖片、文字、按鈕,做出像商品卡、餐廳菜單那樣的漂亮版面。 雖然要手刻 JSON 比較煩,但視覺效果絕對值得。日本 LINE 官方文件那邊有很多範例可以抄。 -
情境 5:串接外部 API(查字典、查股價)
這是讓 Bot 變聰明的關鍵。當使用者輸入一個單字,你的 Bot 程式就去呼叫某個線上字典的 API,然後把查到的解釋回傳給使用者。或是輸入股票代號,就去抓回即時股價。這讓 Bot 不再只是一個訊息收發器,而是一個真正能提供動態資訊的助理。
怎麼做:3 個核心步驟與程式碼思路
好,概念有了,那到底要怎麼動手?不管你用 Python、Node.js 還是其他語言,核心步驟都差不多。 這裡我用 Python 的 Flask 框架當例子,因為它很輕巧,適合做這種小專案。
步驟一:去 LINE Developers 後台拿「鑰匙」
這一步沒什麼技術,就是去 LINE Developers 網站註冊一個帳號,然後建立一個「Messaging API」類型的 Channel。 過程中有點像在填網路會員資料。完成後,你會在後台看到兩個最重要的東西:
- Channel access token: 你的機器人要跟 LINE API 溝通時用的令牌。
- Channel secret: 用來驗證從 LINE 平台傳來的請求是不是真的,而不是有人偽造的。
把這兩個字串複製下來,它們就像你家的鑰匙和身分證,要保管好。
步驟二:建立一個 Webhook 接收點
你的程式需要一個公開的網址(Endpoint),讓 LINE 平台可以把使用者的訊息傳過來。 這就是 Webhook。在本機測試時,很多人會用 `ngrok` 這個工具,它可以幫你產生一個暫時的公開網址,對應到你電腦上跑的程式。 程式碼大概會長這樣:
# 引入需要的函式庫
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
from linebot.v3.webhooks import MessageEvent, TextMessageContent
app = Flask(__name__)
# 從 LINE Developers 後台拿到的金鑰
configuration = Configuration(access_token='YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')
# Webhook 的路徑,通常設為 /callback
@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:
print("Invalid signature. Please check your channel secret.")
abort(400)
return 'OK'
# 處理文字訊息事件
@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
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=event.message.text)] # 這就是鸚鵡機器人
)
)
if __name__ == "__main__":
app.run()
上面這段程式碼,其實就是建立一個最基本的「鸚鵡機器人」。`@app.route("/callback")` 就是告訴 Flask 框架,如果 LINE 平台往 `/callback` 這個網址丟了一個 POST 請求,就執行下面的 `callback` 函式。 `handler.handle(body, signature)` 則是 LINE SDK 提供的方便工具,會自動幫你驗證簽名並觸發對應的事件處理器。
步驟三:處理事件並回傳訊息
收到訊息後,`@handler.add(MessageEvent, message=TextMessageContent)` 這段就會被觸發。 `event` 物件裡面包含了所有資訊,像是使用者是誰 (`event.source.user_id`)、傳了什麼訊息 (`event.message.text`),還有最重要的 `reply_token`。
你要回覆訊息,就必須使用這個 `reply_token`。 注意,一個 `reply_token` 只能用一次,用過就失效了。 如果你想在收到訊息後,過一陣子再主動推播訊息,那就要用前面提到的 Push API,而不是 Reply API。
一個簡單卻重要的比較:文字訊息 vs. Flex Message
剛開始玩,大部分人都只會用文字訊息。但說真的,想讓你的 Bot 脫穎而出,一定要學會用 Flex Message。 我自己也是研究了好一陣子,尤其是它的 JSON 結構,真的有點囉嗦。 不過 LINE 官方有提供一個線上模擬器 (Flex Message Simulator),可以用拖拉的方式產生 JSON,這點倒是蠻方便的。
| 訊息類型 | 優點 | 缺點 | 適合情境 |
|---|---|---|---|
| 文字訊息 (Text Message) | 超簡單,絕對不會出錯,開發速度最快。 | 超級無聊,使用者體驗很差,功能性零。 | 簡單的通知、錯誤訊息、純文字問答。 |
| Flex Message | 版面超自由,可以做出像 App 一樣的介面,視覺效果一流,互動性強。 | JSON 結構複雜,手刻容易出錯,需要花時間學習和設計。 | 商品目錄、餐廳菜單、預約卡片、任何需要圖文並茂的場景。 |
常見錯誤與修正
新手上路,大概率會遇到下面幾個問題,我直接把坑列出來,幫大家省點時間。
-
Webhook 驗證失敗 (Verification failed):
在 LINE Developers 後台填完 Webhook URL 按下「Verify」時,最常遇到的錯誤。90% 的原因是你的 Webhook URL 不是 HTTPS,或者你的程式沒有正確回傳 HTTP 狀態碼 200 OK。LINE 官方文件有提到這點,但很多人會忽略。 -
簽名驗證錯誤 (InvalidSignatureError):
程式跑起來了,但一收到訊息就噴這個錯。通常是你的 Channel Secret 填錯了,大小寫、多個空格之類的。回去後台複製貼上一次就對了。 -
Bot 沒反應,但後台也沒報錯:
這很tricky。有可能是你處理事件的邏輯寫錯了,但又沒有做錯誤處理,導致程式默默地死在半路。另一個可能是你忘記使用 `reply_token` 回傳訊息,或是 token 已經過期了。記得,Reply Token 是有時效性的。 -
加入群組後沒反應:
這是一個權限設定問題。預設情況下,Bot 是不允許被加入群組的。你必須到 LINE Official Account Manager 後台去手動開啟「允許加入群組或多人聊天室」的選項。
總體來說,開發 LINE Bot 是一個很有趣的過程。從一個只會說哈囉的笨蛋,到能幫你處理客服、推播通知、甚至串接外部服務的智慧助理,成就感滿滿。 台灣開發者社群其實也蠻活躍的,像是 iT 邦幫忙或 Medium 上都有很多前輩分享心得,卡關的時候可以多去看看。 希望今天的整理對想入門的人有幫助!
你最想做哪種 LINE Bot?
看完這 5 個情境,你對哪一個最感興趣,或者覺得最實用?在下面留言分享你的想法吧!
- 客服 FAQ 機器人
- 定時天氣/新聞推播
- 互動式問卷調查
- 漂亮的商品菜單
- 串接外部 API 的智慧助理
