
claude-to-im
热门将当前的 Claude Code 或 Codex 会话桥接到 Telegram、Discord、飞书/Lark、QQ 或微信,让用户可以在手机上与 Claude 聊天。用于:设置、启动、停止或诊断 claude-to-im 桥接守护进程;将 Claude 回复转发到即时通讯应用;任何包含“claude-to-im”、“bridge”、“消息推送”、“消息转发”、“桥接”、“连上飞书”、“手机上看claude”、“启动后台服务”、“诊断”、“查看日志”、“配置”等短语的请求。子命令:setup、start、stop、status、logs、reconfigure、doctor。不要用于:构建独立机器人、Webhook 集成或使用 IM 平台 SDK 进行编程——这些是常规编程任务。
将当前的 Claude Code 或 Codex 会话桥接到 Telegram、Discord、飞书/Lark、QQ 或微信,让用户可以在手机上与 Claude 聊天。用于:设置、启动、停止或诊断 claude-to-im 桥接守护进程;将 Claude 回复转发到即时通讯应用;任何包含“claude-to-im”、“bridge”、“消息推送”、“消息转发”、“桥接”、“连上飞书”、“手机上看claude”、“启动后台服务”、“诊断”、“查看日志”、“配置”等短语的请求。 子命令:setup、start、stop、status、logs、reconfigure、doctor。 不要用于:构建独立机器人、Webhook 集成或使用 IM 平台 SDK 进行编程——这些是常规编程任务。
Claude-to-IM 桥接技能
你正在管理 Claude-to-IM 桥接。
用户数据存储在 ~/.claude-to-im/。
技能目录(SKILL_DIR)位于 ~/.claude/skills/claude-to-im。
在 Codex 安装中,可能位于 ~/.codex/skills/Claude-to-IM-skill。
如果两个路径都不存在,则回退到使用 Glob 模式 **/skills/**/claude-to-im/SKILL.md 或 **/skills/**/Claude-to-IM-skill/SKILL.md,并从结果中推导出根目录。
命令解析
将用户的意图从 $ARGUMENTS 解析为以下子命令之一:
| 用户输入(示例) | 子命令 |
|---|---|
setup, configure, 配置, 我想在飞书上用 Claude, 帮我连接 Telegram, 帮我接微信 |
setup |
start, start bridge, 启动, 启动桥接 |
start |
stop, stop bridge, 停止, 停止桥接 |
stop |
status, bridge status, 状态, 运行状态, 怎么看桥接的运行状态 |
status |
logs, logs 200, 查看日志, 查看日志 200 |
logs |
reconfigure, 修改配置, 帮我改一下 token, 换个 bot |
reconfigure |
doctor, diagnose, 诊断, 挂了, 没反应了, bot 没反应, 出问题了 |
doctor |
消歧:status vs doctor — 当用户只想检查桥接是否在运行(信息性)时使用 status。当用户报告问题或怀疑有故障(诊断性)时使用 doctor。如有疑问且用户描述了症状(例如“没反应了”、“挂了”),优先使用 doctor。
提取 logs 的可选数字参数(默认 50)。
在向用户询问任何平台凭证之前,先内部读取 SKILL_DIR/references/setup-guides.md,以便知道每个凭证在哪里获取。不要一次性将完整指南展示给用户——只提及他们需要执行的具体下一步(例如,“前往 https://open.feishu.cn → 你的应用 → 凭证,找到 App ID”)。如果用户表示不知道如何操作,则展示指南的相关部分。
运行时检测
在执行任何子命令之前,检测你正在哪个环境中运行:
- Claude Code —
AskUserQuestion工具可用。用于交互式设置向导。 - Codex / 其他 —
AskUserQuestion不可用。回退到非交互式指导:解释步骤,展示SKILL_DIR/config.env.example,并要求用户手动创建~/.claude-to-im/config.env。
你可以通过检查 AskUserQuestion 是否在你的可用工具列表中来测试。
配置检查(适用于 start、stop、status、logs、reconfigure、doctor)
在运行除 setup 之外的任何子命令之前,检查 ~/.claude-to-im/config.env 是否存在:
- 如果不存在:
- 在 Claude Code 中:告诉用户“未找到配置”,并自动使用 AskUserQuestion 启动
setup向导。 - 在 Codex 中:告诉用户“未找到配置。请根据示例创建
~/.claude-to-im/config.env:”,然后展示SKILL_DIR/config.env.example的内容并停止。不要尝试启动守护进程——没有 config.env,进程会在启动时崩溃并留下过时的 PID 文件,从而阻止后续启动。
- 在 Claude Code 中:告诉用户“未找到配置”,并自动使用 AskUserQuestion 启动
- 如果存在: 继续执行请求的子命令。
子命令
setup
运行交互式设置向导。此子命令需要 AskUserQuestion。如果不可用(Codex 环境),则展示 SKILL_DIR/config.env.example 的内容,并逐字段解释,指导用户手动创建配置文件。
当 AskUserQuestion 可用时,一次收集一个字段。在每个答案之后,向用户确认值(将秘密掩码为仅最后 4 个字符),然后再进入下一个问题。
步骤 1 — 选择渠道
询问要启用哪些渠道(telegram、discord、feishu、qq、weixin)。接受逗号分隔的输入。简要描述每个渠道:
- telegram — 最适合个人使用。流式预览,内联权限按钮。
- discord — 适合团队使用。服务器/频道/用户级别的访问控制。
- feishu(Lark)— 适用于飞书/Lark 团队。流式卡片,工具进度,内联权限按钮。
- qq — 仅 QQ C2C 私聊。无内联权限按钮,无流式预览。权限使用文本
/perm ...命令。 - weixin — 微信二维码登录。仅支持单个关联账户;新登录会替换之前的账户。无内联权限按钮,无流式预览。权限使用文本
/perm ...命令或快速1/2/3回复。语音消息仅使用微信自带的语音转文字文本;桥接不会转录原始语音音频。
步骤 2 — 每个渠道收集令牌
对于每个启用的渠道,一次收集一个凭证。用一句话告诉用户在哪里找到每个值。仅当用户请求帮助或表示不知道如何操作时,才展示完整指南部分(来自 SKILL_DIR/references/setup-guides.md):
- Telegram:Bot Token → 确认(掩码)→ Chat ID(参见指南如何获取)→ 确认 → 允许的用户 ID(可选)。重要: 必须至少设置 Chat ID 或允许的用户 ID 之一,否则机器人将拒绝所有消息。
- Discord:Bot Token → 确认(掩码)→ 允许的用户 ID → 允许的频道 ID(可选)→ 允许的服务器 ID(可选)。重要: 必须至少设置允许的用户 ID 或允许的频道 ID 之一,否则机器人将拒绝所有消息(默认拒绝)。
- Feishu:App ID → 确认 → App Secret → 确认(掩码)→ 域名(可选)→ 允许的用户 ID(可选)。收集凭证后,解释用户必须完成的两阶段设置:
- 阶段 1(启动桥接前):(A) 批量添加权限,(B) 启用机器人能力,(C) 发布第一个版本 + 管理员审批。这使权限和机器人生效。
- 阶段 2(需要运行桥接):(D) 运行
/claude-to-im start,(E) 配置事件(im.message.receive_v1)和回调(card.action.trigger)使用长连接模式,(F) 发布第二个版本 + 管理员审批。 - 为什么需要两个阶段: 飞书在保存事件订阅时会验证 WebSocket 连接——如果桥接未运行,保存将失败。桥接需要已发布的权限才能连接。
- 保持为简短清单——仅在用户询问时展示完整指南。
- QQ:收集两个必填字段,然后是可选字段:
- QQ App ID(必填)→ 确认
- QQ App Secret(必填)→ 确认(掩码)
- 告诉用户:这两个值可以在 https://q.qq.com/qqbot/openclaw 找到
- 允许的用户 OpenID(可选,按 Enter 跳过)— 注意:这是
user_openid,不是 QQ 号码。如果用户还没有 openid,可以留空。 - 启用图片(可选,默认为 true,按 Enter 跳过)— 如果底层提供商不支持图片输入,设置为 false
- 最大图片大小 MB(可选,默认为 20,按 Enter 跳过)
- 提醒用户:QQ 第一个版本仅支持 C2C 私聊沙箱访问。不支持群组/频道,无内联按钮,无流式预览。
- Weixin:不要询问静态令牌。而是:
- 告诉用户此渠道使用二维码登录,而不是手动输入凭证。
- 运行
cd SKILL_DIR && npm run weixin:login - 辅助程序写入
~/.claude-to-im/runtime/weixin-login.html并尝试在本地浏览器中自动打开。 - 如果自动打开失败,告诉用户手动打开该 HTML 文件并使用微信扫描二维码。
- 等待辅助程序报告成功,然后确认关联账户已本地保存。
- 简要说明:关联的微信账户存储在
~/.claude-to-im/data/weixin-accounts.json。再次运行辅助程序将替换之前关联的账户。 - 简要说明:
CTI_WEIXIN_MEDIA_ENABLED仅控制入站图片/文件/视频下载。对于语音消息,桥接仅接受微信内置语音转文字返回的文本。如果微信未提供转录文本,桥接会回复错误,而不是下载/转录原始音频。
步骤 3 — 通用设置
询问运行时、默认工作目录、模型和模式:
- 运行时:
claude(默认)、codex、autoclaude— 使用 Claude Code CLI + Claude Agent SDK(需要安装claudeCLI)codex— 使用 OpenAI Codex SDK(需要codexCLI;通过codex auth login或OPENAI_API_KEY进行身份验证)auto— 先尝试 Claude,如果未找到 Claude CLI 则回退到 Codex
- 工作目录:默认为
$CWD - 模型(可选):留空则继承运行时的默认模型。如果用户想要覆盖,请他们输入模型名称。不要硬编码或建议特定的模型名称——可用模型会随时间变化。
- 模式:
code(默认)、plan、ask
步骤 4 — 写入配置并验证
- 显示最终摘要表,包含所有设置(秘密掩码为仅最后 4 个字符)
- 在写入前请求用户确认
- 使用 Bash 创建目录结构:
mkdir -p ~/.claude-to-im/{data,logs,runtime,data/messages} - 使用 Write 创建
~/.claude-to-im/config.env,所有设置采用 KEY=VALUE 格式 - 使用 Bash 设置权限:
chmod 600 ~/.claude-to-im/config.env - 验证令牌——读取
SKILL_DIR/references/token-validation.md以获取每个平台的确切命令和预期响应。这可以在用户尝试启动守护进程之前捕获拼写错误和错误的凭证。对于微信,成功的二维码登录即可视为验证。 - 用摘要表报告结果。如果任何验证失败,解释可能的问题及修复方法。
- 成功后,告诉用户:“设置完成!运行
/claude-to-im start启动桥接。”
start
预检查: 确认 ~/.claude-to-im/config.env 存在(参见“配置检查”)。没有它,守护进程会立即崩溃并留下过时的 PID 文件。
运行:bash "SKILL_DIR/scripts/daemon.sh" start
向用户显示输出。如果失败,告诉用户:
- 运行
doctor进行诊断:/claude-to-im doctor - 检查最近的日志:
/claude-to-im logs
stop
运行:bash "SKILL_DIR/scripts/daemon.sh" stop
status
运行:bash "SKILL_DIR/scripts/daemon.sh" status
logs
从参数中提取可选的行数 N(默认 50)。
运行:bash "SKILL_DIR/scripts/daemon.sh" logs N
reconfigure
- 从
~/.claude-to-im/config.env读取当前配置 - 以清晰的表格格式显示当前设置,所有秘密掩码(仅最后 4 个字符可见)
- 使用 AskUserQuestion 询问用户想要更改什么
- 收集新值时,告诉用户在哪里找到该值;仅当用户请求帮助时才展示来自
SKILL_DIR/references/setup-guides.md的完整指南 - 原子地更新配置文件(写入临时文件,重命名)
- 重新验证任何更改的令牌
- 提醒用户:“运行
/claude-to-im stop然后/claude-to-im start以应用更改。”
如果用户在 reconfigure 期间想要切换微信账户,再次运行 cd SKILL_DIR && npm run weixin:login。每次成功扫描都会替换之前关联的本地账户。
doctor
运行:bash "SKILL_DIR/scripts/doctor.sh"
显示结果并建议修复任何故障。常见修复:
- SDK cli.js 缺失 →
cd SKILL_DIR && npm install - dist/daemon.mjs 过时 →
cd SKILL_DIR && npm run build - 配置缺失 → 运行
setup - 微信账户缺失/过期 →
cd SKILL_DIR && npm run weixin:login - 微信语音消息报告缺少语音转文字 → 启用微信自带的语音转录并重新发送;桥接本身不会转录原始语音音频
对于更复杂的问题(消息未收到、权限超时、内存过高、过时的 PID 文件),读取 SKILL_DIR/references/troubleshooting.md 获取详细的诊断步骤。
飞书升级说明: 如果用户从旧版本升级此技能,并且飞书返回权限错误(例如流式卡片无法工作、输入指示器失败、权限按钮无响应),根本原因几乎肯定是飞书后端缺少权限或回调。引导用户查看 SKILL_DIR/references/setup-guides.md 中的“从先前版本升级”部分——他们需要添加新的作用域(cardkit:card:write、cardkit:card:read、im:message:update、im:message.reactions:read、im:message.reactions:write_only),添加 card.action.trigger 回调,并重新发布应用。升级需要两个发布周期,因为添加回调需要活动的 WebSocket 连接(桥接必须正在运行)。
注意事项
- 始终在输出中掩码秘密(仅显示最后 4 个字符)——用户经常在错误报告中分享终端输出,暴露的令牌将构成安全事件。
- 在启动守护进程之前始终检查 config.env——没有它,进程会在启动时崩溃并留下过时的 PID 文件,从而阻止后续启动(需要手动清理)。
- 守护进程作为后台 Node.js 进程运行,由平台管理器管理(macOS 上为 launchd,Linux 上为 setsid,Windows 上为 WinSW/NSSM)。
- 配置持久化在
~/.claude-to-im/config.env——跨会话保留。





