Claude Code 教學/第 21 篇・共 25 篇
LINE 家庭 AI 小幫手(一):開官方帳號,讓群組訊息送到你的電腦
用 Claude Code 從零做一個 LINE 家庭群組小幫手。第一篇先開 LINE 官方帳號、啟用 Messaging API,再用 Cloudflare Tunnel 把訊息送到自己電腦上的 Python 程式,做出會鸚鵡學話的第一版。
我家的 LINE 家庭群組裡住著一位 AI 小幫手。被 @ 才會開口,問她明天會不會下雨,她會先上網查再回;說「幫我記一下週日要回診」,她會記下來;說「後天早上九點提醒我們帶健保卡」,時間到了她真的會在群組裡提醒。
這個系列把她從無到有的過程整理成五篇。文章裡的小幫手叫小欣,程式我整理成去掉家人資料的範本,放在 GitHub:claude-line-family-bot。
做法跟我前面的 Claude Code 系列一樣:文章給你提示詞,讓 Claude Code 寫程式、跑指令;你負責 LINE 後台的設定和最後的驗收。 不過這次每篇都會打開幾段關鍵程式碼,講清楚它在做什麼。看得懂原理,之後要改人設、加功能才不會卡住。
- 開官方帳號,讓群組訊息送到你的電腦(本篇)
- 接上模型:以 Claude 為例,以及模型怎麼選
- 人設、@ 才回、讀懂群組前後文、上網查資料
- 給它工具:提醒、備忘錄、長期記憶、看照片
- 常駐上線:開機自動跑、固定網址、費用控管
一、先看懂整條路
家人在群組裡 @小欣 的那一刻,訊息會這樣跑一圈:
家人在群組 @小欣
↓
LINE 的伺服器(把訊息打包成 JSON)
↓ HTTPS POST,這個動作叫 webhook
Cloudflare Tunnel(替你的電腦開一個對外網址)
↓
你電腦上的 Python 程式(127.0.0.1:8001)
↓ 問 Claude 該怎麼回(第二篇才接上)
用 LINE 的 Reply API 回到群組
webhook 的意思是「有事發生時,由對方主動打電話給你」。你不用一直去問 LINE 有沒有新訊息,LINE 會在有人說話時,把內容 POST 到你給它的網址。
麻煩的地方在於:LINE 只能打到網際網路上的公開網址,而你家電腦躲在路由器後面,外面連不進來。Cloudflare Tunnel 從你的電腦主動往外連到 Cloudflare,再由 Cloudflare 把外面的請求轉進來,所以不用動路由器、不用開 port。
這篇的目標很小:私訊官方帳號「哈囉」,它回你「你說:哈囉」。 回得出來,就代表整條路通了。
二、準備清單
- 一台會一直開著的電腦。本文以 Apple Silicon Mac 示範,Linux 也可以,只有第五篇的常駐方式要換。
- Python 3.11 以上、Git、Claude Code
- 一個 LINE 帳號(用來建立官方帳號)
- Homebrew(Mac 安裝 cloudflared 用)
費用的部分,這篇完全免費。LINE 官方帳號的免費方案就夠用:在聊天室裡當下回覆(Reply API)不計費;要花則數的是機器人主動推播(Push API),例如第四篇的定時提醒。免費方案每月有 200 則推播額度,而且是依收到的人數計算,推播到群組時,群組有幾個人就算幾則。
三、建立 LINE 官方帳號,打開 Messaging API
- 到 LINE Official Account Manager 建立一個官方帳號,名稱就填「小欣」(之後可以改)。
- 進帳號後台,打開右上角「設定」→ 左側「Messaging API」→「啟用 Messaging API」。第一次會請你建立一個 Provider(開發者名稱,填自己的名字即可)。
- 同樣在「設定」裡:
- 「回應設定」:關閉「自動回應訊息」和「加入好友的歡迎訊息」,打開「Webhook」。不關掉自動回應的話,每句話都會多冒出一則官方罐頭回覆。
- 「帳號設定」:打開「允許帳號加入群組或多人聊天室」。沒開的話,邀不進家庭群組。
接著到 LINE Developers Console,點進剛剛的 Provider,再點同名的 channel。這裡要抄三樣東西,先貼在記事本,不要傳到任何群組:
| 位置 | 要抄的 | 填到 .env 的 |
|---|---|---|
| Basic settings › Channel secret | 驗證「訊息真的是 LINE 送來的」用的密鑰 | LINE_CHANNEL_SECRET |
| Basic settings › Your user ID | 你自己的 LINE userId(U 開頭) | OWNER_USER_ID |
| Messaging API › Channel access token (long-lived) › Issue | 讓程式代表官方帳號發訊息的鑰匙 | LINE_CHANNEL_ACCESS_TOKEN |
這兩把(secret 和 token)等於官方帳號的密碼,外流的話別人可以冒用你的帳號發訊息。萬一不小心貼出去,回到同一頁按 Reissue 換新的就好。
四、讓 Claude Code 把專案建起來
打開終端機,切到平常放專案的資料夾,先把範本抓下來,再開 Claude Code:
git clone https://github.com/Imeipopo/claude-line-family-bot.git
cd claude-line-family-bot
claude
接著把下面這段交給 Claude:
這是一個 LINE 家庭群組機器人的範本,我在照部落格教學一步一步做。
請先讀 README.md 和 steps/ch1_echo.py,用三五句話跟我說 ch1_echo.py 在做什麼。
然後幫我:
1. 用 python3 -m venv venv 建虛擬環境,安裝 requirements.txt
2. 把 .env.example 複製成 .env
3. 告訴我 .env 裡哪三個欄位要我自己填(我會自己貼,不要把金鑰印在畫面上)
為什麼要先請它解釋?因為接下來五篇都會在這份程式上長功能。先讓 Claude 用白話講一遍,比你自己硬讀快很多,有看不懂的地方直接追問就好。
把上一步抄的三個值貼進 .env 存檔。ANTHROPIC_API_KEY 這篇還用不到,先空著。
這段程式在做什麼
steps/ch1_echo.py 是整個系列最小的版本,只有幾十行。最重要的是這段:
@app.post("/webhook")
async def webhook(request: Request, x_line_signature: str = Header(None)) -> dict:
body = (await request.body()).decode("utf-8")
try:
events = parser.parse(body, x_line_signature or "")
except InvalidSignatureError:
raise HTTPException(status_code=400, detail="invalid signature")
@app.post("/webhook") 宣告「有人 POST 到 /webhook 時,執行下面這個函式」,這就是 LINE 要打的那支電話。
parser.parse 做了一件很重要的事:驗簽章。LINE 每次送訊息,都會用你的 Channel secret 對整包內容算一個 HMAC-SHA256 雜湊,放在 X-Line-Signature 標頭裡。程式用同一把 secret 再算一次,兩邊一樣,才代表訊息真的來自 LINE、中途沒被改過。
你的網址是公開的,任何人都能 POST 進來。少了這一步,陌生人就能假冒家人跟機器人講話,甚至花掉你的 API 費用。
驗過之後,程式把每則文字訊息原封不動回傳,並且把來源印在終端機:
print(f"type={source.type} user_id={source.user_id} "
f"group_id={getattr(source, 'group_id', None)} text={event.message.text}", flush=True)
這行是故意留的,第三篇設定「只有誰能用」時,就要從這裡抄 id。
五、開對外網址,接上 LINE
開兩個終端機視窗。第一個啟動程式:
venv/bin/python steps/ch1_echo.py
看到 Uvicorn running on http://127.0.0.1:8001 就是在等訊息了。第二個視窗安裝並啟動 Cloudflare 的快速通道:
brew install cloudflared
cloudflared tunnel --url http://127.0.0.1:8001
畫面會印出一個 https://xxxx-xxxx.trycloudflare.com 的網址。回到 LINE Developers Console › Messaging API › Webhook settings:
- Webhook URL 貼上 那個網址再加上
/webhook - 按 Verify,出現 Success 就代表 LINE 打得到你的程式
- 確認 Use webhook 是打開的
快速通道不用註冊,拿來測試最方便。缺點是每次重開,網址都會換,換了就要回後台重貼。第五篇會換成固定網址。
六、驗收
- 在 Messaging API 頁面掃 QR code,把官方帳號加為好友。
- 私訊它「哈囉」,它應該回「你說:哈囉」。
- 看第一個終端機,會多一行
type=user user_id=U...。
如果你家人已經在用這個 LINE 帳號,也可以把官方帳號邀進一個測試群組(先不要直接進家庭群組),在群組裡說話,終端機會印出 type=group 和 group_id。
最後拿機器人自己的 userId,第三篇判斷「有沒有被 @」要用。請 Claude 幫你查:
請用 .env 裡的 LINE_CHANNEL_ACCESS_TOKEN 呼叫 LINE 的 GET https://api.line.me/v2/bot/info,
把回應裡的 userId 填進 .env 的 BOT_USER_ID。不要把 token 印出來。
卡住時先看這裡
| 症狀 | 多半是 |
|---|---|
| Verify 失敗 | 程式沒開、網址少了 /webhook,或快速通道重開後網址換了 |
| 每句話回兩次,其中一句是罐頭訊息 | 「自動回應訊息」沒關 |
| 終端機出現 400 invalid signature | .env 的 Channel secret 貼錯,或多了空白 |
| 回覆時出現 401 | Channel access token 貼錯或已經 Reissue 過 |
| 邀不進群組 | 「允許帳號加入群組或多人聊天室」沒開 |
下一篇把鸚鵡換成真正會思考的大腦:接上 Claude,順便聊聊模型該怎麼選,以及一個月大概要花多少錢。