National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 72 24°C PM2.5 13
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 13

接上真的 LINE

建立官方帳號與 Channel、ngrok、部署與上線前檢查
導覽 25 minute(s)

Learning Objectives

  • 建立官方帳號,啟用 Messaging API,取得 Channel secret 與 Channel access token
  • 在自己的電腦執行機器人,並在連上 LINE 之前先測試 webhook
  • 用 ngrok 取得 HTTPS 網址,設定 Webhook URL 並通過 Verify
  • 依錯誤訊息判斷問題在哪一段
  • 上線前檢查金鑰、驗簽、紀錄、額度與隱私說明

從模擬換成真的,差別在哪裡

前 12 課的程式碼不用改。要換的是外面那一圈:

課程裡 這一課之後
官方帳號 不需要 自己申請
金鑰 課程準備的假值 Developers Console 取得,放環境變數
Webhook 模擬平台直接交給 Flask LINE 平台經 HTTPS 送到你的網址,你的伺服器要能從外面連到
使用者 模擬手機 LINE App

模擬平台沒有檢查的事,這一課才第一次會碰到:畫面的實際樣式、圖片網址是否連得到、速率限制、額度上限。Flex Message 的樣式可以先用官方的 Flex Message Simulator 比對。

關於這一課的步驟: 操作 LINE 的步驟依 2026-11-03 的官方文件撰寫,每一步附上官方連結;課程撰寫時沒有實際連上 LINE。LINE 的畫面與名稱會改版,和這裡不同時以官方文件為準。在本機執行的指令是實際跑過的輸出,ngrok 的畫面是示意。LINE 是 LY Corporation 的商標,這個課程與該公司沒有合作關係。

第一段:建立官方帳號與取得金鑰

只需要瀏覽器與 LINE 帳號。以下依 2026-11-03 的官方文件,沒有實際操作。投影片或舊文章常寫「在 Console 建立 Messaging API channel」,官方已在 2024 年 9 月 4 日停止這個做法,不要照舊步驟。

  1. 1

    1. 建立 LINE 官方帳號

    依官方 Get started 的流程:

    1. 到 Business ID 的註冊頁面,用 LINE 帳號或電子郵件註冊
    2. 註冊後會出現官方帳號的申請表單,填寫後帳號就建立了
    3. 到 LINE Official Account Manager 確認帳號存在

    官方帳號是機器人的本體,使用者加的好友就是它。練習用的帳號不需要對外公開。方案與費用依地區而不同,申請前請看 LINE 官方的方案說明。

  2. 2

    2. 啟用 Messaging API,選擇 Provider

    1. 在 LINE Official Account Manager 啟用這個帳號的 Messaging API,這時才會建立 Messaging API channel
    2. 第一次使用時要填名字與電子郵件,建立開發者帳號
    3. 選擇或建立 Provider

    Provider 選定後不能更改,也不能取消。 同一個使用者在不同 Provider 底下的 userId 不同,所以同一個單位的服務要放在同一個 Provider。

    完成後用同一個帳號登入 LINE Developers Console,點進 Provider,確認看得到這個 channel。

  3. 3

    3. 取得 Channel secret 與 Channel access token

    金鑰 位置 用途
    Channel secret Basic settings 分頁 驗證 webhook 的簽章
    Channel access token Messaging API 分頁,在這裡核發 呼叫 Messaging API

    token 有好幾種。long-lived 不會過期,練習時最簡單;重新核發時,舊的就失效。官方的 Building a bot 建議使用可以自訂到期時間的 v2.1 token,正式服務可依官方比較表選擇。

    這兩個值等於官方帳號的鑰匙,不可以貼到程式碼、聊天室、截圖或 GitHub。

  4. 4

    4. 關閉自動回應

    在 Messaging API 分頁找到 Greeting messages 與 Auto-reply messages,點旁邊的 Edit 會開啟 LINE Official Account Manager,把兩者關閉。

    這兩項預設是開啟的。不關的話,使用者會同時收到自動回應和機器人的回覆,你很難分辨是誰回的。如果你有寫 FollowEvent 的歡迎訊息,也要關閉 Greeting messages,否則加好友時會有兩則。

這段導覽完成了

第二段:在自己的電腦執行機器人

這一段的指令與輸出都實際跑過(Windows PowerShell 語法,Python 3.12,2026-11-03)。還沒有連上 LINE,先確定程式本身是好的。

  1. 1

    1. 建立虛擬環境、安裝套件

    開一個新資料夾。macOS、Linux 啟用虛擬環境的指令是 source .venv/bin/activate,其他相同。line-bot-sdk 要求 Python 3.10 以上。

  2. 2

    2. 寫 app.py,設定環境變數

    # app.py,和第 2 課相同
    import os
    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__)
    configuration = Configuration(access_token=os.environ['LINE_CHANNEL_ACCESS_TOKEN'])
    handler = WebhookHandler(os.environ['LINE_CHANNEL_SECRET'])
    
    
    @app.route('/callback', methods=['POST'])
    def callback():
        signature = request.headers['X-Line-Signature']
        body = request.get_data(as_text=True)
        try:
            handler.handle(body, signature)
        except InvalidSignatureError:
            abort(400)
        return 'OK'
    
    
    @handler.add(MessageEvent, message=TextMessageContent)
    def on_text(event):
        with ApiClient(configuration) as api_client:
            MessagingApi(api_client).reply_message(ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=event.message.text)],
            ))
    

    環境變數只存在於這個終端機視窗,關掉就要重設。macOS、Linux 寫成 export LINE_CHANNEL_SECRET="..."。忘記設定時,程式一啟動就會停下來,這比執行到一半才出錯好:

  3. 3

    3. 啟動伺服器

    --debug 開啟除錯模式,只能在自己的電腦上用。畫面上的警告要照做:開發伺服器不可以拿來上線。

  4. 4

    4. 連上 LINE 之前,先自己測試 webhook

    LINE 的 Verify 會送一個 events 是空陣列的 POST,伺服器要回 200。你可以自己送一次,分清楚問題在程式還是在網路。伺服器繼續開著,再開一個終端機,同樣設定 LINE_CHANNEL_SECRET:

    # check_webhook.py:不經過 LINE,自己送一個和 Verify 相同內容的請求
    import base64, hashlib, hmac, os, urllib.error, urllib.request
    
    body = '{"destination":"Utest","events":[]}'.encode('utf-8')
    secret = os.environ['LINE_CHANNEL_SECRET'].encode('utf-8')
    good = base64.b64encode(hmac.new(secret, body, hashlib.sha256).digest()).decode()
    
    for name, sig in [('正確的簽章', good), ('錯誤的簽章', 'AAAA')]:
        req = urllib.request.Request('http://127.0.0.1:5000/callback', data=body, method='POST',
                                     headers={'Content-Type': 'application/json', 'X-Line-Signature': sig})
        try:
            print(name, urllib.request.urlopen(req).status)
        except urllib.error.HTTPError as e:
            print(name, e.code)
    
這段導覽完成了

第三段:讓 LINE 連得到你的電腦

LINE 平台在網際網路上,連不到你電腦的 127.0.0.1。開發時可以用 ngrok 暫時開一個對外的 HTTPS 網址。以下依 2026-11-03 的官方文件,ngrok 的畫面是示意,沒有實際執行。

  1. 1

    1. 安裝 ngrok,設定 authtoken

    到 ngrok 官方的 Quickstart 依作業系統安裝(macOS 用 brew install ngrok,Windows 從 Windows App Store),註冊帳號後在 dashboard 取得 authtoken。方案內容請看 ngrok 官方說明。

  2. 2

    2. 把 5000 埠開到外面

    Flask 繼續開著,再開一個終端機。Forwarding 那行的 https 網址就是對外的網址。

    依官方文件,帳號會得到一個自動指定的開發網域,重新啟動 ngrok 不會改變。如果你的網址和上次不同,要回 Console 更新 Webhook URL。

    這段時間任何人都能連到你的 /callback,這正是第 3 課要驗簽的原因。使用者的訊息會經過 ngrok 的服務,所以只拿來開發,測試完就按 Ctrl+C 關掉,也不要用真實使用者的資料測試。

  3. 3

    3. 設定 Webhook URL,按 Verify

    依官方 Building a bot,在 Console 打開 channel 的 Messaging API 分頁:

    1. Webhook URL 旁按 Edit,填入 https://你的名稱.ngrok-free.dev/callback(結尾要有 /callback),按 Update
    2. 開啟 Use webhook
    3. 按 Verify,成功時會顯示 Success

    Webhook URL 必須是 HTTPS,憑證要由瀏覽器普遍信任的憑證機構簽發,自簽憑證不行。ngrok 已經處理好這一點;日後部署到自己的網域要自己準備。

    失敗時看下方的常見錯誤表。瀏覽器打開 http://localhost:4040,可以看到 ngrok 收到的每個請求與回應。

  4. 4

    4. 用手機試試看

    用手機掃描 Messaging API 分頁上的 QR code,把官方帳號加為好友,傳一句話,應該會收到一樣的回覆。

    同時看三個地方,就能追到每一段:

    位置 看得到
    ngrok 的 4040 頁面 LINE 送來的請求和你的回應
    Flask 的終端機 POST /callback 的狀態碼、錯誤訊息
    手機 使用者實際看到的畫面

    這是第一次看到真的版面,把前面課程裡的 Flex 卡片也拿來試。

  5. 5

    5. 把專題搬過來

    把第 12 課的 app.py、db.py、flex.py 放進資料夾。有三個地方要改:

    項目 課程裡 真實環境
    圖文選單的圖片 佔位的幾個位元組 真的圖片,規格見官方文件(JPEG 或 PNG,寬度、比例、檔案大小都有限制)
    建立圖文選單 app.py 啟動時 寫成獨立腳本執行一次;用 flask run 啟動時 __name__ 不是 __main__,setup_rich_menu() 不會執行
    語音 重播事先的結果 pip install faster-whisper,模型大小與 GPU 依 faster-whisper 文件;轉錄耗時,要放到背景處理

    範例的 ADMIN_KEY 也要換成自己產生的值,放環境變數。

  6. 6

    6. 部署

    你的電腦關機,機器人就停了。要長期服務,就要部署到有固定網域的伺服器,流程與上線檢查見後端開發軌的部署上線:用 Gunicorn 或 Waitress 執行、前面放 Nginx、申請 HTTPS 憑證。

    部署完到 Console 把 Webhook URL 換成正式網址,再按一次 Verify。金鑰在伺服器上一樣放環境變數。SQLite 檔案要放在不會被部署覆蓋的位置,並且要備份。

這段導覽完成了

常見錯誤對照

先判斷問題在哪一段:LINE 連不到你、你的程式出錯,還是你呼叫 LINE 時出錯。Console 的 Messaging API 分頁可以開啟 Error statistics aggregation,之後在 Webhook errors 分頁看統計(官方說明)。Verify 的請求不計入統計;用官方的 Test webhook endpoint API 測試時,回應會帶下表的原因代碼。

看到的現象 可能的原因 怎麼做
啟動時 KeyError: 'LINE_CHANNEL_ACCESS_TOKEN' 這個終端機沒有設定環境變數 重新設定後再啟動
Address already in use 或 WinError 10013 5000 埠被占用。macOS 的 AirPlay Receiver 會用這個埠 用 flask --app app run --port 5001,ngrok 也改 5001
Verify 失敗,原因是 could_not_connect Flask 或 ngrok 沒開,或網址打錯 確認兩個終端機都在執行,網址和 ngrok 顯示的相同
Verify 失敗,狀態碼 404 Webhook URL 少了 /callback 修正網址
Verify 失敗,狀態碼 400 Channel secret 不對,驗簽失敗,程式 abort(400) 重新從 Basic settings 複製,注意是不是另一個 channel 的
Verify 失敗,狀態碼 500 程式出錯 看 Flask 終端機的 traceback
統計裡出現 request_timeout 伺服器沒有在 2 秒內回應(2026-11-03 查官方說明,以官方頁面為準) 先回 200,耗時的工作放到背景。官方建議非同步處理事件
Verify 成功,傳訊息卻沒有反應 Use webhook 沒有開啟 到 Messaging API 分頁開啟
收到罐頭訊息 Auto-reply messages 沒有關閉 依第一段第 4 步關閉
程式丟 ApiException,狀態碼 401,Authentication failed token 打錯,或已經重新核發 重新複製 token,更新環境變數,重新啟動
Invalid reply token token 用過一次,或事件太久以前(第 6 課) 不要對同一個事件回覆兩次;處理太久就改用 push
API 回 429 超過速率限制或本月額度(訊息為 You have reached your monthly limit.) 減少請求,檢查迴圈有沒有寫錯

上線前檢查清單

正式給別人用之前,逐項確認:

項目 要確認什麼
驗簽 /callback 一定呼叫 handler.handle,不要為了除錯暫時拿掉。官方文件要你在處理事件前先驗簽,開發準則也禁止用 IP 限制 webhook 的來源
金鑰 都在環境變數;.env 列在 .gitignore;懷疑外洩就重新核發
自己開的路由 管理、發公告的路由都有驗證身分
除錯模式 正式環境不用 --debug,也不用開發伺服器
錯誤處理 使用者看到聽得懂的訊息,看不到錯誤細節;例外有記錄
重送 開啟 Webhook redelivery 後,同一事件可能送達多次,用 webhookEventId 去重(第 3 課)
紀錄 官方建議保存 API 請求與 webhook 的紀錄(時間、狀態碼、請求 ID)。訊息內容與 userId 屬於使用者的資料,沒有必要就不要寫進紀錄,也要定期清除
額度 能用 reply 就不用 push;推送前想清楚收件人數。官方頁面有查詢用量的 API 說明
尊重使用者 不濫發,讓使用者可以取消通知
隱私說明 告訴使用者:你蒐集什麼、用來做什麼、存多久、怎麼刪除。語音與語言模型要寫明資料送到哪裡。學校或公司的服務,先問主管單位的規定
模型回答 接語言模型時,標明內容由 AI 產生、可能有錯

官方的開發準則還列了禁止事項,例如不要對 LINE 平台做壓力測試、不要嘗試識別特定 userId 的個人屬性,上線前請讀一次。

想一想

1.

依目前的官方流程,Messaging API channel 是怎麼建立的?

2.

按 Verify 後失敗,Flask 終端機顯示 POST /callback 回了 400。最可能的原因是什麼?

3.

為什麼要先用 check_webhook.py 自己測試,再設定 Webhook URL?

4.

Webhook URL 要用什麼樣的網址?

5.

下列哪一項不應該做?

第 1 次作答

重點整理

  • 先建立官方帳號,再從 LINE Official Account Manager 啟用 Messaging API
  • Channel secret 在 Basic settings,access token 在 Messaging API 分頁,都放環境變數
  • 先在本機測試 webhook,再用 ngrok 接上 LINE,一次只驗一段
  • Webhook URL 要 HTTPS,憑證不能自簽,開啟 Use webhook 後按 Verify
  • 開發伺服器與 ngrok 只用於開發,長期服務要部署
  • 上線前逐項檢查驗簽、金鑰、紀錄、額度與隱私說明

這一軌到這裡結束。你已經能做出一個會記住狀態、會推送,也能在真的 LINE 上執行的機器人。想把網站本身做得更完整,可以繼續學後端開發軌;想把語言模型用得更深入,可以看生成式 AI 應用軌。

這一課完成了!
看我的學習進度
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。