claude-to-im

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 进行编程——这些是常规编程任务。

2812Star
317Fork
更新于 2026/3/23
SKILL.md
readonly只读
name
claude-to-im
description

将当前的 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”)。如果用户表示不知道如何操作,则展示指南的相关部分。

运行时检测

在执行任何子命令之前,检测你正在哪个环境中运行:

  1. Claude CodeAskUserQuestion 工具可用。用于交互式设置向导。
  2. Codex / 其他AskUserQuestion 不可用。回退到非交互式指导:解释步骤,展示 SKILL_DIR/config.env.example,并要求用户手动创建 ~/.claude-to-im/config.env

你可以通过检查 AskUserQuestion 是否在你的可用工具列表中来测试。

配置检查(适用于 startstopstatuslogsreconfiguredoctor

在运行除 setup 之外的任何子命令之前,检查 ~/.claude-to-im/config.env 是否存在:

  • 如果不存在:
    • 在 Claude Code 中:告诉用户“未找到配置”,并自动使用 AskUserQuestion 启动 setup 向导。
    • 在 Codex 中:告诉用户“未找到配置。请根据示例创建 ~/.claude-to-im/config.env:”,然后展示 SKILL_DIR/config.env.example 的内容并停止。不要尝试启动守护进程——没有 config.env,进程会在启动时崩溃并留下过时的 PID 文件,从而阻止后续启动。
  • 如果存在: 继续执行请求的子命令。

子命令

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:收集两个必填字段,然后是可选字段:
    1. QQ App ID(必填)→ 确认
    2. QQ App Secret(必填)→ 确认(掩码)
    1. 允许的用户 OpenID(可选,按 Enter 跳过)— 注意:这是 user_openid,不是 QQ 号码。如果用户还没有 openid,可以留空。
    2. 启用图片(可选,默认为 true,按 Enter 跳过)— 如果底层提供商不支持图片输入,设置为 false
    3. 最大图片大小 MB(可选,默认为 20,按 Enter 跳过)
    • 提醒用户:QQ 第一个版本仅支持 C2C 私聊沙箱访问。不支持群组/频道,无内联按钮,无流式预览。
  • Weixin:不要询问静态令牌。而是:
    1. 告诉用户此渠道使用二维码登录,而不是手动输入凭证。
    2. 运行 cd SKILL_DIR && npm run weixin:login
    3. 辅助程序写入 ~/.claude-to-im/runtime/weixin-login.html 并尝试在本地浏览器中自动打开。
    4. 如果自动打开失败,告诉用户手动打开该 HTML 文件并使用微信扫描二维码。
    5. 等待辅助程序报告成功,然后确认关联账户已本地保存。
    • 简要说明:关联的微信账户存储在 ~/.claude-to-im/data/weixin-accounts.json。再次运行辅助程序将替换之前关联的账户。
    • 简要说明:CTI_WEIXIN_MEDIA_ENABLED 仅控制入站图片/文件/视频下载。对于语音消息,桥接仅接受微信内置语音转文字返回的文本。如果微信未提供转录文本,桥接会回复错误,而不是下载/转录原始音频。

步骤 3 — 通用设置

询问运行时、默认工作目录、模型和模式:

  • 运行时claude(默认)、codexauto
    • claude — 使用 Claude Code CLI + Claude Agent SDK(需要安装 claude CLI)
    • codex — 使用 OpenAI Codex SDK(需要 codex CLI;通过 codex auth loginOPENAI_API_KEY 进行身份验证)
    • auto — 先尝试 Claude,如果未找到 Claude CLI 则回退到 Codex
  • 工作目录:默认为 $CWD
  • 模型(可选):留空则继承运行时的默认模型。如果用户想要覆盖,请他们输入模型名称。不要硬编码或建议特定的模型名称——可用模型会随时间变化。
  • 模式code(默认)、planask

步骤 4 — 写入配置并验证

  1. 显示最终摘要表,包含所有设置(秘密掩码为仅最后 4 个字符)
  2. 在写入前请求用户确认
  3. 使用 Bash 创建目录结构:mkdir -p ~/.claude-to-im/{data,logs,runtime,data/messages}
  4. 使用 Write 创建 ~/.claude-to-im/config.env,所有设置采用 KEY=VALUE 格式
  5. 使用 Bash 设置权限:chmod 600 ~/.claude-to-im/config.env
  6. 验证令牌——读取 SKILL_DIR/references/token-validation.md 以获取每个平台的确切命令和预期响应。这可以在用户尝试启动守护进程之前捕获拼写错误和错误的凭证。对于微信,成功的二维码登录即可视为验证。
  7. 用摘要表报告结果。如果任何验证失败,解释可能的问题及修复方法。
  8. 成功后,告诉用户:“设置完成!运行 /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

  1. ~/.claude-to-im/config.env 读取当前配置
  2. 以清晰的表格格式显示当前设置,所有秘密掩码(仅最后 4 个字符可见)
  3. 使用 AskUserQuestion 询问用户想要更改什么
  4. 收集新值时,告诉用户在哪里找到该值;仅当用户请求帮助时才展示来自 SKILL_DIR/references/setup-guides.md 的完整指南
  5. 原子地更新配置文件(写入临时文件,重命名)
  6. 重新验证任何更改的令牌
  7. 提醒用户:“运行 /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:writecardkit:card:readim:message:updateim:message.reactions:readim: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——跨会话保留。