LINE Bot 範例教學:5 個實用情境與程式碼實作步驟

Published on: | Last updated:

先說結論

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 不再只是一個訊息收發器,而是一個真正能提供動態資訊的助理。
LINE Bot 運作流程示意圖
LINE 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 提供的方便工具,會自動幫你驗證簽名並觸發對應的事件處理器。

在 LINE Developers 後台找到 Channel Access Token
在 LINE Developers 後台找到 Channel Access Token

步驟三:處理事件並回傳訊息

收到訊息後,`@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 結構複雜,手刻容易出錯,需要花時間學習和設計。 商品目錄、餐廳菜單、預約卡片、任何需要圖文並茂的場景。
文字訊息與 Flex Message 的視覺效果對比
文字訊息與 Flex Message 的視覺效果對比

常見錯誤與修正

新手上路,大概率會遇到下面幾個問題,我直接把坑列出來,幫大家省點時間。

  • 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 個情境,你對哪一個最感興趣,或者覺得最實用?在下面留言分享你的想法吧!

  1. 客服 FAQ 機器人
  2. 定時天氣/新聞推播
  3. 互動式問卷調查
  4. 漂亮的商品菜單
  5. 串接外部 API 的智慧助理

Related to this topic:

Comments

撥打專線 LINE免費通話