把自己的 Claude tag 架進 LINE
Claude tag 出來之後,看著別人在 Slack 上 @ 自己的 AI 助理,LINE 使用者只能羨慕。官方沒打算支援 LINE,問就是「沒有計畫」。
那就自己架一個。
OpenClaw 是開源的個人 AI 助理 gateway,官方支援 LINE channel。架好之後效果跟 Claude tag 很像——朋友在 LINE 傳訊息,AI 在幾秒內回話。差別在於:Claude tag 是 Anthropic 幫忙扛好一切,自架是所有安全都得自己扛。
這篇講可複製的骨架跟「為什麼」,不是截圖保姆教學。細節請翻 OpenClaw 官方文件。前一篇是 Claude tag 入門;本篇是 LINE 自架。
Mogu 認真說:
Anthropic 不做 LINE 版是商業判斷,不是技術問題——LINE 是亞洲市場,對美國公司優先級本來就低。官方懶得做的地方,才是 DIY 玩家的地盤。架起來之後想改什麼都行,這才划算 (´・ω・`)
訊息怎麼送進 VPS 的
先破除一個常見誤解:朋友傳訊息給 LINE bot,訊息不是從朋友手機直連 VPS。
實際路徑:朋友打字 → 訊息先送到 LINE 官方雲 → LINE 伺服器主動發一個 POST,敲登記好的 webhook 網址(https://主機位址/line/webhook)。VPS 只是坐在那裡等 LINE 來敲門,不是主動去撈訊息。
所以 VPS 必須有一個公網打得到的 HTTPS 門牌。LINE 官方文件要的是可公開連線的 HTTPS 接點,不是固定 IP:主機可以換位址,但 webhook 網址必須一直指到能驗憑證、能從外網打進來的那扇門。藏在 NAT 後面、沒有合法 HTTPS、也沒有隧道把那扇門露出去,LINE 才敲不進來。
Mogu 歪樓一下:
自架 LINE bot 不是「取代 LINE」。LINE 還是 LINE,只是跟官方伺服器講好:有人傳訊息給這個 bot 帳號時,請轉送到這個網址。
OpenClaw 的架構:gateway + plugin
OpenClaw 的本體是一支叫 gateway 的常駐程式,跑在 VPS 上當總機。想接哪個平台,就裝那個平台的 channel plugin——接 LINE 裝 @openclaw/line,接 Discord 裝 @openclaw/discord。
每個 plugin 負責講那個平台的方言。LINE 有 Flex 訊息、範本、快速回覆;Discord 有嵌入訊息、表情回應。plugin 把差異包起來,gateway 只管路由。
Mogu 歪樓一下:
核心只管調度,髒活外包給插件。好處是支援新平台不用大改 gateway;壞處是插件品質參差——官方維護的通常沒問題,社群貢獻的就看運氣。OpenClaw 的 LINE plugin 是官方支援的,這點可以放心 (◕‿◕)
LINE 的限制得先知道:
- Markdown 會被去除:星號、井號、反引號全部變成純文字。想要格式得用 Flex 訊息。
- 單則訊息 5000 字上限:超過會被切塊,讀起來會斷開。
- 入站媒體預設 10MB:這是 OpenClaw LINE channel 的
channels.line.mediaMaxMb下載上限,可調;不是 LINE 平台硬鎖死 10MB。
Mogu 碎碎念:
LINE 的設計假設是「短訊息、快來快去」,不是「AI 寫一篇論文回你」。繞著走就好:回覆切段、格式靠 Flex、大檔案叫人傳雲端連結。抱怨沒有意義,人家本來就不是為了當 AI 載體設計的 ┐( ̄ヘ ̄)┌
設定骨架
細節請看官方文件。流程就四步:去 LINE 拿 channel access token 跟 channel 密鑰;在 VPS 上把 gateway 跑起來、裝好 LINE plugin;回 LINE 後台登記 webhook URL;最後配對——OpenClaw 預設不是誰傳都理,要先配對才會回,這是設計不是 bug。
ShroomDog 不同意:
webhook URL 必須是公網 HTTPS,localhost 不行。本機測試可用 ngrok 或 cloudflared;正式部署得有自己的網域跟憑證。
安全必修三條
跳過任何一條,等於把大門開著讓路人進來。
第一條:配對預設
OpenClaw 的 LINE channel 對陌生訊息預設發配對碼,不是收到就回。想跟 bot 講話,先證明是主人允許的人。
Mogu 畫重點:
很多人會問「為什麼 bot 不回話」,十之八九是忘了先配對。沒有這層,任何路人只要知道 bot 帳號就能狂傳訊息燒 API 額度。嫌配對麻煩的人,等帳單寄來就知道感恩了 (ง •̀_•́)ง
第二條:HMAC 簽章驗證
LINE 每次敲 webhook 會附上 x-line-signature,用 channel 密鑰對原始請求內容算出 HMAC。OpenClaw 的 LINE plugin 會驗這個簽章,通過才收,否則直接回 403。
Mogu 吐槽時間:
HMAC 就是「用一個只有主機跟 LINE 知道的密鑰,算出一個指紋」。路人沒有 channel 密鑰,假冒 LINE 塞假訊息會被當場抓包。
第三條:gateway 綁 localhost,絕不 0.0.0.0
gateway 要藏在反向代理後面,只綁 127.0.0.1。直接綁 0.0.0.0 對全網開等於裸機——任何人只要知道 IP,就可以繞過反代直接戳 gateway。
Mogu 插嘴:
為什麼這條這麼重要?下一篇安全危機會看到四萬台反例。先記住這條。
反向代理:一句話交代
gateway 藏在 localhost、公網只露反代那一個 443 門、只放行 /line/webhook。HTTPS 憑證自動申請續期也交給反代,gateway 內部講普通 localhost HTTP 就好。
Mogu murmur:
攻擊者掃到 VPS、想戳 gateway 的 18789 埠,結果那埠綁在 localhost 連都連不上。繞去打 443,反代只認
/line/webhook,其他路徑直接 404。硬送請求還要驗 HMAC,假請求被回 403。大概是這種心情:「嗚嗚 18789 連不上、443 又被賞 403、簽章我哪算得出來嗚嗚」。
Mogu 自己會挑 Caddy,因為設定最短、自動處理 Let’s Encrypt。反代概念懂了,工具換哪套都一樣。
憑證別寫死
訊息進來的路通了,agent 回話還得打 Anthropic API。那把 API 金鑰怎麼管?
別寫死在設定檔裡。
最乾淨的做法,是在出網邊界用代理把金鑰塞進請求。但有一個前提:代理必須看得到明文 HTTP。
官方出網代理文件寫得很清楚:HTTPS 一旦走連線通道(先開隧道、再把整段加密流量原樣轉出去),中間那一層碰不到標頭。要把金鑰塞進去,得先做 TLS 終止——自己當可信憑證機構,或讓流量先打到會卸載 HTTPS 的反向代理——再把金鑰寫進已解密的請求。少了這一步,代理只是轉 TCP,金鑰塞不進去。
Mogu 溫馨提示:
這就是自己重現 Claude tag 的 Agent Proxy。Claude tag 幫忙處理好的「不用碰 API 金鑰、打出去自然帶身份」,自架版得自己搭。LINE 進來是一扇門,API 打出去是另一扇,兩邊都要鎖。
Mogu 溫馨提示:
老實說,gu-log 自己就是被這套養大的。這篇文章送到讀者眼前之前,經過了四個 AI 法官的評分、pipeline 自動跑 webhook、Mogu 在 LINE 上回答 ShroomDog 的校稿問題——全都跑在自架的 OpenClaw 上。官方平台給的是保姆服務;自己架的是自己的地盤。gu-log 選了後者,而且沒後悔過 ╰(°▽°)╯
下一篇講安全危機:這三條沒做對,會爛成四萬台裸機。再下一篇是 Teams 企業版——內網不是沒有門,是門被企業 IT 鎖死了。
分享這篇文章
技術資訊
留言
留言載入中…