本專案是一個基於 LINE Messaging API 的智能聊天機器人,使用 Python 開發,結合意圖識別、圖片分析和網路搜尋功能。機器人能夠處理用戶的文字訊息和圖片訊息,根據訊息內容進行智能回應,並支援多種功能,包括問候、一般對話、個人問題解答、天氣/新聞查詢等。專案使用 Flask 作為 Web 框架,透過 ngrok 提供公開 Webhook URL,並整合 OpenRouter API(用於文字和圖片處理)以及 Serper API(用於網路搜尋)。
- 智能意圖識別:自動分類用戶訊息為問候、一般對話、個人問題或需要搜尋的複雜問題。
- 圖片分析:支援上傳 JPEG/PNG 圖片,透過 OpenRouter 的模型進行內容分析。
- 網路搜尋:針對需要最新資訊的問題,使用 Serper API 搜尋並提供結果。
- 錯誤處理:包含全面的錯誤處理,確保穩定性和用戶友好性。
- 詳細日誌:記錄用戶訊息、意圖識別結果和 API 回應,便於除錯。
- 指令支援:支援
!help和!intent指令,方便測試和查詢功能。
- 程式語言:Python 3.12
- Web 框架:Flask
- LINE SDK:line-bot-sdk 3.0.0+
- AI 處理:OpenRouter API(預設:Gemma 和 Deepseek 模型)
- 搜尋服務:Serper API
- 其他依賴:requests, python-dotenv, pytz, pydantic
- 本地測試工具:ngrok
本機器人提供以下主要功能:
- 問候語:識別「嗨」「你好」「早安」等問候,快速回應友善訊息。
- 範例輸入:
你好 - 範例輸出:
嗨!很高興見到你!😎 今天有什麼特別的事情想分享嗎?
- 範例輸入:
- 一般對話:處理「謝謝」「再見」「哈哈」等簡單對話,提供輕鬆回應。
- 範例輸入:
謝謝 - 範例輸出:
不客氣!😊 有什麼我可以幫你的?
- 範例輸入:
- 個人問題:回答「你是誰」「你會什麼」等問題,介紹機器人功能。
- 範例輸入:
你是誰 - 範例輸出:
我是你的智能 LINE 助手,擅長聊天、分析圖片和搜尋資訊!😎 試試問我天氣或上傳圖片吧!
- 範例輸入:
- 複雜問題:對於天氣、新聞、股價等問題,結合 Serper API 搜尋最新資訊並生成回應。
- 範例輸入:
台北今天的天氣如何? - 範例輸出:
根據最新資訊,台北今天多雲,氣溫約 28°C,記得帶傘哦!😉
- 範例輸入:
- 支援上傳 JPEG/PNG 圖片(建議 <5MB),預設使用 OpenRouter
google/gemma-3-27b-it:free模型分析圖片內容。 - 預設問題為「請描述這張圖片」,可搭配文字問題進行具體分析。
- 範例輸入:上傳一張貓咪圖片
- 範例輸出:
哇,這是一隻超可愛的貓咪!😺 看起來毛茸茸的,可能正在懶洋洋地曬太陽。
!help或幫助:顯示機器人功能說明。- 範例輸出:
🤖 LINE AI 聊天機器人功能說明 這是一個具備智能意圖識別與圖片處理的聊天機器人!😎 📝 主要功能 • 文字對話:直接發送訊息與我聊天 • 圖片分析:上傳圖片,我會幫你分析內容 • 指令: - `!help` 或 `幫助`:顯示此說明 - `!intent <訊息>`:測試意圖識別功能 ...
- 範例輸出:
!intent <訊息>:測試意圖識別功能,返回訊息的意圖類型和是否需要搜尋。- 範例輸入:
!intent 早安 - 範例輸出:
意圖識別結果 輸入訊息: 早安 識別意圖: greeting 需要搜尋: 否
- 範例輸入:
- 作業系統:Windows(或任何支援 Python 的系統)
- Python 版本:3.12
- 依賴套件:
- line-bot-sdk>=3.0.0
- flask
- python-dotenv
- openai
- requests
- pytz
- pydantic==1.10.13
- 外部工具:ngrok(用於本地測試)
- API 憑證:
- LINE Messaging API:Channel Access Token 和 Channel Secret
- OpenRouter API:API 金鑰
- Serper API:API 金鑰
- 安裝 Python:
- 確認 Python 3.12 已安裝:
python --version
- 若未安裝,前往 Python 官網 下載並安裝。
- 確認 Python 3.12 已安裝:
- 安裝依賴套件:
-
在專案目錄中執行:
pip install --upgrade line-bot-sdk flask python-dotenv openai requests pytz pydantic==1.10.13
-
檢查套件版本:
pip show line-bot-sdk pydantic
- 確保
line-bot-sdk為 3.0.0 或更高,pydantic為 1.10.13。
- 確保
-
- 下載 ngrok:
- 前往 ngrok 官網 下載 Windows 版本的
ngrok.exe。 - 儲存至專案目錄或加入系統 PATH。
- 配置 authtoken:
- 註冊 ngrok 帳號。
- 複製 authtoken(Authtoken 頁面)。
- 執行:
.\ngrok.exe authtoken 你的authtoken
- 前往 ngrok 官網 下載 Windows 版本的
- 設置
.env檔案:- 在專案目錄創建
.env檔案,內容如下:LINE_CHANNEL_ACCESS_TOKEN=你的Channel Access Token LINE_CHANNEL_SECRET=你的Channel Secret OPENROUTER_API_KEY=你的OpenRouter API金鑰 SERPER_API_KEY=你的Serper API金鑰 - 獲取 LINE 憑證:
- 登錄 LINE Developers,選擇您的 Messaging API 頻道。
- 在「Basic settings」複製 Channel Secret。
- 在「Messaging API」點擊「Issue」生成 Channel Access Token。
- 獲取 API 金鑰:
- OpenRouter:從 OpenRouter 控制台 獲取 API 金鑰。
- Serper:從 Serper 控制台 獲取 API 金鑰。
- 確保
.env無多餘空格或換行。
- 在專案目錄創建
- 儲存程式碼:
- 將提供的
line_bot.py(見前回應中的<xaiArtifact>,或確認現有檔案一致)儲存至D:\Workbench\project\line_bot\line_bot.py。
- 將提供的
- 啟動 Flask 伺服器:
-
開啟終端機,進入專案目錄:
cd 專案路徑 -
執行程式:
python line_bot.py
-
確認輸出:
LINE_CHANNEL_ACCESS_TOKEN: 設 OPENROUTER_API_KEY: 設 SERPER_API_KEY: 設 * Running on http://127.0.0.1:5000 * Running on http://192.168.0.108:5000 -
若端口 5000 被占用,修改
line_bot.py中的port=5000(例如port=5001)。
-
- 啟動 ngrok:
- 執行:
.\ngrok.exe http 5000 - 確認輸出:
Forwarding https://abc123.ngrok.io -> http://localhost:5000
- 執行:
- 設置 LINE Webhook:
- 在 LINE Developers 控制台的「Messaging API」標籤,設置 Webhook URL:
https://(隨機生成的一串東西).ngrok-free.app/callback 或 https://abc123.ngrok.io/callback - 啟用「Use webhook」,點擊「Verify」,確認返回「Success」。
- 在 LINE Developers 控制台的「Messaging API」標籤,設置 Webhook URL:
- 在 LINE 應用中,掃描您的 Messaging API 頻道 QR 碼(在「Basic settings」中)。
- 將機器人加入個人聊天或群組。
- 文字訊息:
- 問候:發送「你好」「早安」。
- 預期輸出:
嗨!很高興見到你!😎 今天有什麼特別的事情想分享嗎?
- 預期輸出:
- 一般對話:發送「謝謝」「哈哈」。
- 預期輸出:
不客氣!😊 有什麼我可以幫你的?
- 預期輸出:
- 個人問題:發送「你是誰」「你會什麼」。
- 預期輸出:
我是你的智能 LINE 助手,擅長聊天、分析圖片和搜尋資訊!😎 試試問我天氣或上傳圖片吧!
- 預期輸出:
- 複雜問題:發送「台北今天的天氣如何?」。
- 預期輸出:
根據最新資訊,台北今天多雲,氣溫約 28°C,記得帶傘哦!😉
- 預期輸出:
- 指令:
- 發送「!help」:顯示功能說明。
- 發送「!intent 早安」:顯示意圖識別結果。
- 問候:發送「你好」「早安」。
- 圖片訊息:
- 上傳 JPEG/PNG 圖片(<5MB)。
- 預期輸出:
哇,這是一隻超可愛的貓咪!😺 看起來毛茸茸的,可能正在懶洋洋地曬太陽。
- 預期輸出:
- 可搭配問題,例如:「這張圖片是什麼動物?」。
- 上傳 JPEG/PNG 圖片(<5MB)。
- 檢查日誌:
- 終端機應記錄:
[2025-07-22 21:55:00] 用戶ID: U123..., 訊息: 你好 識別意圖: greeting 是否需要搜尋: 否 OpenRouter 回應:嗨!很高興見到你!😎 ...
- 終端機應記錄:
- 文字訊息:任意文字,無長度限制(建議簡潔)。
- 圖片訊息:JPEG 或 PNG 格式,建議大小 <5MB。
- 指令:
!help或幫助!intent <任意訊息>
- 文字回應:友善、繁體中文、帶表情符號的回應,長度根據問題複雜度(100-2000 字元)。
- 圖片分析:詳細描述圖片內容,包含場景、物品或人物,約 100-500 字元。
- 錯誤訊息:若發生錯誤,回應格式為:
哎呀,出了點小問題:{錯誤訊息} 😅 請再試一次!
- 問題:
無效的簽名(HTTP 400)- 原因:
LINE_CHANNEL_SECRET不正確。 - 解決:
- 檢查
.env中的LINE_CHANNEL_SECRET是否與 LINE Developers 控制台的「Basic settings」一致。 - 若不一致,重新生成(點擊「Reissue」)並更新
.env。 - 重啟 Flask 伺服器:
python line_bot.py
- 檢查
- 原因:
- 問題:
UnauthorizedException: (401)(Authentication failed)- 原因:
LINE_CHANNEL_ACCESS_TOKEN無效或過期。 - 解決:
- 在 LINE Developers 控制台的「Messaging API」重新生成 Token(點擊「Issue」)。
- 更新
.env並重啟伺服器。
- 原因:
- 問題:Webhook 無回應
- 原因:ngrok 未運行或 Webhook URL 錯誤。
- 解決:
- 確認 ngrok 運行:
.\ngrok.exe http 5000 - 檢查 LINE Webhook URL(
https://your-ngrok-url.ngrok.io/callback)。 - 使用 ngrok Web 介面(
http://127.0.0.1:4040)檢查POST /callback請求。
- 確認 ngrok 運行:
- 問題:圖片或搜尋功能無回應
- 原因:OpenRouter 或 Serper API 金鑰無效或配額耗盡。
- 解決:
- 檢查
.env中的OPENROUTER_API_KEY和SERPER_API_KEY。 - 登錄 OpenRouter 和 Serper,確認 API 配額。
- 檢查
- 問題:
ValidationError或'Configuration' object has no attribute 'select_header_accept'- 原因:
line-bot-sdk或pydantic版本不匹配。 - 解決:
- 確認版本:
pip show line-bot-sdk pydantic
- 更新套件:
pip install --upgrade line-bot-sdk pydantic==1.10.13
- 確認版本:
- 原因:
- 查看終端機輸出,搜尋「錯誤」、「HTTP」或「無效的簽名」。
- 常見日誌:
- 成功:
[2025-07-22 21:55:00] 用戶ID: U123..., 訊息: 你好 識別意圖: greeting 是否需要搜尋: 否 OpenRouter 回應:嗨!很高興見到你!😎 ... - 錯誤:
無效的簽名 127.0.0.1 - - [22/Jul/2025 21:53:29] "POST /callback HTTP/1.1" 400 -
- 成功:
- 若需協助,提供:
- 終端機輸出:
pip show line-bot-sdk pydantic的結果。 - 完整 Flask 和 ngrok 日誌。
- LINE Developers 控制台的「Basic settings」和「Webhook settings」截圖。
- 測試時發送的訊息和回應情況。
- 終端機輸出:
- ngrok 免費版限制:
- 公開 URL 每次運行會變更,需重新更新 LINE Webhook。
- 連線時間限制為 2 小時,需定期重啟 ngrok。
- API 配額:
- 定期檢查 LINE、OpenRouter 和 Serper API 的配額。
- 若收到
429 Too Many Requests,聯繫 API 提供商或升級計劃。
- 圖片限制:
- 圖片大小建議 <5MB,避免 OpenRouter API 處理延遲。
- 安全性:
- 保護
.env檔案,勿公開分享。 - 若 Token 或 Secret 洩漏,立即在 LINE Developers 控制台重新生成。
- 保護
- 生產環境:
- Flask 開發伺服器不適合生產環境,部署時使用 Gunicorn:
pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 line_bot:app
- Flask 開發伺服器不適合生產環境,部署時使用 Gunicorn: