Chuyển đến nội dung chính

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.

Sẵn sàng cho môi trường sản xuất đối với DM bot và nhóm thông qua grammY. Long polling là chế độ mặc định; chế độ webhook là tùy chọn.

Ghép nối

Chính sách DM mặc định cho Telegram là ghép nối.

Khắc phục sự cố kênh

Chẩn đoán liên kênh và playbook sửa chữa.

Cấu hình Gateway

Các mẫu và ví dụ cấu hình kênh đầy đủ.

Thiết lập nhanh

1

Tạo token bot trong BotFather

Mở Telegram và trò chuyện với @BotFather (xác nhận handle chính xác là @BotFather).Chạy /newbot, làm theo lời nhắc và lưu token.
2

Cấu hình token và chính sách DM

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Env fallback: TELEGRAM_BOT_TOKEN=... (chỉ tài khoản mặc định). Telegram không dùng openclaw channels login telegram; hãy cấu hình token trong config/env, rồi khởi động gateway.
3

Khởi động gateway và phê duyệt DM đầu tiên

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Mã ghép nối hết hạn sau 1 giờ.
4

Thêm bot vào một nhóm

Thêm bot vào nhóm của bạn, rồi đặt channels.telegram.groupsgroupPolicy để khớp với mô hình truy cập của bạn.
Thứ tự phân giải token có nhận biết tài khoản. Trong thực tế, giá trị config thắng env fallback, và TELEGRAM_BOT_TOKEN chỉ áp dụng cho tài khoản mặc định.

Cài đặt phía Telegram

Bot Telegram mặc định dùng Privacy Mode, giới hạn những tin nhắn nhóm mà chúng nhận được.Nếu bot phải thấy tất cả tin nhắn nhóm, hãy:
  • tắt chế độ riêng tư qua /setprivacy, hoặc
  • đặt bot làm quản trị viên nhóm.
Khi bật/tắt chế độ riêng tư, hãy gỡ rồi thêm lại bot trong từng nhóm để Telegram áp dụng thay đổi.
Trạng thái quản trị viên được kiểm soát trong cài đặt nhóm Telegram.Bot quản trị viên nhận tất cả tin nhắn nhóm, hữu ích cho hành vi nhóm luôn bật.
  • /setjoingroups để cho phép/từ chối thêm vào nhóm
  • /setprivacy cho hành vi hiển thị trong nhóm

Kiểm soát truy cập và kích hoạt

channels.telegram.dmPolicy kiểm soát quyền truy cập tin nhắn trực tiếp:
  • pairing (mặc định)
  • allowlist (yêu cầu ít nhất một ID người gửi trong allowFrom)
  • open (yêu cầu allowFrom bao gồm "*")
  • disabled
dmPolicy: "open" với allowFrom: ["*"] cho phép bất kỳ tài khoản Telegram nào tìm thấy hoặc đoán được tên người dùng bot điều khiển bot. Chỉ dùng cho các bot công khai có chủ đích với công cụ bị hạn chế chặt chẽ; bot một chủ sở hữu nên dùng allowlist với ID người dùng dạng số.channels.telegram.allowFrom chấp nhận ID người dùng Telegram dạng số. Tiền tố telegram: / tg: được chấp nhận và chuẩn hóa. Trong config đa tài khoản, channels.telegram.allowFrom cấp cao nhất có tính hạn chế được xem là ranh giới an toàn: các mục allowFrom: ["*"] cấp tài khoản không làm tài khoản đó thành công khai trừ khi allowlist hiệu lực của tài khoản vẫn chứa ký tự đại diện rõ ràng sau khi hợp nhất. dmPolicy: "allowlist" với allowFrom rỗng chặn tất cả DM và bị xác thực config từ chối. Thiết lập chỉ yêu cầu ID người dùng dạng số. Nếu bạn đã nâng cấp và config của bạn chứa các mục allowlist @username, hãy chạy openclaw doctor --fix để phân giải chúng (nỗ lực tối đa; yêu cầu token bot Telegram). Nếu trước đây bạn dựa vào các tệp allowlist của kho ghép nối, openclaw doctor --fix có thể khôi phục các mục vào channels.telegram.allowFrom trong luồng allowlist (ví dụ khi dmPolicy: "allowlist" chưa có ID rõ ràng).Với bot một chủ sở hữu, hãy ưu tiên dmPolicy: "allowlist" với các ID allowFrom dạng số rõ ràng để giữ chính sách truy cập bền vững trong config (thay vì phụ thuộc vào các phê duyệt ghép nối trước đó).Nhầm lẫn phổ biến: phê duyệt ghép nối DM không có nghĩa là “người gửi này được ủy quyền ở mọi nơi”. Ghép nối cấp quyền truy cập DM. Nếu chưa có chủ sở hữu lệnh, lần ghép nối được phê duyệt đầu tiên cũng đặt commands.ownerAllowFrom để các lệnh chỉ dành cho chủ sở hữu và phê duyệt exec có tài khoản vận hành rõ ràng. Ủy quyền người gửi trong nhóm vẫn đến từ allowlist config rõ ràng. Nếu bạn muốn “tôi được ủy quyền một lần và cả DM lẫn lệnh nhóm đều hoạt động”, hãy đặt ID người dùng Telegram dạng số của bạn trong channels.telegram.allowFrom; với lệnh chỉ dành cho chủ sở hữu, hãy bảo đảm commands.ownerAllowFrom chứa telegram:<your user id>.

Tìm ID người dùng Telegram của bạn

An toàn hơn (không dùng bot bên thứ ba):
  1. DM bot của bạn.
  2. Chạy openclaw logs --follow.
  3. Đọc from.id.
Phương thức Bot API chính thức:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Phương thức bên thứ ba (kém riêng tư hơn): @userinfobot hoặc @getidsbot.

Hành vi runtime

  • Telegram do tiến trình gateway sở hữu.
  • Định tuyến có tính xác định: tin nhắn đến từ Telegram trả lời lại Telegram (model không chọn kênh).
  • Tin nhắn đến được chuẩn hóa vào phong bì kênh dùng chung với siêu dữ liệu trả lời và placeholder media.
  • Phiên nhóm được cô lập theo ID nhóm. Chủ đề diễn đàn thêm :topic:<threadId> để giữ các chủ đề tách biệt.
  • Tin nhắn DM có thể mang message_thread_id; OpenClaw định tuyến chúng bằng khóa phiên có nhận biết thread và giữ nguyên ID thread cho phản hồi.
  • Long polling dùng grammY runner với trình tự hóa theo chat/theo thread. Đồng thời sink của runner tổng thể dùng agents.defaults.maxConcurrent.
  • Long polling được bảo vệ bên trong từng tiến trình gateway để mỗi lần chỉ một poller hoạt động có thể dùng token bot. Nếu bạn vẫn thấy xung đột getUpdates 409, có khả năng một gateway OpenClaw khác, script hoặc poller bên ngoài đang dùng cùng token.
  • Khởi động lại watchdog long-polling được kích hoạt mặc định sau 120 giây không có liveness getUpdates hoàn tất. Chỉ tăng channels.telegram.pollingStallThresholdMs nếu triển khai của bạn vẫn gặp khởi động lại polling-stall giả trong lúc công việc chạy lâu. Giá trị tính bằng mili giây và được phép từ 30000 đến 600000; hỗ trợ override theo tài khoản.
  • Telegram Bot API không hỗ trợ xác nhận đã đọc (sendReadReceipts không áp dụng).

Tham chiếu tính năng

OpenClaw có thể stream phản hồi một phần theo thời gian thực:
  • chat trực tiếp: tin nhắn xem trước + editMessageText
  • nhóm/chủ đề: tin nhắn xem trước + editMessageText
Yêu cầu:
  • channels.telegram.streamingoff | partial | block | progress (mặc định: partial)
  • progress ánh xạ sang partial trên Telegram (tương thích với cách đặt tên liên kênh)
  • streaming.preview.toolProgress kiểm soát việc cập nhật công cụ/tiến trình có tái sử dụng cùng tin nhắn xem trước đã chỉnh sửa hay không (mặc định: true khi stream xem trước đang hoạt động)
  • channels.telegram.streamMode cũ và các giá trị boolean streaming được phát hiện; chạy openclaw doctor --fix để di chuyển chúng sang channels.telegram.streaming.mode
Cập nhật xem trước tiến trình công cụ là các dòng ngắn “Đang làm việc…” được hiển thị trong khi công cụ chạy, ví dụ thực thi lệnh, đọc tệp, cập nhật kế hoạch hoặc tóm tắt patch. Telegram giữ chúng bật mặc định để khớp với hành vi OpenClaw đã phát hành từ v2026.4.22 trở đi. Để giữ phần xem trước đã chỉnh sửa cho văn bản câu trả lời nhưng ẩn các dòng tiến trình công cụ, hãy đặt:
{
  "channels": {
    "telegram": {
      "streaming": {
        "mode": "partial",
        "preview": {
          "toolProgress": false
        }
      }
    }
  }
}
Chỉ dùng streaming.mode: "off" khi bạn muốn chỉ gửi kết quả cuối cùng: chỉnh sửa xem trước Telegram bị tắt và lời nhắn chung về công cụ/tiến trình bị chặn thay vì được gửi dưới dạng các tin nhắn “Đang làm việc…” độc lập. Lời nhắc phê duyệt, payload media và lỗi vẫn định tuyến qua cơ chế gửi cuối cùng thông thường. Dùng streaming.preview.toolProgress: false khi bạn chỉ muốn giữ chỉnh sửa xem trước câu trả lời trong khi ẩn các dòng trạng thái tiến trình công cụ.Với phản hồi chỉ có văn bản:
  • bản xem trước ngắn cho DM/nhóm/chủ đề: OpenClaw giữ nguyên thông báo xem trước và thực hiện chỉnh sửa cuối cùng tại chỗ
  • bản xem trước cũ hơn khoảng một phút: OpenClaw gửi câu trả lời đã hoàn tất dưới dạng thông báo cuối mới rồi dọn dẹp bản xem trước, để dấu thời gian hiển thị của Telegram phản ánh thời điểm hoàn tất thay vì thời điểm tạo bản xem trước
Với các câu trả lời phức tạp (ví dụ payload phương tiện), OpenClaw quay về cơ chế gửi cuối bình thường rồi dọn dẹp thông báo xem trước.Phát trực tuyến bản xem trước tách biệt với phát trực tuyến khối. Khi phát trực tuyến khối được bật rõ ràng cho Telegram, OpenClaw bỏ qua luồng xem trước để tránh phát trực tuyến hai lần.Nếu cơ chế truyền bản nháp gốc không khả dụng/bị từ chối, OpenClaw tự động quay về sendMessage + editMessageText.Luồng suy luận chỉ dành cho Telegram:
  • /reasoning stream gửi suy luận vào bản xem trước trực tiếp trong khi tạo
  • câu trả lời cuối được gửi không kèm văn bản suy luận
Văn bản gửi đi dùng Telegram parse_mode: "HTML".
  • Văn bản kiểu Markdown được kết xuất thành HTML an toàn cho Telegram.
  • HTML thô từ mô hình được thoát ký tự để giảm lỗi phân tích cú pháp của Telegram.
  • Nếu Telegram từ chối HTML đã phân tích cú pháp, OpenClaw thử lại dưới dạng văn bản thuần.
Bản xem trước liên kết được bật theo mặc định và có thể tắt bằng channels.telegram.linkPreview: false.
Việc đăng ký menu lệnh Telegram được xử lý khi khởi động bằng setMyCommands.Mặc định lệnh gốc:
  • commands.native: "auto" bật lệnh gốc cho Telegram
Thêm mục menu lệnh tùy chỉnh:
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
    },
  },
}
Quy tắc:
  • tên được chuẩn hóa (bỏ / ở đầu, chuyển thành chữ thường)
  • mẫu hợp lệ: a-z, 0-9, _, độ dài 1..32
  • lệnh tùy chỉnh không thể ghi đè lệnh gốc
  • xung đột/trùng lặp bị bỏ qua và được ghi log
Ghi chú:
  • lệnh tùy chỉnh chỉ là mục menu; chúng không tự động triển khai hành vi
  • lệnh Plugin/Skills vẫn có thể hoạt động khi được nhập, ngay cả khi không hiển thị trong menu Telegram
Nếu lệnh gốc bị tắt, các lệnh tích hợp sẽ bị xóa. Lệnh tùy chỉnh/Plugin vẫn có thể đăng ký nếu được cấu hình.Lỗi thiết lập thường gặp:
  • setMyCommands failed với BOT_COMMANDS_TOO_MUCH nghĩa là menu Telegram vẫn bị tràn sau khi cắt bớt; hãy giảm lệnh Plugin/Skills/tùy chỉnh hoặc tắt channels.telegram.commands.native.
  • deleteWebhook, deleteMyCommands, hoặc setMyCommands thất bại với 404: Not Found trong khi các lệnh curl Bot API trực tiếp vẫn hoạt động có thể nghĩa là channels.telegram.apiRoot đã được đặt thành endpoint đầy đủ /bot<TOKEN>. apiRoot chỉ được là gốc Bot API, và openclaw doctor --fix sẽ xóa phần /bot<TOKEN> vô tình ở cuối.
  • getMe returned 401 nghĩa là Telegram từ chối token bot đã cấu hình. Cập nhật botToken, tokenFile, hoặc TELEGRAM_BOT_TOKEN bằng token BotFather hiện tại; OpenClaw dừng trước khi polling nên lỗi này không được báo cáo là lỗi dọn dẹp Webhook.
  • setMyCommands failed với lỗi mạng/fetch thường nghĩa là DNS/HTTPS gửi ra tới api.telegram.org bị chặn.

Lệnh ghép nối thiết bị (Plugin device-pair)

Khi Plugin device-pair được cài đặt:
  1. /pair tạo mã thiết lập
  2. dán mã vào ứng dụng iOS
  3. /pair pending liệt kê các yêu cầu đang chờ (bao gồm vai trò/phạm vi)
  4. phê duyệt yêu cầu:
    • /pair approve <requestId> để phê duyệt rõ ràng
    • /pair approve khi chỉ có một yêu cầu đang chờ
    • /pair approve latest cho yêu cầu gần đây nhất
Mã thiết lập mang một token bootstrap tồn tại ngắn. Cơ chế bàn giao bootstrap tích hợp giữ token node chính tại scopes: []; mọi token operator được bàn giao vẫn bị giới hạn trong operator.approvals, operator.read, operator.talk.secrets, và operator.write. Kiểm tra phạm vi bootstrap có tiền tố vai trò, nên danh sách cho phép operator đó chỉ thỏa mãn yêu cầu operator; các vai trò không phải operator vẫn cần phạm vi dưới tiền tố vai trò của chính chúng.Nếu một thiết bị thử lại với chi tiết xác thực đã thay đổi (ví dụ vai trò/phạm vi/khóa công khai), yêu cầu đang chờ trước đó sẽ bị thay thế và yêu cầu mới dùng một requestId khác. Chạy lại /pair pending trước khi phê duyệt.Thêm chi tiết: Ghép nối.
Cấu hình phạm vi bàn phím nội tuyến:
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
Ghi đè theo từng tài khoản:
{
  channels: {
    telegram: {
      accounts: {
        main: {
          capabilities: {
            inlineButtons: "allowlist",
          },
        },
      },
    },
  },
}
Phạm vi:
  • off
  • dm
  • group
  • all
  • allowlist (mặc định)
capabilities: ["inlineButtons"] cũ ánh xạ sang inlineButtons: "all".Ví dụ hành động thông báo:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  message: "Choose an option:",
  buttons: [
    [
      { text: "Yes", callback_data: "yes" },
      { text: "No", callback_data: "no" },
    ],
    [{ text: "Cancel", callback_data: "cancel" }],
  ],
}
Các lượt nhấp callback được truyền cho agent dưới dạng văn bản: callback_data: <value>
Hành động công cụ Telegram bao gồm:
  • sendMessage (to, content, tùy chọn mediaUrl, replyToMessageId, messageThreadId)
  • react (chatId, messageId, emoji)
  • deleteMessage (chatId, messageId)
  • editMessage (chatId, messageId, content)
  • createForumTopic (chatId, name, tùy chọn iconColor, iconCustomEmojiId)
Hành động thông báo kênh cung cấp các bí danh tiện dụng (send, react, delete, edit, sticker, sticker-search, topic-create).Điều khiển cổng kiểm soát:
  • channels.telegram.actions.sendMessage
  • channels.telegram.actions.deleteMessage
  • channels.telegram.actions.reactions
  • channels.telegram.actions.sticker (mặc định: tắt)
Ghi chú: edittopic-create hiện được bật theo mặc định và không có công tắc channels.telegram.actions.* riêng. Các lần gửi runtime dùng ảnh chụp nhanh cấu hình/bí mật đang hoạt động (khởi động/tải lại), nên đường dẫn hành động không thực hiện phân giải lại SecretRef tùy biến cho từng lần gửi.Ngữ nghĩa gỡ phản ứng: /tools/reactions
Telegram hỗ trợ thẻ luồng trả lời rõ ràng trong đầu ra đã tạo:
  • [[reply_to_current]] trả lời thông báo kích hoạt
  • [[reply_to:<id>]] trả lời một ID thông báo Telegram cụ thể
channels.telegram.replyToMode điều khiển cách xử lý:
  • off (mặc định)
  • first
  • all
Khi luồng trả lời được bật và văn bản hoặc chú thích Telegram gốc có sẵn, OpenClaw tự động đưa vào một đoạn trích trích dẫn Telegram gốc. Telegram giới hạn văn bản trích dẫn gốc ở 1024 đơn vị mã UTF-16, nên các thông báo dài hơn được trích dẫn từ đầu và quay về trả lời thuần nếu Telegram từ chối trích dẫn.Ghi chú: off tắt luồng trả lời ngầm định. Các thẻ [[reply_to_*]] rõ ràng vẫn được tôn trọng.
Siêu nhóm diễn đàn:
  • khóa phiên chủ đề nối thêm :topic:<threadId>
  • câu trả lời và trạng thái đang nhập nhắm tới luồng chủ đề
  • đường dẫn cấu hình chủ đề: channels.telegram.groups.<chatId>.topics.<threadId>
Trường hợp đặc biệt cho chủ đề Chung (threadId=1):
  • gửi thông báo bỏ qua message_thread_id (Telegram từ chối sendMessage(...thread_id=1))
  • hành động đang nhập vẫn bao gồm message_thread_id
Kế thừa chủ đề: mục chủ đề kế thừa thiết lập nhóm trừ khi được ghi đè (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy). agentId chỉ thuộc về chủ đề và không kế thừa từ mặc định nhóm.Định tuyến agent theo chủ đề: Mỗi chủ đề có thể định tuyến tới một agent khác bằng cách đặt agentId trong cấu hình chủ đề. Điều này cho mỗi chủ đề một không gian làm việc, bộ nhớ và phiên riêng biệt. Ví dụ:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "1": { agentId: "main" },      // General topic → main agent
            "3": { agentId: "zu" },        // Dev topic → zu agent
            "5": { agentId: "coder" }      // Code review → coder agent
          }
        }
      }
    }
  }
}
Sau đó mỗi chủ đề có khóa phiên riêng: agent:zu:telegram:group:-1001234567890:topic:3Liên kết chủ đề ACP bền vững: Chủ đề diễn đàn có thể ghim phiên harness ACP thông qua liên kết ACP được định kiểu ở cấp cao nhất (bindings[] với type: "acp"match.channel: "telegram", peer.kind: "group", và một id đủ điều kiện theo chủ đề như -1001234567890:topic:42). Hiện được giới hạn trong chủ đề diễn đàn ở nhóm/siêu nhóm. Xem Agent ACP.Sinh ACP gắn với luồng từ chat: /acp spawn <agent> --thread here|auto liên kết chủ đề hiện tại với một phiên ACP mới; các lượt theo sau định tuyến trực tiếp tới đó. OpenClaw ghim xác nhận sinh trong chủ đề. Yêu cầu channels.telegram.threadBindings.spawnAcpSessions=true.Ngữ cảnh mẫu cung cấp MessageThreadIdIsForum. Chat DM có message_thread_id giữ định tuyến DM nhưng dùng khóa phiên nhận biết luồng.

Thông báo âm thanh

Telegram phân biệt ghi chú thoại và tệp âm thanh.
  • mặc định: hành vi tệp âm thanh
  • thẻ [[audio_as_voice]] trong câu trả lời của agent để buộc gửi dưới dạng ghi chú thoại
  • bản chép lời ghi chú thoại gửi vào được đóng khung là văn bản do máy tạo, không đáng tin cậy trong ngữ cảnh agent; phát hiện lượt nhắc vẫn dùng bản chép lời thô nên thông báo thoại bị chặn theo lượt nhắc tiếp tục hoạt động.
Ví dụ hành động thông báo:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/voice.ogg",
  asVoice: true,
}

Thông báo video

Telegram phân biệt tệp video và ghi chú video.Ví dụ hành động thông báo:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/video.mp4",
  asVideoNote: true,
}
Ghi chú video không hỗ trợ chú thích; văn bản thông báo được cung cấp sẽ được gửi riêng.

Nhãn dán

Xử lý nhãn dán gửi vào:
  • WEBP tĩnh: được tải xuống và xử lý (placeholder <media:sticker>)
  • TGS động: bị bỏ qua
  • WEBM video: bị bỏ qua
Trường ngữ cảnh nhãn dán:
  • Sticker.emoji
  • Sticker.setName
  • Sticker.fileId
  • Sticker.fileUniqueId
  • Sticker.cachedDescription
Tệp bộ nhớ đệm nhãn dán:
  • ~/.openclaw/telegram/sticker-cache.json
Nhãn dán được mô tả một lần (khi có thể) và được lưu vào bộ nhớ đệm để giảm các lượt gọi vision lặp lại.Bật hành động nhãn dán:
{
  channels: {
    telegram: {
      actions: {
        sticker: true,
      },
    },
  },
}
Hành động gửi nhãn dán:
{
  action: "sticker",
  channel: "telegram",
  to: "123456789",
  fileId: "CAACAgIAAxkBAAI...",
}
Tìm kiếm nhãn dán đã lưu vào bộ nhớ đệm:
{
  action: "sticker-search",
  channel: "telegram",
  query: "cat waving",
  limit: 5,
}
Phản ứng Telegram đến dưới dạng cập nhật message_reaction (tách biệt với payload thông báo).Khi được bật, OpenClaw xếp hàng các sự kiện hệ thống như:
  • Telegram reaction added: 👍 by Alice (@alice) on msg 42
Cấu hình:
  • channels.telegram.reactionNotifications: off | own | all (mặc định: own)
  • channels.telegram.reactionLevel: off | ack | minimal | extensive (mặc định: minimal)
Ghi chú:
  • own nghĩa là chỉ các phản ứng của người dùng đối với tin nhắn do bot gửi (nỗ lực tối đa qua bộ nhớ đệm tin nhắn đã gửi).
  • Sự kiện phản ứng vẫn tuân thủ các kiểm soát truy cập của Telegram (dmPolicy, allowFrom, groupPolicy, groupAllowFrom); người gửi không được phép sẽ bị loại bỏ.
  • Telegram không cung cấp ID luồng trong các bản cập nhật phản ứng.
    • nhóm không phải diễn đàn được định tuyến đến phiên trò chuyện nhóm
    • nhóm diễn đàn được định tuyến đến phiên chủ đề chung của nhóm (:topic:1), không phải đúng chủ đề nguồn ban đầu
allowed_updates cho polling/webhook tự động bao gồm message_reaction.
ackReaction gửi một emoji xác nhận trong khi OpenClaw đang xử lý một tin nhắn đến.Thứ tự phân giải:
  • channels.telegram.accounts.<accountId>.ackReaction
  • channels.telegram.ackReaction
  • messages.ackReaction
  • phương án dự phòng emoji danh tính agent (agents.list[].identity.emoji, nếu không thì ”👀”)
Ghi chú:
  • Telegram yêu cầu emoji unicode (ví dụ ”👀”).
  • Dùng "" để tắt phản ứng cho một kênh hoặc tài khoản.
Ghi cấu hình kênh được bật theo mặc định (configWrites !== false).Các lần ghi được kích hoạt bởi Telegram bao gồm:
  • sự kiện di chuyển nhóm (migrate_to_chat_id) để cập nhật channels.telegram.groups
  • /config set/config unset (yêu cầu bật lệnh)
Tắt:
{
  channels: {
    telegram: {
      configWrites: false,
    },
  },
}
Mặc định là long polling. Đối với chế độ webhook, đặt channels.telegram.webhookUrlchannels.telegram.webhookSecret; tùy chọn webhookPath, webhookHost, webhookPort (mặc định /telegram-webhook, 127.0.0.1, 8787).Bộ lắng nghe cục bộ bind vào 127.0.0.1:8787. Đối với ingress công khai, hoặc đặt reverse proxy phía trước cổng cục bộ, hoặc cố ý đặt webhookHost: "0.0.0.0".Chế độ webhook xác thực các lớp bảo vệ yêu cầu, token bí mật Telegram, và thân JSON trước khi trả về 200 cho Telegram. Sau đó OpenClaw xử lý bản cập nhật bất đồng bộ qua cùng các lane bot theo từng chat/từng chủ đề mà long polling sử dụng, nên các lượt agent chậm không giữ ACK giao hàng của Telegram.
  • channels.telegram.textChunkLimit mặc định là 4000.
  • channels.telegram.chunkMode="newline" ưu tiên ranh giới đoạn văn (dòng trống) trước khi tách theo độ dài.
  • channels.telegram.mediaMaxMb (mặc định 100) giới hạn kích thước media Telegram vào và ra.
  • channels.telegram.timeoutSeconds ghi đè thời gian chờ của client Telegram API (nếu chưa đặt, dùng mặc định của grammY).
  • channels.telegram.pollingStallThresholdMs mặc định là 120000; chỉ điều chỉnh trong khoảng 30000 đến 600000 cho các lần khởi động lại polling-stall dương tính giả.
  • lịch sử ngữ cảnh nhóm dùng channels.telegram.historyLimit hoặc messages.groupChat.historyLimit (mặc định 50); 0 sẽ tắt.
  • ngữ cảnh bổ sung từ trả lời/trích dẫn/chuyển tiếp hiện được truyền nguyên như đã nhận.
  • allowlist Telegram chủ yếu kiểm soát ai có thể kích hoạt agent, không phải là một ranh giới biên tập lại ngữ cảnh bổ sung đầy đủ.
  • Điều khiển lịch sử DM:
    • channels.telegram.dmHistoryLimit
    • channels.telegram.dms["<user_id>"].historyLimit
  • Cấu hình channels.telegram.retry áp dụng cho các helper gửi Telegram (CLI/công cụ/hành động) đối với lỗi API gửi đi có thể phục hồi. Giao hàng phản hồi cuối cùng chiều đến cũng dùng cơ chế thử lại safe-send có giới hạn cho lỗi Telegram trước kết nối, nhưng không thử lại các envelope mạng không rõ ràng sau khi gửi vì có thể nhân đôi tin nhắn hiển thị.
Mục tiêu gửi CLI có thể là ID chat dạng số hoặc tên người dùng:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Poll Telegram dùng openclaw message poll và hỗ trợ chủ đề diễn đàn:
openclaw message poll --channel telegram --target 123456789 \
  --poll-question "Ship it?" --poll-option "Yes" --poll-option "No"
openclaw message poll --channel telegram --target -1001234567890:topic:42 \
  --poll-question "Pick a time" --poll-option "10am" --poll-option "2pm" \
  --poll-duration-seconds 300 --poll-public
Cờ poll chỉ dành cho Telegram:
  • --poll-duration-seconds (5-600)
  • --poll-anonymous
  • --poll-public
  • --thread-id cho chủ đề diễn đàn (hoặc dùng mục tiêu :topic:)
Gửi Telegram cũng hỗ trợ:
  • --presentation với các khối buttons cho bàn phím inline khi channels.telegram.capabilities.inlineButtons cho phép
  • --pin hoặc --delivery '{"pin":true}' để yêu cầu giao hàng được ghim khi bot có thể ghim trong chat đó
  • --force-document để gửi ảnh và GIF ra dưới dạng tài liệu thay vì ảnh nén hoặc tải lên media động
Kiểm soát hành động:
  • channels.telegram.actions.sendMessage=false tắt tin nhắn Telegram gửi ra, bao gồm cả poll
  • channels.telegram.actions.poll=false tắt tạo poll Telegram trong khi vẫn bật gửi thông thường
Telegram hỗ trợ phê duyệt exec trong DM của người phê duyệt và có thể tùy chọn đăng prompt trong chat hoặc chủ đề nguồn ban đầu. Người phê duyệt phải là ID người dùng Telegram dạng số.Đường dẫn cấu hình:
  • channels.telegram.execApprovals.enabled (tự động bật khi phân giải được ít nhất một người phê duyệt)
  • channels.telegram.execApprovals.approvers (dự phòng về ID chủ sở hữu dạng số từ commands.ownerAllowFrom)
  • channels.telegram.execApprovals.target: dm (mặc định) | channel | both
  • agentFilter, sessionFilter
channels.telegram.allowFrom, groupAllowFrom, và defaultTo kiểm soát ai có thể nói chuyện với bot và nơi bot gửi phản hồi thông thường. Chúng không biến ai đó thành người phê duyệt exec. Ghép cặp DM đầu tiên được phê duyệt sẽ bootstrap commands.ownerAllowFrom khi chưa có chủ sở hữu lệnh nào, nên thiết lập một chủ sở hữu vẫn hoạt động mà không cần lặp lại ID trong execApprovals.approvers.Giao hàng qua kênh hiển thị văn bản lệnh trong chat; chỉ bật channel hoặc both trong các nhóm/chủ đề đáng tin cậy. Khi prompt xuất hiện trong một chủ đề diễn đàn, OpenClaw giữ nguyên chủ đề cho prompt phê duyệt và phần theo sau. Phê duyệt exec hết hạn sau 30 phút theo mặc định.Các nút phê duyệt inline cũng yêu cầu channels.telegram.capabilities.inlineButtons cho phép bề mặt mục tiêu (dm, group, hoặc all). ID phê duyệt có tiền tố plugin: được phân giải qua phê duyệt Plugin; các ID khác được phân giải qua phê duyệt exec trước.Xem Phê duyệt exec.

Điều khiển phản hồi lỗi

Khi agent gặp lỗi giao hàng hoặc lỗi nhà cung cấp, Telegram có thể phản hồi bằng văn bản lỗi hoặc chặn phản hồi đó. Hai khóa cấu hình kiểm soát hành vi này:
KhóaGiá trịMặc địnhMô tả
channels.telegram.errorPolicyreply, silentreplyreply gửi một tin nhắn lỗi thân thiện đến chat. silent chặn hoàn toàn phản hồi lỗi.
channels.telegram.errorCooldownMssố (ms)60000Thời gian tối thiểu giữa các phản hồi lỗi đến cùng một chat. Ngăn spam lỗi trong thời gian gián đoạn.
Hỗ trợ ghi đè theo tài khoản, theo nhóm, và theo chủ đề (cùng cơ chế kế thừa như các khóa cấu hình Telegram khác).
{
  channels: {
    telegram: {
      errorPolicy: "reply",
      errorCooldownMs: 120000,
      groups: {
        "-1001234567890": {
          errorPolicy: "silent", // suppress errors in this group
        },
      },
    },
  },
}

Khắc phục sự cố

  • Nếu requireMention=false, chế độ riêng tư của Telegram phải cho phép hiển thị đầy đủ.
    • BotFather: /setprivacy -> Disable
    • sau đó gỡ bot khỏi nhóm rồi thêm lại
  • openclaw channels status cảnh báo khi cấu hình mong đợi tin nhắn nhóm không nhắc đến bot.
  • openclaw channels status --probe có thể kiểm tra ID nhóm dạng số rõ ràng; wildcard "*" không thể được kiểm tra tư cách thành viên.
  • kiểm tra phiên nhanh: /activation always.
  • khi channels.telegram.groups tồn tại, nhóm phải được liệt kê (hoặc bao gồm "*")
  • xác minh tư cách thành viên của bot trong nhóm
  • xem lại nhật ký: openclaw logs --follow để biết lý do bỏ qua
  • ủy quyền danh tính người gửi của bạn (ghép cặp và/hoặc allowFrom dạng số)
  • ủy quyền lệnh vẫn áp dụng ngay cả khi chính sách nhóm là open
  • setMyCommands failed với BOT_COMMANDS_TOO_MUCH nghĩa là menu gốc có quá nhiều mục; giảm số lệnh Plugin/skill/tùy chỉnh hoặc tắt menu gốc
  • Các lệnh khởi động deleteMyCommands / setMyCommands có giới hạn và thử lại một lần qua phương án dự phòng transport của Telegram khi yêu cầu hết thời gian chờ. Lỗi mạng/fetch kéo dài thường cho thấy vấn đề DNS/HTTPS tới api.telegram.org
  • getMe returned 401 là lỗi xác thực Telegram đối với token bot đã cấu hình.
  • Sao chép lại hoặc tạo lại token bot trong BotFather, rồi cập nhật channels.telegram.botToken, channels.telegram.tokenFile, channels.telegram.accounts.<id>.botToken, hoặc TELEGRAM_BOT_TOKEN cho tài khoản mặc định.
  • deleteWebhook 401 Unauthorized trong lúc khởi động cũng là lỗi xác thực; xem nó như “không có webhook tồn tại” sẽ chỉ trì hoãn cùng lỗi token xấu đó sang các lệnh gọi API sau.
  • Nếu deleteWebhook thất bại với lỗi mạng tạm thời trong khi khởi động polling, OpenClaw kiểm tra getWebhookInfo; khi Telegram báo URL webhook trống, polling tiếp tục vì việc dọn dẹp đã được thỏa mãn.
  • Node 22+ + fetch/proxy tùy chỉnh có thể kích hoạt hành vi hủy ngay lập tức nếu các kiểu AbortSignal không khớp.
  • Một số host phân giải api.telegram.org sang IPv6 trước; lưu lượng đi ra IPv6 bị lỗi có thể gây lỗi API Telegram gián đoạn.
  • Nếu log bao gồm TypeError: fetch failed hoặc Network request for 'getUpdates' failed!, OpenClaw hiện thử lại các lỗi này như lỗi mạng có thể khôi phục.
  • Nếu log bao gồm Polling stall detected, theo mặc định OpenClaw khởi động lại polling và dựng lại transport Telegram sau 120 giây không có long-poll hoàn tất để chứng minh còn hoạt động.
  • openclaw channels status --probeopenclaw doctor cảnh báo khi một tài khoản polling đang chạy chưa hoàn tất getUpdates sau thời gian gia hạn khởi động, khi một tài khoản webhook đang chạy chưa hoàn tất setWebhook sau thời gian gia hạn khởi động, hoặc khi hoạt động transport polling thành công gần nhất đã cũ.
  • Chỉ tăng channels.telegram.pollingStallThresholdMs khi các lệnh gọi getUpdates chạy lâu vẫn khỏe nhưng host của bạn vẫn báo nhầm các lần khởi động lại do polling bị kẹt. Tình trạng kẹt kéo dài thường chỉ ra sự cố proxy, DNS, IPv6 hoặc lưu lượng đi ra TLS giữa host và api.telegram.org.
  • Telegram cũng tôn trọng biến môi trường proxy của tiến trình cho transport Bot API, bao gồm HTTP_PROXY, HTTPS_PROXY, ALL_PROXY và các biến chữ thường tương ứng. NO_PROXY / no_proxy vẫn có thể bỏ qua api.telegram.org.
  • Nếu proxy do OpenClaw quản lý được cấu hình qua OPENCLAW_PROXY_URL cho môi trường dịch vụ và không có biến môi trường proxy chuẩn nào, Telegram cũng dùng URL đó cho transport Bot API.
  • Trên các host VPS có lưu lượng đi ra trực tiếp/TLS không ổn định, định tuyến các lệnh gọi API Telegram qua channels.telegram.proxy:
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
  • Node 22+ mặc định là autoSelectFamily=true (ngoại trừ WSL2) và dnsResultOrder=ipv4first.
  • Nếu host của bạn là WSL2 hoặc rõ ràng hoạt động tốt hơn với hành vi chỉ IPv4, hãy ép chọn family:
channels:
  telegram:
    network:
      autoSelectFamily: false
  • Các câu trả lời trong dải benchmark RFC 2544 (198.18.0.0/15) đã được cho phép theo mặc định cho tải xuống media Telegram. Nếu fake-IP đáng tin cậy hoặc proxy trong suốt ghi lại api.telegram.org thành một địa chỉ riêng tư/nội bộ/dùng đặc biệt khác trong khi tải xuống media, bạn có thể chọn bật bypass chỉ dành cho Telegram:
channels:
  telegram:
    network:
      dangerouslyAllowPrivateNetwork: true
  • Tùy chọn bật tương tự có sẵn theo từng tài khoản tại channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork.
  • Nếu proxy của bạn phân giải các host media Telegram thành 198.18.x.x, trước tiên hãy để cờ nguy hiểm tắt. Media Telegram đã cho phép dải benchmark RFC 2544 theo mặc định.
channels.telegram.network.dangerouslyAllowPrivateNetwork làm yếu các biện pháp bảo vệ SSRF cho media Telegram. Chỉ dùng nó cho các môi trường proxy đáng tin cậy do operator kiểm soát như định tuyến fake-IP của Clash, Mihomo hoặc Surge khi chúng tổng hợp các câu trả lời riêng tư hoặc dùng đặc biệt nằm ngoài dải benchmark RFC 2544. Hãy để tắt đối với truy cập Telegram qua internet công cộng thông thường.
  • Ghi đè bằng môi trường (tạm thời):
    • OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1
    • OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1
    • OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
  • Xác thực câu trả lời DNS:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA
Trợ giúp thêm: Khắc phục sự cố kênh.

Tham chiếu cấu hình

Tham chiếu chính: Tham chiếu cấu hình - Telegram.
  • khởi động/xác thực: enabled, botToken, tokenFile, accounts.* (tokenFile phải trỏ đến một tệp thông thường; symlink bị từ chối)
  • kiểm soát truy cập: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, bindings[] cấp cao nhất (type: "acp")
  • phê duyệt exec: execApprovals, accounts.*.execApprovals
  • lệnh/menu: commands.native, commands.nativeSkills, customCommands
  • luồng hội thoại/trả lời: replyToMode
  • truyền phát: streaming (bản xem trước), streaming.preview.toolProgress, blockStreaming
  • định dạng/phân phối: textChunkLimit, chunkMode, linkPreview, responsePrefix
  • media/mạng: mediaMaxMb, timeoutSeconds, pollingStallThresholdMs, retry, network.autoSelectFamily, network.dangerouslyAllowPrivateNetwork, proxy
  • gốc API tùy chỉnh: apiRoot (chỉ gốc Bot API; không bao gồm /bot<TOKEN>)
  • webhook: webhookUrl, webhookSecret, webhookPath, webhookHost
  • hành động/năng lực: capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker
  • reaction: reactionNotifications, reactionLevel
  • lỗi: errorPolicy, errorCooldownMs
  • ghi/lịch sử: configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit
Thứ tự ưu tiên nhiều tài khoản: khi hai ID tài khoản trở lên được cấu hình, hãy đặt channels.telegram.defaultAccount (hoặc bao gồm channels.telegram.accounts.default) để làm rõ định tuyến mặc định. Nếu không, OpenClaw quay về ID tài khoản đã chuẩn hóa đầu tiên và openclaw doctor cảnh báo. Các tài khoản có tên kế thừa channels.telegram.allowFrom / groupAllowFrom, nhưng không kế thừa các giá trị accounts.default.*.

Liên quan

Pairing

Ghép nối người dùng Telegram với gateway.

Groups

Hành vi danh sách cho phép nhóm và chủ đề.

Channel routing

Định tuyến tin nhắn đến tới các agent.

Security

Mô hình đe dọa và gia cố bảo mật.

Multi-agent routing

Ánh xạ nhóm và chủ đề tới các agent.

Troubleshooting

Chẩn đoán liên kênh.