พร้อมใช้งานจริงสำหรับ DM ของบอตและกลุ่มผ่าน grammY โหมดเริ่มต้นคือ long polling; โหมด Webhook เป็นตัวเลือกDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
การจับคู่
การแก้ปัญหาช่องทาง
การกำหนดค่า Gateway
ตั้งค่าอย่างรวดเร็ว
สร้างโทเค็นบอตใน BotFather
@BotFather ตรงตามนี้)เรียกใช้ /newbot ทำตามพรอมป์ แล้วบันทึกโทเค็นไว้กำหนดค่าโทเค็นและนโยบาย DM
TELEGRAM_BOT_TOKEN=... (เฉพาะบัญชีเริ่มต้น)
Telegram ไม่ ใช้ openclaw channels login telegram; ให้กำหนดค่าโทเค็นใน config/env แล้วเริ่ม Gatewayเพิ่มบอตเข้ากลุ่ม
- ID ผู้ใช้ Telegram ของคุณ ซึ่งใช้ใน
allowFrom/groupAllowFrom - ID แชตกลุ่ม Telegram ซึ่งใช้เป็นคีย์ภายใต้
channels.telegram.groups
openclaw logs --follow, บอต forwarded-ID หรือ Bot API getUpdates หลังจากอนุญาตกลุ่มแล้ว /whoami@<bot_username> สามารถยืนยัน ID ผู้ใช้และ ID กลุ่มได้ID ซูเปอร์กรุ๊ป Telegram แบบค่าลบที่ขึ้นต้นด้วย -100 คือ ID แชตกลุ่ม ให้ใส่ไว้ใต้ channels.telegram.groups ไม่ใช่ใต้ groupAllowFromTELEGRAM_BOT_TOKEN ใช้กับบัญชีเริ่มต้นเท่านั้นการตั้งค่าฝั่ง Telegram
โหมดความเป็นส่วนตัวและการมองเห็นในกลุ่ม
โหมดความเป็นส่วนตัวและการมองเห็นในกลุ่ม
- ปิดโหมดความเป็นส่วนตัวผ่าน
/setprivacyหรือ - ทำให้บอตเป็นผู้ดูแลกลุ่ม
สิทธิ์ของกลุ่ม
สิทธิ์ของกลุ่ม
ตัวสลับ BotFather ที่มีประโยชน์
ตัวสลับ BotFather ที่มีประโยชน์
/setjoingroupsเพื่ออนุญาต/ปฏิเสธการเพิ่มเข้ากลุ่ม/setprivacyสำหรับพฤติกรรมการมองเห็นในกลุ่ม
การควบคุมการเข้าถึงและการเปิดใช้งาน
- นโยบาย DM
- นโยบายกลุ่มและ allowlist
- พฤติกรรมการ mention
channels.telegram.dmPolicy ควบคุมการเข้าถึงข้อความโดยตรง:pairing(ค่าเริ่มต้น)allowlist(ต้องมี ID ผู้ส่งอย่างน้อยหนึ่งรายการในallowFrom)open(ต้องให้allowFromรวม"*")disabled
dmPolicy: "open" พร้อม allowFrom: ["*"] ทำให้บัญชี Telegram ใดก็ตามที่พบหรือเดาชื่อผู้ใช้ของบอตได้สามารถสั่งงานบอตได้ ใช้เฉพาะกับบอตสาธารณะที่ตั้งใจให้เปิดใช้ โดยมีเครื่องมือที่จำกัดอย่างเข้มงวด; บอตเจ้าของคนเดียวควรใช้ allowlist พร้อม ID ผู้ใช้แบบตัวเลขchannels.telegram.allowFrom รับ ID ผู้ใช้ Telegram แบบตัวเลข พรีฟิกซ์ telegram: / tg: ยอมรับได้และจะถูกทำให้เป็นรูปแบบมาตรฐาน
ใน config หลายบัญชี ค่า channels.telegram.allowFrom ระดับบนที่เข้มงวดจะถูกปฏิบัติเป็นขอบเขตความปลอดภัย: รายการ allowFrom: ["*"] ระดับบัญชีจะไม่ทำให้บัญชีนั้นเป็นสาธารณะ เว้นแต่ allowlist ของบัญชีที่มีผลหลังรวมแล้วยังคงมี wildcard อย่างชัดเจน
dmPolicy: "allowlist" พร้อม allowFrom ว่างจะบล็อก DM ทั้งหมดและถูกปฏิเสธโดยการตรวจสอบ config
การตั้งค่าจะถามเฉพาะ ID ผู้ใช้แบบตัวเลข
หากคุณอัปเกรดแล้ว config ของคุณมีรายการ allowlist แบบ @username ให้เรียกใช้ openclaw doctor --fix เพื่อ resolve รายการเหล่านั้น (พยายามให้ดีที่สุด; ต้องใช้โทเค็นบอต Telegram)
หากก่อนหน้านี้คุณพึ่งพาไฟล์ allowlist ของ pairing-store, openclaw doctor --fix สามารถกู้รายการเข้าสู่ channels.telegram.allowFrom ในโฟลว์ allowlist ได้ (เช่น เมื่อ dmPolicy: "allowlist" ยังไม่มี ID ที่ระบุชัดเจน)สำหรับบอตเจ้าของคนเดียว ให้เลือกใช้ dmPolicy: "allowlist" พร้อม ID allowFrom แบบตัวเลขที่ระบุชัดเจน เพื่อให้นโยบายการเข้าถึงคงทนใน config (แทนการขึ้นกับการอนุมัติการจับคู่ก่อนหน้า)ความสับสนที่พบบ่อย: การอนุมัติการจับคู่ DM ไม่ได้หมายความว่า “ผู้ส่งรายนี้ได้รับอนุญาตทุกที่”
การจับคู่ให้สิทธิ์เข้าถึง DM หากยังไม่มีเจ้าของคำสั่ง การจับคู่ที่อนุมัติครั้งแรกยังตั้งค่า commands.ownerAllowFrom เพื่อให้คำสั่งเฉพาะเจ้าของและการอนุมัติ exec มีบัญชีผู้ปฏิบัติการที่ชัดเจน
การอนุญาตผู้ส่งในกลุ่มยังมาจาก allowlist ใน config ที่ระบุชัดเจน
หากคุณต้องการ “ฉันได้รับอนุญาตครั้งเดียว แล้วทั้ง DM และคำสั่งกลุ่มใช้งานได้” ให้ใส่ ID ผู้ใช้ Telegram แบบตัวเลขของคุณใน channels.telegram.allowFrom; สำหรับคำสั่งเฉพาะเจ้าของ ให้ตรวจสอบว่า commands.ownerAllowFrom มี telegram:<your user id>การหา ID ผู้ใช้ Telegram ของคุณ
วิธีที่ปลอดภัยกว่า (ไม่มีบอตบุคคลที่สาม):- DM ไปยังบอตของคุณ
- เรียกใช้
openclaw logs --follow - อ่าน
from.id
@userinfobot หรือ @getidsbotพฤติกรรม runtime
- Telegram เป็นของกระบวนการ Gateway
- การ routing เป็นแบบกำหนดแน่นอน: ข้อความขาเข้า Telegram จะตอบกลับไปยัง Telegram (โมเดลไม่ได้เลือกช่องทาง)
- ข้อความขาเข้าจะถูก normalize เป็น envelope ช่องทางร่วม พร้อม metadata การตอบกลับ, media placeholders และบริบท reply-chain ที่บันทึกถาวรสำหรับการตอบกลับ Telegram ที่ Gateway สังเกตเห็น
- session กลุ่มถูกแยกตาม ID กลุ่ม หัวข้อ forum จะเติม
:topic:<threadId>เพื่อแยกหัวข้อออกจากกัน - ข้อความ DM สามารถมี
message_thread_id; OpenClaw รักษา ID เธรดไว้สำหรับการตอบกลับ แต่คง DM ไว้ใน session แบบ flat โดยค่าเริ่มต้น กำหนดค่าchannels.telegram.dm.threadReplies: "inbound",channels.telegram.direct.<chatId>.threadReplies: "inbound",requireTopic: trueหรือ config หัวข้อที่ตรงกัน เมื่อคุณตั้งใจต้องการแยก session หัวข้อของ DM - Long polling ใช้ grammY runner พร้อมการจัดลำดับต่อแชต/ต่อเธรด concurrency ของ runner sink โดยรวมใช้
agents.defaults.maxConcurrent - Long polling ถูกป้องกันภายในแต่ละกระบวนการ Gateway เพื่อให้มี poller ที่ active เพียงหนึ่งตัวเท่านั้นที่ใช้โทเค็นบอตได้ในแต่ละครั้ง หากคุณยังเห็นความขัดแย้ง
getUpdates409 แสดงว่า Gateway ของ OpenClaw อีกตัว สคริปต์ หรือ poller ภายนอกน่าจะกำลังใช้โทเค็นเดียวกัน - การ restart ของ watchdog สำหรับ long-polling จะ trigger หลังจากไม่มี liveness ของ
getUpdatesที่เสร็จสมบูรณ์เป็นเวลา 120 วินาทีโดยค่าเริ่มต้น เพิ่มchannels.telegram.pollingStallThresholdMsเฉพาะเมื่อ deployment ของคุณยังเห็นการ restart จาก polling-stall แบบ false ระหว่างงานที่ใช้เวลานาน ค่านี้มีหน่วยเป็นมิลลิวินาทีและอนุญาตตั้งแต่30000ถึง600000; รองรับ override ต่อบัญชี - Telegram Bot API ไม่รองรับ read-receipt (
sendReadReceiptsไม่ใช้กับกรณีนี้)
อ้างอิงฟีเจอร์
พรีวิวสตรีมสด (การแก้ไขข้อความ)
พรีวิวสตรีมสด (การแก้ไขข้อความ)
- แชตโดยตรง: ข้อความพรีวิว +
editMessageText - กลุ่ม/หัวข้อ: ข้อความพรีวิว +
editMessageText
channels.telegram.streamingคือoff | partial | block | progress(ค่าเริ่มต้น:partial)progressเก็บร่างสถานะที่แก้ไขได้ไว้หนึ่งรายการสำหรับความคืบหน้าของเครื่องมือ ล้างเมื่อเสร็จสมบูรณ์ และส่งคำตอบสุดท้ายเป็นข้อความปกติstreaming.preview.toolProgressควบคุมว่าการอัปเดตเครื่องมือ/ความคืบหน้าจะใช้ข้อความตัวอย่างที่แก้ไขแล้วข้อความเดิมซ้ำหรือไม่ (ค่าเริ่มต้น:trueเมื่อการสตรีมตัวอย่างเปิดใช้งานอยู่)streaming.preview.commandTextควบคุมรายละเอียดคำสั่ง/การดำเนินการภายในบรรทัดความคืบหน้าของเครื่องมือเหล่านั้น:raw(ค่าเริ่มต้น, รักษาพฤติกรรมที่เผยแพร่แล้วไว้) หรือstatus(ป้ายกำกับเครื่องมือเท่านั้น)- ตรวจพบค่าเดิม
channels.telegram.streamModeและค่า boolean ของstreaming; รันopenclaw doctor --fixเพื่อย้ายค่าเหล่านั้นไปยังchannels.telegram.streaming.mode
v2026.4.22 และหลังจากนั้น หากต้องการเก็บตัวอย่างที่แก้ไขได้สำหรับข้อความคำตอบแต่ซ่อนบรรทัดความคืบหน้าของเครื่องมือ ให้ตั้งค่า:progress เมื่อคุณต้องการความคืบหน้าของเครื่องมือที่มองเห็นได้โดยไม่แก้ไขคำตอบสุดท้ายลงในข้อความเดียวกันนั้น วางนโยบายข้อความคำสั่งไว้ใต้ streaming.progress:streaming.mode: "off" เฉพาะเมื่อคุณต้องการส่งเฉพาะผลลัพธ์สุดท้าย: การแก้ไขตัวอย่างของ Telegram จะถูกปิดใช้งาน และการพูดคุยทั่วไปของเครื่องมือ/ความคืบหน้าจะถูกระงับแทนที่จะส่งเป็นข้อความสถานะแยกต่างหาก พรอมป์การอนุมัติ payload สื่อ และข้อผิดพลาดยังคงถูกส่งผ่านการส่งผลลัพธ์สุดท้ายตามปกติ ใช้ streaming.preview.toolProgress: false เมื่อคุณต้องการเก็บเฉพาะการแก้ไขตัวอย่างคำตอบไว้พร้อมกับซ่อนบรรทัดสถานะความคืบหน้าของเครื่องมือreplyToMode เป็น "first", "all" หรือ "batched" และข้อความขาเข้ามีข้อความอ้างอิงที่เลือกไว้ OpenClaw จะส่งคำตอบสุดท้ายผ่านเส้นทางการตอบกลับแบบอ้างอิงดั้งเดิมของ Telegram แทนการแก้ไขตัวอย่างคำตอบ ดังนั้น streaming.preview.toolProgress จึงไม่สามารถแสดงบรรทัดสถานะสั้น ๆ สำหรับรอบนั้นได้ การตอบกลับข้อความปัจจุบันที่ไม่มีข้อความอ้างอิงที่เลือกไว้ยังคงใช้การสตรีมตัวอย่าง ตั้งค่า replyToMode: "off" เมื่อการมองเห็นความคืบหน้าของเครื่องมือสำคัญกว่าการตอบกลับแบบอ้างอิงดั้งเดิม หรือตั้งค่า streaming.preview.toolProgress: false เพื่อยอมรับข้อแลกเปลี่ยนนี้- ตัวอย่างแบบสั้นใน DM/กลุ่ม/หัวข้อ: OpenClaw เก็บข้อความตัวอย่างเดิมไว้และทำการแก้ไขสุดท้ายในตำแหน่งเดิม
- ผลลัพธ์สุดท้ายแบบข้อความยาวที่แยกเป็นหลายข้อความ Telegram จะใช้ตัวอย่างที่มีอยู่เป็นส่วนสุดท้ายส่วนแรกเมื่อทำได้ แล้วส่งเฉพาะส่วนที่เหลือ
- ผลลัพธ์สุดท้ายในโหมดความคืบหน้าจะล้างร่างสถานะและใช้การส่งผลลัพธ์สุดท้ายตามปกติแทนการแก้ไขร่างให้เป็นคำตอบ
- หากการแก้ไขสุดท้ายล้มเหลวก่อนยืนยันข้อความที่เสร็จสมบูรณ์ OpenClaw จะใช้การส่งผลลัพธ์สุดท้ายตามปกติและล้างตัวอย่างที่ค้างอยู่
/reasoning streamส่งเหตุผลไปยังตัวอย่างแบบสดระหว่างการสร้าง- ตัวอย่างเหตุผลจะถูกลบหลังการส่งผลลัพธ์สุดท้าย; ใช้
/reasoning onเมื่อต้องการให้เหตุผลยังคงมองเห็นได้ - คำตอบสุดท้ายถูกส่งโดยไม่มีข้อความเหตุผล
การจัดรูปแบบและ HTML fallback
การจัดรูปแบบและ HTML fallback
parse_mode: "HTML"- ข้อความแบบคล้าย Markdown จะถูกเรนเดอร์เป็น HTML ที่ปลอดภัยสำหรับ Telegram
- แท็ก HTML ที่ Telegram รองรับจะถูกรักษาไว้; HTML ที่ไม่รองรับจะถูก escape
- หาก Telegram ปฏิเสธ HTML ที่แยกวิเคราะห์แล้ว OpenClaw จะลองใหม่เป็นข้อความธรรมดา
channels.telegram.linkPreview: falseคำสั่งดั้งเดิมและคำสั่งกำหนดเอง
คำสั่งดั้งเดิมและคำสั่งกำหนดเอง
setMyCommandsค่าเริ่มต้นของคำสั่งดั้งเดิม:commands.native: "auto"เปิดใช้งานคำสั่งดั้งเดิมสำหรับ Telegram
- ชื่อจะถูกทำให้เป็นรูปแบบปกติ (ลบ
/นำหน้า, แปลงเป็นตัวพิมพ์เล็ก) - รูปแบบที่ถูกต้อง:
a-z,0-9,_, ความยาว1..32 - คำสั่งกำหนดเองไม่สามารถแทนที่คำสั่งดั้งเดิมได้
- รายการที่ขัดแย้ง/ซ้ำจะถูกข้ามและบันทึกในล็อก
- คำสั่งกำหนดเองเป็นเพียงรายการเมนู; ไม่ได้ใช้งานพฤติกรรมโดยอัตโนมัติ
- คำสั่ง Plugin/Skills ยังสามารถทำงานได้เมื่อพิมพ์ แม้จะไม่แสดงในเมนู Telegram
setMyCommands failedพร้อมBOT_COMMANDS_TOO_MUCHหมายความว่าเมนู Telegram ยังล้นหลังจากตัดทอนแล้ว; ลดจำนวนคำสั่ง Plugin/Skills/กำหนดเอง หรือปิดใช้งานchannels.telegram.commands.nativedeleteWebhook,deleteMyCommandsหรือsetMyCommandsล้มเหลวด้วย404: Not Foundขณะที่คำสั่ง curl ไปยัง Bot API โดยตรงทำงานได้ อาจหมายความว่าchannels.telegram.apiRootถูกตั้งเป็น endpoint/bot<TOKEN>แบบเต็มapiRootต้องเป็นเฉพาะ root ของ Bot API เท่านั้น และopenclaw doctor --fixจะลบ/bot<TOKEN>ต่อท้ายที่ตั้งโดยไม่ได้ตั้งใจgetMe returned 401หมายความว่า Telegram ปฏิเสธโทเคนบอตที่กำหนดค่าไว้ อัปเดตbotToken,tokenFileหรือTELEGRAM_BOT_TOKENด้วยโทเคน BotFather ปัจจุบัน; OpenClaw จะหยุดก่อน polling ดังนั้นสิ่งนี้จะไม่ถูกรายงานเป็นความล้มเหลวในการล้าง WebhooksetMyCommands failedพร้อมข้อผิดพลาดเครือข่าย/fetch มักหมายความว่า DNS/HTTPS ขาออกไปยังapi.telegram.orgถูกบล็อก
คำสั่งจับคู่อุปกรณ์ (Plugin device-pair)
เมื่อมีการติดตั้ง Plugin device-pair:/pairสร้างโค้ดตั้งค่า- วางโค้ดในแอป iOS
/pair pendingแสดงรายการคำขอที่รอดำเนินการ (รวม role/scopes)- อนุมัติคำขอ:
/pair approve <requestId>สำหรับการอนุมัติแบบระบุชัดเจน/pair approveเมื่อมีคำขอที่รอดำเนินการเพียงรายการเดียว/pair approve latestสำหรับรายการล่าสุด
scopes: []; โทเคน operator ที่ส่งต่อใด ๆ จะถูกจำกัดไว้ที่ operator.approvals, operator.read, operator.talk.secrets และ operator.write การตรวจสอบ scope ของ bootstrap มีคำนำหน้า role ดังนั้น allowlist ของ operator นั้นจึงตอบสนองเฉพาะคำขอ operator; role ที่ไม่ใช่ operator ยังต้องมี scope ภายใต้คำนำหน้า role ของตนเองหากอุปกรณ์ลองใหม่พร้อมรายละเอียด auth ที่เปลี่ยนไป (เช่น role/scopes/public key) คำขอที่รอดำเนินการก่อนหน้าจะถูกแทนที่ และคำขอใหม่จะใช้ requestId คนละค่า รัน /pair pending อีกครั้งก่อนอนุมัติรายละเอียดเพิ่มเติม: การจับคู่ปุ่มอินไลน์
ปุ่มอินไลน์
การกระทำกับข้อความ Telegram สำหรับ agent และ automation
การกระทำกับข้อความ Telegram สำหรับ agent และ automation
sendMessage(to,content, optionalmediaUrl,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,content)createForumTopic(chatId,name, optionaliconColor,iconCustomEmojiId)
send, react, delete, edit, sticker, sticker-search, topic-create)ตัวควบคุมการ gating:channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(ค่าเริ่มต้น: ปิดใช้งาน)
edit และ topic-create เปิดใช้งานเป็นค่าเริ่มต้นและไม่มี toggle channels.telegram.actions.* แยกต่างหาก
การส่งขณะรันไทม์ใช้ snapshot ของ config/secrets ที่ใช้งานอยู่ (startup/reload) ดังนั้นเส้นทางการกระทำจะไม่ทำการ resolve SecretRef เฉพาะกิจซ้ำต่อการส่งแต่ละครั้งความหมายของการลบ reaction: /tools/reactionsแท็กเธรดการตอบกลับ
แท็กเธรดการตอบกลับ
[[reply_to_current]]ตอบกลับข้อความที่ทริกเกอร์[[reply_to:<id>]]ตอบกลับ ID ข้อความ Telegram ที่ระบุ
channels.telegram.replyToMode ควบคุมการจัดการ:off(ค่าเริ่มต้น)firstall
off ปิดใช้งานเธรดการตอบกลับโดยนัย แท็ก [[reply_to_*]] แบบชัดเจนยังคงถูกใช้งานหัวข้อฟอรัมและพฤติกรรมเธรด
หัวข้อฟอรัมและพฤติกรรมเธรด
- คีย์เซสชันหัวข้อเติม
:topic:<threadId>ต่อท้าย - การตอบกลับและการพิมพ์กำหนดเป้าหมายไปยังเธรดหัวข้อ
- เส้นทาง config ของหัวข้อ:
channels.telegram.groups.<chatId>.topics.<threadId>
threadId=1):- การส่งข้อความละเว้น
message_thread_id(Telegram ปฏิเสธsendMessage(...thread_id=1)) - การกระทำการพิมพ์ยังคงรวม
message_thread_id
requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy)
agentId เป็นเฉพาะหัวข้อและไม่สืบทอดจากค่าเริ่มต้นของกลุ่มการกำหนดเส้นทาง agent ต่อหัวข้อ: แต่ละหัวข้อสามารถกำหนดเส้นทางไปยัง agent คนละตัวได้โดยตั้งค่า agentId ใน config ของหัวข้อ สิ่งนี้ทำให้แต่ละหัวข้อมี workspace, memory และ session ที่แยกจากกันเป็นของตัวเอง ตัวอย่าง:agent:zu:telegram:group:-1001234567890:topic:3การผูกหัวข้อ ACP แบบถาวร: หัวข้อฟอรัมสามารถปักหมุดเซสชัน ACP harness ผ่านการผูก ACP แบบมีชนิดที่ระดับบนสุด (bindings[] ที่มี type: "acp" และ match.channel: "telegram", peer.kind: "group" และ id ที่ระบุหัวข้อ เช่น -1001234567890:topic:42) ปัจจุบันจำกัดขอบเขตไว้ที่หัวข้อฟอรัมในกลุ่ม/ซูเปอร์กรุ๊ป ดู Agent ACPการสร้าง ACP ที่ผูกกับเธรดจากแชต: /acp spawn <agent> --thread here|auto จะผูกหัวข้อปัจจุบันกับเซสชัน ACP ใหม่ การติดตามผลจะถูกกำหนดเส้นทางไปที่นั่นโดยตรง OpenClaw จะปักหมุดการยืนยันการสร้างไว้ในหัวข้อ ต้องเปิดใช้ channels.telegram.threadBindings.spawnSessions อยู่เสมอ (ค่าเริ่มต้น: true)บริบทเทมเพลตเปิดเผย MessageThreadId และ IsForum แชต DM ที่มี message_thread_id จะยังคงใช้การกำหนดเส้นทาง DM และเมทาดาทาการตอบกลับบนเซสชันแบบแบนตามค่าเริ่มต้น และจะใช้คีย์เซสชันที่รู้จักเธรดเฉพาะเมื่อกำหนดค่าด้วย threadReplies: "inbound", threadReplies: "always", requireTopic: true หรือการกำหนดค่าหัวข้อที่ตรงกัน ใช้ channels.telegram.dm.threadReplies ระดับบนสุดสำหรับค่าเริ่มต้นของบัญชี หรือ direct.<chatId>.threadReplies สำหรับ DM หนึ่งรายการAudio, video, and stickers
Audio, video, and stickers
ข้อความเสียง
Telegram แยกความแตกต่างระหว่างบันทึกเสียงกับไฟล์เสียง- ค่าเริ่มต้น: พฤติกรรมแบบไฟล์เสียง
- ใส่แท็ก
[[audio_as_voice]]ในคำตอบของ agent เพื่อบังคับส่งเป็นบันทึกเสียง - ข้อความถอดเสียงของบันทึกเสียงขาเข้าจะถูกจัดกรอบเป็นข้อความที่สร้างโดยเครื่องและไม่น่าเชื่อถือในบริบทของ agent; การตรวจจับการกล่าวถึงยังคงใช้ข้อความถอดเสียงดิบ ดังนั้นข้อความเสียงที่ถูกจำกัดด้วยการกล่าวถึงยังคงทำงานต่อไป
ข้อความวิดีโอ
Telegram แยกความแตกต่างระหว่างไฟล์วิดีโอกับบันทึกวิดีโอตัวอย่าง message action:สติกเกอร์
การจัดการสติกเกอร์ขาเข้า:- WEBP แบบคงที่: ดาวน์โหลดและประมวลผลแล้ว (ตัวยึดตำแหน่ง
<media:sticker>) - TGS แบบเคลื่อนไหว: ข้าม
- WEBM แบบวิดีโอ: ข้าม
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
~/.openclaw/telegram/sticker-cache.json
Reaction notifications
Reaction notifications
message_reaction (แยกจากเพย์โหลดข้อความ)เมื่อเปิดใช้ OpenClaw จะจัดคิวอีเวนต์ระบบ เช่น:Telegram reaction added: 👍 by Alice (@alice) on msg 42
channels.telegram.reactionNotifications:off | own | all(ค่าเริ่มต้น:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(ค่าเริ่มต้น:minimal)
ownหมายถึงเฉพาะรีแอ็กชันของผู้ใช้ต่อข้อความที่บ็อตส่ง (ทำแบบดีที่สุดเท่าที่ทำได้ผ่านแคชข้อความที่ส่ง)- อีเวนต์รีแอ็กชันยังคงเคารพการควบคุมการเข้าถึงของ Telegram (
dmPolicy,allowFrom,groupPolicy,groupAllowFrom); ผู้ส่งที่ไม่ได้รับอนุญาตจะถูกทิ้ง - Telegram ไม่ให้ thread ID ในการอัปเดตรีแอ็กชัน
- กลุ่มที่ไม่ใช่ฟอรัมจะกำหนดเส้นทางไปยังเซสชันแชตกลุ่ม
- กลุ่มฟอรัมจะกำหนดเส้นทางไปยังเซสชันหัวข้อทั่วไปของกลุ่ม (
:topic:1) ไม่ใช่หัวข้อต้นทางที่แน่นอน
allowed_updates สำหรับ polling/webhook จะรวม message_reaction โดยอัตโนมัติAck reactions
Ack reactions
ackReaction ส่งอีโมจิรับทราบขณะที่ OpenClaw กำลังประมวลผลข้อความขาเข้าลำดับการแก้ค่า:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- อีโมจิสำรองจากตัวตนของ agent (
agents.list[].identity.emojiมิฉะนั้นใช้ ”👀”)
- Telegram คาดหวังอีโมจิ unicode (เช่น ”👀”)
- ใช้
""เพื่อปิดใช้รีแอ็กชันสำหรับ channel หรือบัญชี
Config writes from Telegram events and commands
Config writes from Telegram events and commands
configWrites !== false)การเขียนที่ทริกเกอร์โดย Telegram รวมถึง:- อีเวนต์การย้ายกลุ่ม (
migrate_to_chat_id) เพื่ออัปเดตchannels.telegram.groups /config setและ/config unset(ต้องเปิดใช้คำสั่ง)
Long polling vs webhook
Long polling vs webhook
channels.telegram.webhookUrl และ channels.telegram.webhookSecret; ตัวเลือกเพิ่มเติมคือ webhookPath, webhookHost, webhookPort (ค่าเริ่มต้น /telegram-webhook, 127.0.0.1, 8787)ในโหมด long-polling OpenClaw จะบันทึก watermark การรีสตาร์ทคงทนเฉพาะหลังจาก dispatch การอัปเดตสำเร็จแล้ว หาก handler ล้มเหลว การอัปเดตนั้นยังคง retry ได้ในกระบวนการเดียวกัน และจะไม่ถูกเขียนว่าเสร็จสมบูรณ์สำหรับการลบรายการซ้ำเมื่อรีสตาร์ทlistener ภายในเครื่องผูกกับ 127.0.0.1:8787 สำหรับ ingress สาธารณะ ให้ใส่ reverse proxy ไว้หน้า port ภายในเครื่อง หรือตั้งค่า webhookHost: "0.0.0.0" อย่างตั้งใจโหมด Webhook ตรวจสอบ request guards, secret token ของ Telegram และ JSON body ก่อนส่งคืน 200 ให้ Telegram
จากนั้น OpenClaw จะประมวลผลการอัปเดตแบบอะซิงโครนัสผ่าน bot lane แบบต่อแชต/ต่อหัวข้อเดียวกับที่ long polling ใช้ ดังนั้นรอบ agent ที่ช้าจะไม่หน่วง ACK การส่งมอบของ TelegramLimits, retry, and CLI targets
Limits, retry, and CLI targets
- ค่าเริ่มต้นของ
channels.telegram.textChunkLimitคือ 4000 channels.telegram.chunkMode="newline"จะเลือกใช้ขอบเขตย่อหน้า (บรรทัดว่าง) ก่อนการแบ่งตามความยาวchannels.telegram.mediaMaxMb(ค่าเริ่มต้น 100) จำกัดขนาดสื่อ Telegram ขาเข้าและขาออกchannels.telegram.mediaGroupFlushMs(ค่าเริ่มต้น 500) ควบคุมระยะเวลาที่อัลบั้ม/กลุ่มสื่อของ Telegram ถูกบัฟเฟอร์ก่อนที่ OpenClaw จะ dispatch เป็นข้อความขาเข้าหนึ่งรายการ เพิ่มค่านี้หากส่วนของอัลบั้มมาถึงช้า ลดค่านี้เพื่อลด latency ของการตอบกลับอัลบั้มchannels.telegram.timeoutSecondsแทนที่ timeout ของไคลเอนต์ Telegram API (หากไม่ได้ตั้งค่า จะใช้ค่าเริ่มต้นของ grammY) ไคลเอนต์บ็อตจะบีบค่าที่กำหนดไว้ให้ต่ำกว่า request guard ข้อความขาออก/typing 60 วินาที เพื่อให้ grammY ไม่ยกเลิกการส่งคำตอบที่มองเห็นได้ก่อนที่ transport guard และ fallback ของ OpenClaw จะทำงาน Long polling ยังคงใช้ request guardgetUpdates45 วินาที เพื่อไม่ให้ idle poll ถูกละทิ้งอย่างไม่มีกำหนดchannels.telegram.pollingStallThresholdMsมีค่าเริ่มต้นเป็น120000; ปรับระหว่าง30000ถึง600000เฉพาะสำหรับการรีสตาร์ท polling-stall แบบ false-positive- ประวัติบริบทกลุ่มใช้
channels.telegram.historyLimitหรือmessages.groupChat.historyLimit(ค่าเริ่มต้น 50);0ปิดใช้ - บริบทเสริมของการตอบกลับ/อ้างอิง/ส่งต่อจะถูกปรับให้อยู่ในหน้าต่างบริบทการสนทนาที่เลือกไว้หนึ่งรายการ เมื่อ Gateway ได้สังเกตข้อความต้นทางแล้ว แคชข้อความที่สังเกตจะถูกคงไว้ข้าง store เซสชัน Telegram รวม
reply_to_messageแบบตื้นเพียงหนึ่งรายการในการอัปเดต ดังนั้น chain ที่เก่ากว่าแคชจะถูกจำกัดตามเพย์โหลดการอัปเดตปัจจุบันของ Telegram - allowlist ของ Telegram ใช้กำกับหลัก ๆ ว่าใครสามารถทริกเกอร์ agent ได้ ไม่ใช่ขอบเขตการปกปิดบริบทเสริมเต็มรูปแบบ
- การควบคุมประวัติ DM:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
- การกำหนดค่า
channels.telegram.retryใช้กับตัวช่วยส่งของ Telegram (CLI/tools/actions) สำหรับข้อผิดพลาด API ขาออกที่กู้คืนได้ การส่งคำตอบสุดท้ายขาเข้าก็ใช้ safe-send retry แบบมีขอบเขตสำหรับความล้มเหลวก่อนเชื่อมต่อ Telegram แต่จะไม่ retry envelope เครือข่ายหลังส่งที่คลุมเครือซึ่งอาจทำให้ข้อความที่มองเห็นได้ซ้ำ
openclaw message poll และรองรับหัวข้อฟอรัม:--poll-duration-seconds(5-600)--poll-anonymous--poll-public--thread-idสำหรับหัวข้อฟอรัม (หรือใช้เป้าหมาย:topic:)
--presentationพร้อมบล็อกbuttonsสำหรับ inline keyboard เมื่อchannels.telegram.capabilities.inlineButtonsอนุญาต--pinหรือ--delivery '{"pin":true}'เพื่อขอการส่งแบบปักหมุดเมื่อบ็อตสามารถปักหมุดในแชตนั้นได้--force-documentเพื่อส่งรูปภาพ, GIF และวิดีโอขาออกเป็นเอกสารแทนการอัปโหลดแบบภาพถ่ายที่ถูกบีบอัด, สื่อเคลื่อนไหว หรือวิดีโอ
channels.telegram.actions.sendMessage=falseปิดใช้ข้อความ Telegram ขาออก รวมถึง pollchannels.telegram.actions.poll=falseปิดใช้การสร้าง poll ของ Telegram โดยยังคงเปิดการส่งปกติไว้
Exec approvals in Telegram
Exec approvals in Telegram
channels.telegram.execApprovals.enabled(เปิดใช้อัตโนมัติเมื่อสามารถ resolve ผู้อนุมัติได้อย่างน้อยหนึ่งคน)channels.telegram.execApprovals.approvers(fallback ไปยัง owner ID แบบตัวเลขจากcommands.ownerAllowFrom)channels.telegram.execApprovals.target:dm(ค่าเริ่มต้น) |channel|bothagentFilter,sessionFilter
channels.telegram.allowFrom, groupAllowFrom และ defaultTo ควบคุมว่าใครคุยกับบ็อตได้ และบ็อตส่งคำตอบปกติไปที่ไหน สิ่งเหล่านี้ไม่ได้ทำให้ใครเป็นผู้อนุมัติ exec การจับคู่ DM ที่อนุมัติครั้งแรกจะ bootstrap commands.ownerAllowFrom เมื่อยังไม่มีเจ้าของคำสั่ง ดังนั้นการตั้งค่าแบบเจ้าของหนึ่งคนยังคงทำงานได้โดยไม่ต้องทำ ID ซ้ำใต้ execApprovals.approversการส่งมอบผ่าน channel จะแสดงข้อความคำสั่งในแชต เปิดใช้ channel หรือ both เฉพาะในกลุ่ม/หัวข้อที่เชื่อถือได้เท่านั้น เมื่อ prompt ไปถึงหัวข้อฟอรัม OpenClaw จะรักษาหัวข้อนั้นไว้สำหรับ prompt การอนุมัติและการติดตามผล การอนุมัติ exec หมดอายุหลัง 30 นาทีตามค่าเริ่มต้นปุ่มอนุมัติแบบ inline ยังต้องให้ channels.telegram.capabilities.inlineButtons อนุญาตพื้นผิวเป้าหมาย (dm, group หรือ all) ID การอนุมัติที่ขึ้นต้นด้วย plugin: จะ resolve ผ่านการอนุมัติของ Plugin; รายการอื่นจะ resolve ผ่านการอนุมัติ exec ก่อนดู การอนุมัติ Execการควบคุมการตอบกลับข้อผิดพลาด
เมื่อเอเจนต์พบข้อผิดพลาดในการส่งหรือข้อผิดพลาดจากผู้ให้บริการ Telegram สามารถตอบกลับด้วยข้อความข้อผิดพลาดหรือระงับข้อความนั้นได้ คีย์การกำหนดค่าสองคีย์ควบคุมลักษณะการทำงานนี้:| คีย์ | ค่า | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
channels.telegram.errorPolicy | reply, silent | reply | reply ส่งข้อความข้อผิดพลาดที่เป็นมิตรไปยังแชต silent ระงับการตอบกลับข้อผิดพลาดทั้งหมด |
channels.telegram.errorCooldownMs | ตัวเลข (ms) | 60000 | เวลาขั้นต่ำระหว่างการตอบกลับข้อผิดพลาดไปยังแชตเดียวกัน ป้องกันสแปมข้อผิดพลาดระหว่างบริการล่ม |
การแก้ไขปัญหา
บอตไม่ตอบกลับข้อความกลุ่มที่ไม่ได้กล่าวถึง
บอตไม่ตอบกลับข้อความกลุ่มที่ไม่ได้กล่าวถึง
- หาก
requireMention=falseโหมดความเป็นส่วนตัวของ Telegram ต้องอนุญาตให้มองเห็นได้ทั้งหมด- BotFather:
/setprivacy-> ปิดใช้งาน - จากนั้นลบและเพิ่มบอตกลับเข้ากลุ่มใหม่
- BotFather:
openclaw channels statusเตือนเมื่อการกำหนดค่าคาดหวังข้อความกลุ่มที่ไม่ได้กล่าวถึงopenclaw channels status --probeสามารถตรวจสอบ ID กลุ่มแบบตัวเลขที่ระบุชัดเจนได้ wildcard"*"ไม่สามารถตรวจสอบสมาชิกภาพได้- การทดสอบเซสชันแบบเร็ว:
/activation always
บอตไม่เห็นข้อความกลุ่มเลย
บอตไม่เห็นข้อความกลุ่มเลย
- เมื่อมี
channels.telegram.groupsกลุ่มต้องถูกระบุไว้ (หรือรวม"*") - ตรวจสอบสมาชิกภาพของบอตในกลุ่ม
- ตรวจทานบันทึก:
openclaw logs --followเพื่อดูเหตุผลที่ถูกข้าม
คำสั่งทำงานบางส่วนหรือไม่ทำงานเลย
คำสั่งทำงานบางส่วนหรือไม่ทำงานเลย
- อนุญาตตัวตนผู้ส่งของคุณ (การจับคู่และ/หรือ
allowFromแบบตัวเลข) - การอนุญาตคำสั่งยังคงมีผลแม้นโยบายกลุ่มเป็น
open setMyCommands failedพร้อมBOT_COMMANDS_TOO_MUCHหมายความว่าเมนูเนทีฟมีรายการมากเกินไป ให้ลดคำสั่ง Plugin/Skills/กำหนดเอง หรือปิดใช้งานเมนูเนทีฟ- การเรียก
deleteMyCommands/setMyCommandsตอนเริ่มต้นและการเรียกพิมพ์sendChatActionถูกจำกัดขอบเขตและลองซ้ำหนึ่งครั้งผ่านการสำรองการขนส่งของ Telegram เมื่อคำขอหมดเวลา ข้อผิดพลาดเครือข่าย/fetch ที่เกิดอย่างต่อเนื่องมักบ่งชี้ปัญหาการเข้าถึง DNS/HTTPS ไปยังapi.telegram.org
รายงานตอนเริ่มต้นว่าโทเค็นไม่ได้รับอนุญาต
รายงานตอนเริ่มต้นว่าโทเค็นไม่ได้รับอนุญาต
Polling หรือเครือข่ายไม่เสถียร
Polling หรือเครือข่ายไม่เสถียร
- Node 22+ + fetch/proxy แบบกำหนดเองอาจทำให้เกิดพฤติกรรมยกเลิกทันทีหากชนิด AbortSignal ไม่ตรงกัน
- บางโฮสต์ resolve
api.telegram.orgไปเป็น IPv6 ก่อน ทางออก IPv6 ที่เสียอาจทำให้ Telegram API ล้มเหลวเป็นครั้งคราว - หากบันทึกมี
TypeError: fetch failedหรือNetwork request for 'getUpdates' failed!ตอนนี้ OpenClaw จะลองซ้ำข้อผิดพลาดเหล่านี้ในฐานะข้อผิดพลาดเครือข่ายที่กู้คืนได้ - ระหว่างเริ่มต้น polling OpenClaw ใช้ probe
getMeตอนเริ่มต้นที่สำเร็จซ้ำสำหรับ grammY เพื่อให้ runner ไม่ต้องมีgetMeครั้งที่สองก่อนgetUpdatesครั้งแรก - หาก
deleteWebhookล้มเหลวด้วยข้อผิดพลาดเครือข่ายชั่วคราวระหว่างเริ่มต้น polling OpenClaw จะดำเนินต่อไปยัง long polling แทนการเรียก control-plane ก่อน poll อีกครั้ง Webhook ที่ยังทำงานอยู่จะปรากฏเป็นความขัดแย้งของgetUpdatesจากนั้น OpenClaw จะสร้างการขนส่ง Telegram ใหม่และลองล้าง Webhook อีกครั้ง - หากซ็อกเก็ต Telegram ถูกรีไซเคิลตามรอบเวลาคงที่สั้น ๆ ให้ตรวจสอบ
channels.telegram.timeoutSecondsที่ต่ำเกินไป ไคลเอนต์บอตจะ clamp ค่าที่กำหนดต่ำกว่า guard ของคำขอขาออกและgetUpdatesแต่รุ่นเก่าอาจยกเลิกทุก poll หรือการตอบกลับเมื่อค่านี้ถูกตั้งต่ำกว่า guard เหล่านั้น - หากบันทึกมี
Polling stall detectedOpenClaw จะเริ่ม polling ใหม่และสร้างการขนส่ง Telegram ใหม่หลังจากไม่มี liveness ของ long-poll ที่เสร็จสมบูรณ์เป็นเวลา 120 วินาทีตามค่าเริ่มต้น openclaw channels status --probeและopenclaw doctorเตือนเมื่อบัญชี polling ที่กำลังทำงานยังไม่ทำgetUpdatesสำเร็จหลังช่วงผ่อนผันตอนเริ่มต้น เมื่อบัญชี Webhook ที่กำลังทำงานยังไม่ทำsetWebhookสำเร็จหลังช่วงผ่อนผันตอนเริ่มต้น หรือเมื่อกิจกรรมการขนส่ง polling ที่สำเร็จล่าสุดเก่าเกินไป- เพิ่ม
channels.telegram.pollingStallThresholdMsเฉพาะเมื่อการเรียกgetUpdatesที่ทำงานนานยังสมบูรณ์ดีแต่โฮสต์ของคุณยังรายงานการเริ่มใหม่จาก polling-stall แบบผิดพลาด การค้างอย่างต่อเนื่องมักชี้ไปที่ปัญหา proxy, DNS, IPv6 หรือ TLS egress ระหว่างโฮสต์กับapi.telegram.org - Telegram ยังเคารพ env proxy ของโปรเซสสำหรับการขนส่ง Bot API รวมถึง
HTTP_PROXY,HTTPS_PROXY,ALL_PROXYและรูปแบบตัวพิมพ์เล็กของตัวแปรเหล่านั้นNO_PROXY/no_proxyยังสามารถข้ามapi.telegram.orgได้ - หาก proxy ที่ OpenClaw จัดการถูกกำหนดค่าผ่าน
OPENCLAW_PROXY_URLสำหรับสภาพแวดล้อมบริการและไม่มี env proxy มาตรฐาน Telegram จะใช้ URL นั้นสำหรับการขนส่ง Bot API ด้วย - บนโฮสต์ VPS ที่มี direct egress/TLS ไม่เสถียร ให้ route การเรียก Telegram API ผ่าน
channels.telegram.proxy:
- Node 22+ มีค่าเริ่มต้นเป็น
autoSelectFamily=true(ยกเว้น WSL2) ลำดับผลลัพธ์ DNS ของ Telegram เคารพOPENCLAW_TELEGRAM_DNS_RESULT_ORDERจากนั้นchannels.telegram.network.dnsResultOrderจากนั้นค่าเริ่มต้นของโปรเซส เช่นNODE_OPTIONS=--dns-result-order=ipv4first; หากไม่มีรายการใดใช้ได้ Node 22+ จะ fallback เป็นipv4first - หากโฮสต์ของคุณเป็น WSL2 หรือทำงานได้ดีกว่าอย่างชัดเจนด้วยพฤติกรรมเฉพาะ IPv4 ให้บังคับการเลือก family:
- คำตอบช่วง benchmark ของ RFC 2544 (
198.18.0.0/15) ได้รับอนุญาตอยู่แล้ว สำหรับการดาวน์โหลดสื่อ Telegram ตามค่าเริ่มต้น หาก fake-IP ที่เชื่อถือได้หรือ transparent proxy เขียนapi.telegram.orgใหม่เป็นที่อยู่ ส่วนตัว/ภายใน/การใช้งานพิเศษอื่น ๆ ระหว่างดาวน์โหลดสื่อ คุณสามารถเลือก ใช้ bypass เฉพาะ Telegram ได้:
- opt-in เดียวกันมีให้ต่อบัญชีที่
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork - หาก proxy ของคุณ resolve โฮสต์สื่อ Telegram เป็น
198.18.x.xให้ปิด แฟล็กอันตรายไว้ก่อน สื่อ Telegram อนุญาตช่วง benchmark ของ RFC 2544 ตามค่าเริ่มต้นอยู่แล้ว
- การเขียนทับด้วยสภาพแวดล้อม (ชั่วคราว):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- ตรวจสอบคำตอบ DNS:
อ้างอิงการกำหนดค่า
อ้างอิงหลัก: อ้างอิงการกำหนดค่า - Telegramฟิลด์ Telegram ที่มีสัญญาณสำคัญ
ฟิลด์ Telegram ที่มีสัญญาณสำคัญ
- การเริ่มต้น/การยืนยันตัวตน:
enabled,botToken,tokenFile,accounts.*(tokenFileต้องชี้ไปยังไฟล์ปกติ symlink ถูกปฏิเสธ) - การควบคุมการเข้าถึง:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*,bindings[]ระดับบนสุด (type: "acp") - การอนุมัติ exec:
execApprovals,accounts.*.execApprovals - คำสั่ง/เมนู:
commands.native,commands.nativeSkills,customCommands - เธรด/การตอบกลับ:
replyToMode,dm.threadReplies,direct.*.threadReplies - การสตรีม:
streaming(พรีวิว),streaming.preview.toolProgress,blockStreaming - การจัดรูปแบบ/การส่ง:
textChunkLimit,chunkMode,linkPreview,responsePrefix - สื่อ/เครือข่าย:
mediaMaxMb,mediaGroupFlushMs,timeoutSeconds,pollingStallThresholdMs,retry,network.autoSelectFamily,network.dangerouslyAllowPrivateNetwork,proxy - ราก API แบบกำหนดเอง:
apiRoot(ราก Bot API เท่านั้น อย่าใส่/bot<TOKEN>) - Webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost - การกระทำ/ความสามารถ:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - reaction:
reactionNotifications,reactionLevel - ข้อผิดพลาด:
errorPolicy,errorCooldownMs - การเขียน/ประวัติ:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit
channels.telegram.defaultAccount (หรือรวม channels.telegram.accounts.default) เพื่อทำให้การ route ค่าเริ่มต้นชัดเจน มิฉะนั้น OpenClaw จะ fallback ไปยัง ID บัญชีแรกที่ normalize แล้ว และ openclaw doctor จะเตือน บัญชีที่มีชื่อจะสืบทอด channels.telegram.allowFrom / groupAllowFrom แต่ไม่สืบทอดค่า accounts.default.*