在 Telegram 群組中設定 OpenClaw——設定、權限、多 Agent
OpenClaw 的 Telegram 整合不只是一對一聊天。當你把 bot 加入群組,它就變成了一個可以參與團隊對話的 AI 助手——回答技術問題、幫忙整理會議記錄、甚至與其他 Agent 協作。
但群組環境比私聊複雜得多。你需要處理的問題包括:bot 什麼時候該回應、什麼時候該安靜?如何防止它被群組中的垃圾訊息觸發?多個 Agent 在同一個群組裡怎麼分工?
本文會從最基礎的「把 bot 加入群組」開始,一步步帶你建立一個穩定、好用的群組 AI 助手環境。
前置條件
在開始之前,你需要:
- 一個已經完成
openclaw onboard的 OpenClaw 實例(本地或伺服器皆可) - 一個已透過 BotFather 建立的 Telegram bot[1]
- OpenClaw 已設定好 Telegram 連線(
openclaw.json中的telegram區塊)
如果你還沒設定 Telegram bot,先完成基本設定:
openclaw pairing start telegram
按照指示輸入 BotFather 給你的 bot token,然後在 Telegram 中與 bot 開始對話、完成配對。
第一步:將 bot 加入群組
在 Telegram 中:
- 開啟你要新增 bot 的群組
- 點擊群組名稱 → 「新增成員」
- 搜尋你的 bot 名稱(例如
@YourOpenClawBot) - 將它加入群組
加入後,bot 暫時還不會回應群組訊息。你需要先取得群組 ID,然後在 OpenClaw 設定中啟用群組功能。
第二步:取得群組 ID
這是最多人卡關的步驟。Telegram 群組的 ID 是一個負數(例如 -1001234567890),不像使用者 ID 那樣容易取得。
方法一:從 OpenClaw 日誌取得(推薦)
OpenClaw 的 gateway 會在日誌中記錄收到的訊息,包含 chat ID。
先在群組中發一條訊息(任何內容),然後查看 gateway 日誌:
# 如果用 systemd 管理
journalctl --user -u openclaw.service -f
# 如果在終端機直接運行
# 日誌直接輸出在終端機中
你會看到類似這樣的日誌:
[telegram] received message from chat_id: -1001234567890, type: group
[telegram] message ignored: group chat not configured
記下這個 chat_id。
方法二:使用 Telegram Bot API
如果日誌方法不便(例如日誌量太大),可以直接呼叫 Bot API:
# 用你的 bot token 替換 <BOT_TOKEN>
curl -s "https://api.telegram.org/bot<BOT_TOKEN>/getUpdates" | python3 -m json.tool
注意:如果 OpenClaw 正在 polling(也就是 gateway 在運行中),
getUpdates可能會回傳空陣列,因為訊息已經被 OpenClaw 消費掉了。這種情況下請用方法一。
方法三:暫停 gateway 後使用 getUpdates
# 暫停 OpenClaw gateway
openclaw gateway stop
# 在群組中發一條訊息,然後呼叫 API
curl -s "https://api.telegram.org/bot<BOT_TOKEN>/getUpdates" | \
python3 -c "
import json, sys
data = json.load(sys.stdin)
for result in data.get('result', []):
chat = result.get('message', {}).get('chat', {})
if chat.get('type') in ('group', 'supergroup'):
print(f\"Group: {chat.get('title')} -> ID: {chat.get('id')}\")
"
# 記得重啟 gateway
openclaw gateway start
第三步:設定 openclaw.json 的群組區塊
取得群組 ID 後,編輯你的 OpenClaw 設定檔:
# 設定檔通常在這裡
nano ~/.config/openclaw/openclaw.json
在 telegram 區塊中加入 groups 設定:
{
"telegram": {
"botToken": "your-bot-token",
"groups": {
"-1001234567890": {
"enabled": true,
"groupPolicy": "mention-only",
"requireMention": true,
"allowedUsers": [],
"agentId": "default"
}
}
}
}
重啟 gateway 讓設定生效:
openclaw gateway restart
群組設定參數詳解
groupPolicy
控制 bot 在群組中的回應策略:
| 值 | 行為 |
|---|---|
mention-only |
只在被 @mention 時回應(推薦) |
all-messages |
回應所有訊息(慎用) |
reply-only |
只在被 reply 時回應 |
keyword |
符合關鍵字時回應 |
{
"groupPolicy": "mention-only"
}
強烈建議使用 mention-only。如果設成 all-messages,bot 會對群組中每一條訊息做出回應,不但消耗大量 API 額度,還會讓群組對話難以閱讀。
requireMention
{
"requireMention": true
}
當設為 true,使用者必須用 @YourBotName 標記 bot 才會觸發回應。即使 groupPolicy 設為 all-messages,這個旗標也能作為額外的安全閥。
allowedUsers
限制哪些使用者可以觸發 bot 回應:
{
"allowedUsers": [123456789, 987654321]
}
空陣列 [] 表示允許所有群組成員。如果你只想讓特定人使用 bot,填入他們的 Telegram user ID。
取得使用者 ID 的方式:讓他們私訊 bot,然後從日誌中查看 user_id。
agentId
指定這個群組使用哪個 Agent 設定:
{
"agentId": "research-agent"
}
這對應到你在 agents/ 目錄下定義的 Agent。不同群組可以使用不同的 Agent。
@mention 行為細節
當 requireMention 為 true 時,以下情境會觸發 bot 回應:
@YourBotName 幫我查一下這個 API 的文件
這個 bug 怎麼修?@YourBotName
@YourBotName
(直接 mention 不帶內容,bot 會回應一個歡迎/幫助訊息)
以下情境不會觸發回應:
這個 YourBotName 好像很好用
(只是文字提到名稱,不是 @mention)
昨天有人說 @SomeOtherBot 比較好
(mention 的不是你的 bot)
回覆(Reply)作為隱式 mention
有一個重要行為:回覆 bot 的訊息等同於 @mention。
也就是說,如果有人回覆 bot 之前發的訊息,bot 會把它當作新的提問來回應,即使訊息內容沒有 @mention。這讓對話流更自然——使用者可以用 reply 串起多輪對話,而不用每次都打 @BotName。
{
"treatReplyAsMention": true
}
預設為 true。如果你不想要這個行為,設為 false。
多 Agent 群組設定
這是 OpenClaw 群組功能最強大的特性之一:你可以在同一個群組中部署多個 Agent,每個 Agent 有不同的專長。
架構概念
假設你的團隊有一個技術討論群組,你想要:
- 一個「程式碼審查 Agent」——專門回答程式碼相關問題
- 一個「文件搜尋 Agent」——專門從內部文件庫找資料
- 一個「會議記錄 Agent」——幫忙整理對話重點
設定方式
首先,在 agents/ 目錄下建立各 Agent 的設定:
~/.config/openclaw/agents/
code-review.md
doc-search.md
meeting-notes.md
code-review.md 範例:
# Code Review Agent
你是一個程式碼審查專家。當團隊成員在群組中分享程式碼片段或詢問程式碼相關問題時,
提供詳細的審查意見,包括:
- 潛在的 bug
- 效能問題
- 最佳實踐建議
- 安全性考量
只回應與程式碼直接相關的問題。其他類型的問題交給群組中的其他 Agent 處理。
然後在 openclaw.json 中設定多 bot 的群組:
{
"telegram": {
"groups": {
"-1001234567890": {
"enabled": true,
"groupPolicy": "mention-only",
"agents": [
{
"botToken": "bot-token-for-code-reviewer",
"agentId": "code-review",
"botUsername": "CodeReviewBot"
},
{
"botToken": "bot-token-for-doc-search",
"agentId": "doc-search",
"botUsername": "DocSearchBot"
},
{
"botToken": "bot-token-for-meeting-notes",
"agentId": "meeting-notes",
"botUsername": "MeetingNotesBot"
}
]
}
}
}
}
注意:每個 Agent 需要一個獨立的 Telegram bot。你需要在 BotFather 建立三個不同的 bot。
使用者互動方式
群組成員可以用 @mention 指定要哪個 Agent 回應:
@CodeReviewBot 這段 SQL 查詢有什麼問題?
SELECT * FROM users WHERE id = '${input}';
@DocSearchBot 我們的 API rate limiting 規則是什麼?
@MeetingNotesBot 幫我整理過去一小時的討論重點
Lobstalk 技能:Agent 間協作
OpenClaw 的 lobstalk skill 讓 Agent 之間可以互相溝通[2]。當一個 Agent 判斷問題不在自己的專長範圍,它可以主動將問題轉交給另一個 Agent。
在 Agent 的設定中啟用 lobstalk:
# Code Review Agent
## Skills
- lobstalk
## Handoff Rules
如果使用者的問題與內部文件相關(而非程式碼),
使用 lobstalk 將問題轉交給 @DocSearchBot。
這讓使用者不需要知道該問哪個 bot——任何一個 bot 都能當入口,再由 Agent 之間的協作來找到最適合的回答者。
BotFather 隱私模式
這是一個容易被忽略但非常重要的設定。
Telegram bot 預設啟用「隱私模式」(Privacy Mode)[3]。在隱私模式下,群組中的 bot 只能收到:
- 直接 @mention 它的訊息
- 回覆它的訊息
- 指令(以
/開頭的訊息) - 群組中的 service 訊息(成員加入/離開等)
它收不到其他成員的一般聊天訊息。
如果你用 mention-only 策略
隱私模式可以保持開啟,因為 bot 只需要收到 @mention 的訊息,這與隱私模式的行為一致。
如果你用 all-messages 策略
你需要關閉隱私模式,否則 bot 會漏掉大量訊息。
在 BotFather 中操作:
/mybots → 選擇你的 bot → Bot Settings → Group Privacy → Turn off
關閉隱私模式後,bot 可以看到群組中的所有訊息。確保你的 Agent 設定中有適當的過濾邏輯,避免對不相關的訊息做出回應。
如果你用 keyword 策略
也需要關閉隱私模式,因為 bot 需要讀取所有訊息來匹配關鍵字。
| groupPolicy | 需要關閉隱私模式? |
|---|---|
mention-only |
否(建議保持開啟) |
reply-only |
否 |
all-messages |
是 |
keyword |
是 |
防止垃圾訊息
群組環境的一大挑戰是垃圾訊息。如果有人故意或無意地大量觸發 bot,會消耗你的 API 額度,也可能影響群組的正常使用。
Rate Limiting
在群組設定中加入速率限制:
{
"-1001234567890": {
"enabled": true,
"groupPolicy": "mention-only",
"rateLimit": {
"messagesPerMinute": 10,
"messagesPerHour": 100,
"perUser": {
"messagesPerMinute": 3,
"messagesPerHour": 30
}
}
}
}
這個設定表示:
- 整個群組每分鐘最多觸發 10 次 bot 回應
- 每小時最多 100 次
- 單一使用者每分鐘最多 3 次,每小時最多 30 次
超過限制時,bot 會靜默忽略訊息(不會發送「你太頻繁了」之類的回應,以免造成更多噪音)。
忽略轉發訊息
轉發訊息通常不是要問 bot 的內容。你可以設定忽略它們:
{
"ignoreForwarded": true
}
最小訊息長度
太短的訊息通常沒有足夠的上下文讓 Agent 產生有意義的回應:
{
"minMessageLength": 10
}
封鎖特定使用者
如果有使用者持續濫用 bot,你可以在設定中封鎖他們:
{
"blockedUsers": [111222333]
}
每個群組的自訂設定
不同群組可能需要不同的行為。OpenClaw 允許你為每個群組設定獨立的參數:
{
"telegram": {
"groups": {
"-1001234567890": {
"enabled": true,
"groupPolicy": "mention-only",
"agentId": "technical-support",
"language": "zh-TW",
"maxResponseLength": 2000,
"rateLimit": {
"messagesPerMinute": 10
}
},
"-1009876543210": {
"enabled": true,
"groupPolicy": "all-messages",
"agentId": "casual-chat",
"language": "en",
"maxResponseLength": 500,
"rateLimit": {
"messagesPerMinute": 20
}
}
}
}
}
- 第一個群組(
-1001234567890)是技術支援群,用中文回應,每次回應最多 2000 字 - 第二個群組(
-1009876543210)是閒聊群,用英文回應,回應簡短些但允許更高的觸發頻率
群組管理命令
OpenClaw 提供了一些方便的管理命令,可以直接在群組中使用:
透過 CLI
# 列出所有已設定的群組
openclaw telegram groups list
# 查看特定群組的狀態
openclaw telegram groups status -1001234567890
# 暫時停用群組(不需要修改設定檔)
openclaw telegram groups disable -1001234567890
# 重新啟用
openclaw telegram groups enable -1001234567890
# 查看群組的使用統計
openclaw telegram groups stats -1001234567890
群組內的 slash 命令
你可以在 BotFather 設定 bot 支援的命令,然後在群組中使用:
/status - 查看 bot 狀態
/help - 顯示使用說明
/stats - 顯示今日使用統計
在 BotFather 中設定:
/setcommands → 選擇你的 bot → 輸入命令列表
status - 查看 bot 狀態
help - 顯示使用說明
stats - 顯示今日使用統計
常見問題
Bot 加入群組後完全沒反應
確認清單:
- 群組 ID 是否正確?(注意負號和長度)
enabled是否為true?- 如果用
all-messages策略,BotFather 的隱私模式是否已關閉? - Gateway 是否已重啟?(修改設定後需要重啟)
- 日誌中是否有收到訊息的記錄?
Bot 在私聊正常但群組中不回應
最常見的原因是隱私模式。確認你的 groupPolicy 與隱私模式設定一致(見上面的表格)。
Bot 回應了不該回應的訊息
檢查:
groupPolicy是否設成了all-messagesrequireMention是否為false- 是否有其他 bot 的訊息被誤判為 mention
群組 ID 取得後 bot 還是不回應
Telegram 有兩種群組:普通群組和超級群組(supergroup)。當一個普通群組升級為超級群組時,群組 ID 會改變[4]。如果你在升級前取得了 ID,需要重新取得。
不想自己維護?
如果你管理多個 Telegram 群組,每個群組有不同的 Agent 設定和權限需求,維護起來會越來越複雜。ClawTank 提供了圖形化的群組管理介面,可以在瀏覽器中直接設定群組策略、查看使用統計、管理 Agent 分配,不需要手動編輯 JSON 設定檔。
總結
在 Telegram 群組中使用 OpenClaw,核心設定流程是:
- 將 bot 加入群組
- 從日誌取得群組 ID
- 在
openclaw.json中設定群組參數 - 選擇適當的
groupPolicy(推薦mention-only) - 重啟 gateway
進階功能包括:
- 多 Agent 協作(每個 Agent 用獨立的 Telegram bot)
- Agent 間的 lobstalk 轉交
- 精細的 rate limiting 和使用者管理
- 每個群組的獨立設定
記住一個原則:群組設定寧可保守。先從 mention-only 開始,確認運作正常後再根據需求調整。把 all-messages 留給你確定需要它的場景。
