Configuration, troubleshooting, and operational guide for Research-Claw IM channels (Telegram, Discord, WeChat, Feishu, Slack, WhatsApp). Covers dashboard UI flow, bot token setup, QR login, config.patch restart behavior, enable/disable/delete, common errors (401, ABI, plugins.allow), and diagnostic procedures.
RC can receive/reply via Telegram, Discord, WeChat (微信), Feishu (飞书), QQ, Slack, WhatsApp. Channels are OC infrastructure — RC reuses them fully.
The dashboard has a complete channel management UI in the left sidebar.
Location: Left sidebar → Extensions panel (🔗 chain-link icon) → Channels tab.
config.patchconfig.patch to write it. Or they can click "Ask Agent to Configure".weixin_login / whatsapp_login agent tools are fallbacks for IM-only contexts
(when the user is chatting from Telegram/Discord and has no dashboard access)./newbot → copy token.config.patch:
{ channels: { telegram: { botToken: "<TOKEN>", enabled: true } } }{ channels: { discord: { token: "<TOKEN>", enabled: true } } }{ channels: { feishu: { appId: "...", appSecret: "...", enabled: true } } }config.patch: Gateway auto-restarts via SIGUSR1 (takes ~3–5s). The dashboard
reconnects automatically. No manual restart needed.commands.native must be false (530+ tools exceed IM menu limits).
sync-global-config.cjs auto-fixes this on startup.Prerequisite: openclaw-weixin plugin installed and in plugins.allow.
Primary path (dashboard): User clicks Connect in the Channels tab → QR modal → scan.
The dashboard handles web.login.start → web.login.wait automatically,
then triggers config.patch to restart gateway and pick up new credentials.
Fallback path (IM-only / no dashboard): Use the weixin_login agent tool:
weixin_login { action: "start" }.
.weixin_login { action: "wait", timeoutMs: 120000 }.
Primary path: Same as WeChat — user clicks Connect in the Channels tab.
Fallback path (IM-only): Use the whatsapp_login agent tool:
whatsapp_login { action: "start" }.
.whatsapp_login { action: "wait", timeoutMs: 120000 }.
Understanding this is critical for troubleshooting:
config.patch → gateway receives SIGUSR1 → drains active tasks (up to 90s)
→ restarts → channels reload from new config. Dashboard auto-reconnects.config.patch with
{ channels: { <id>: { enabled: true/false } } } → restart.config.patch with { channels: { <id>: null } } → restart.<YOUR_TOKEN>), the channel
will crash on startup with 401 Unauthorized and enter an auto-restart loop
(exponential backoff: 5s → 10s → 20s → ... up to 10 attempts). This is normal;
it stops after 10 failures. Fix: provide correct token or disable the channel.approval_card degrades to text: "需要审批: xxx. 回复 yes/no".[email protected], Telegram numeric IDs.| Symptom | Cause | Fix |
|---|---|---|
401: Unauthorized loop | Invalid or placeholder bot token | Provide real token via config.patch or disable channel |
| "not configured" | No credentials found for channel | For bot-token: set token in config. For WeChat: re-scan QR |
| "Provider not running" | Channel configured but crashed | Check logs for error. Common: token expired, network issue |
| Channel not visible | Plugin not in plugins.allow or plugins.load.paths | Add to both in config. See 4-point sync below |
better-sqlite3 crash | Native module ABI mismatch | Rebuild under conda Node 22 (gateway's Node version) |
| WeChat "not configured" after QR | Old default account has no token | Re-scan QR. Dashboard uses best account for status |
When a channel shows Error or Not Configured:
config.get or ask user. Is it a real token
or a placeholder like <YOUR_TOKEN>? Placeholder = 401 errors.plugins.allow: The channel plugin ID must be in plugins.allow array.
Example: openclaw-weixin for WeChat, telegram for Telegram (OC built-in).~/.openclaw/openclaw-weixin/accounts/<accountId>.json. If missing, user needs to re-scan QR.[telegram], [openclaw-weixin] etc. in terminal output.
Common patterns:
401: Unauthorized → invalid tokenENOTFOUND / ETIMEDOUT → network/VPN issuechannel exited → channel crashed, will auto-restartgateway.restart (requires approval_card).
Or user can Ctrl+C and re-run run.sh.When adding a new channel plugin, it must be registered in 4 places:
config/openclaw.json → plugins.allow arrayconfig/openclaw.json → plugins.load.paths arrayscripts/ensure-config.cjs → REQUIRED_ALLOW arraydashboard/src/utils/config-patch.ts → RC_CONFIG_DEFAULTS.plugins.allow
Plus the runtime global ~/.openclaw/openclaw.json.