op7418/Claude-to-IM-skill
GitHub: op7418/Claude-to-IM-skill
将 Claude Code / Codex 等 AI 编程助手桥接至主流 IM 平台,让开发者通过即时通讯软件远程与 AI 编程 Agent 交互并审批工具调用。
Stars: 2721 | Forks: 310
# Claude-to-IM Skill
将 Claude Code / Codex 桥接至 IM 平台 —— 通过 Telegram、Discord、Feishu/Lark、QQ 或 WeChat 与 AI 编程 agent 聊天。
[中文文档](README_CN.md)
## 工作原理
此 Skill 会运行一个后台 daemon,将您的 IM bot 连接到 Claude Code 或 Codex 会话。来自 IM 的消息将被转发至 AI 编程 agent,而回复(包括 tool 调用、权限请求、流式预览)将被发送回您的聊天中。
```
You (Telegram/Discord/Feishu/QQ/WeChat)
↕ Bot API
Background Daemon (Node.js)
↕ Claude Agent SDK or Codex SDK (configurable via CTI_RUNTIME)
Claude Code / Codex → reads/writes your codebase
```
## 功能
- **五大 IM 平台** — Telegram、Discord、Feishu/Lark、QQ、WeChat — 支持任意组合启用
- **交互式设置** — 引导式向导提供分步说明以收集 token
- **权限控制** — tool 调用需要通过内联按钮(Telegram/Discord)或文本 `/perm` 命令 / 快捷回复 `1/2/3`(Feishu/QQ/WeChat)获得明确批准
- **流式预览** — 在 Claude 输入时实时查看其回复(Telegram 与 Discord)
- **会话持久化** — 对话不会因 daemon 重启而丢失
- **密钥保护** — token 以 `chmod 600` 权限存储,并在所有日志中自动脱敏
- **零代码要求** — 安装 Skill 后运行 `/claude-to-im setup`,或告知 Codex `claude-to-im setup`
## 前置条件
- **Node.js >= 20**
- **Claude Code CLI**(用于 `CTI_RUNTIME=claude` 或 `auto`)— 已安装并完成身份验证(`claude` 命令可用)
- **Codex CLI**(用于 `CTI_RUNTIME=codex` 或 `auto`)— `npm install -g @openai/codex`。身份验证:运行 `codex auth login`,或设置 `OPENAI_API_KEY`(可选,用于 API 模式)
## 安装说明
请选择与您实际使用的 AI agent 产品相匹配的部分。
### Claude Code
#### 推荐:`npx skills`
```
npx skills add op7418/Claude-to-IM-skill
```
安装完成后,告诉 Claude Code:
```
/claude-to-im setup
```
如果您明确需要 WeChat,也可以说:
```
帮我接微信
```
#### 替代方案:直接克隆到 Claude Code skills 目录
```
git clone https://github.com/op7418/Claude-to-IM-skill.git ~/.claude/skills/claude-to-im
```
Claude Code 会自动发现它。
#### 替代方案:为开发创建符号链接
```
git clone https://github.com/op7418/Claude-to-IM-skill.git ~/code/Claude-to-IM-skill
mkdir -p ~/.claude/skills
ln -s ~/code/Claude-to-IM-skill ~/.claude/skills/claude-to-im
```
### Codex
#### 推荐:使用 Codex 安装脚本
```
git clone https://github.com/op7418/Claude-to-IM-skill.git ~/code/Claude-to-IM-skill
bash ~/code/Claude-to-IM-skill/scripts/install-codex.sh
```
如需基于本地实时检出进行开发:
```
bash ~/code/Claude-to-IM-skill/scripts/install-codex.sh --link
```
安装脚本会将 Skill 放置于 `~/.codex/skills/claude-to-im`,安装依赖项并构建 daemon。
安装完成后,告诉 Codex:
```
claude-to-im setup
```
如果您明确需要 WeChat,也可以说:
```
帮我接微信桥接
```
#### 替代方案:直接克隆到 Codex skills 目录
```
git clone https://github.com/op7418/Claude-to-IM-skill.git ~/.codex/skills/claude-to-im
cd ~/.codex/skills/claude-to-im
npm install
npm run build
```
### 验证安装
**Claude Code:** 启动一个新会话并输入 `/` — 您应该能在 Skill 列表中看到 `claude-to-im`。或者询问 Claude:“有哪些可用的 Skill?”
**Codex:** 启动一个新会话并说 `claude-to-im setup`、`start bridge`,或 `帮我接微信桥接`。
## 更新 Skill
请选择与您的 AI agent 产品及安装方式均匹配的更新流程。
### Claude Code
如果您使用 `npx skills` 安装,请重新运行:
```
npx skills add op7418/Claude-to-IM-skill
```
如果您通过 `git clone` 或符号链接安装:
```
cd ~/.claude/skills/claude-to-im
git pull
npm install
npm run build
```
然后告诉 Claude Code:
```
/claude-to-im doctor
/claude-to-im start
```
### Codex
如果您使用 Codex 安装脚本以拷贝模式安装:
```
rm -rf ~/.codex/skills/claude-to-im
bash ~/code/Claude-to-IM-skill/scripts/install-codex.sh
```
如果您使用 `--link` 安装或直接克隆到了 Codex skills 目录:
```
cd ~/.codex/skills/claude-to-im
git pull
npm install
npm run build
```
然后告诉 Codex:
```
claude-to-im doctor
start bridge
```
## 快速开始
### 1. 设置
**Claude Code**
```
/claude-to-im setup
```
**Codex**
```
claude-to-im setup
```
向导将引导您完成:
1. **选择渠道** — 选择 Telegram、Discord、Feishu、QQ、WeChat 或其任意组合
2. **输入凭据** — 向导会详细说明从何处获取每个 token、需要开启哪些设置以及需要授予哪些权限
3. **设置默认项** — 工作目录、模型与模式
4. **验证** — 立即根据平台 API 验证 token
### 2. 启动
**Claude Code**
```
/claude-to-im start
```
**Codex**
```
start bridge
```
daemon 将在后台启动。您可以关闭终端 — 它会持续运行。
### 3. 聊天
打开您的 IM 应用并向您的 bot 发送消息。Claude Code / Codex 将通过桥接进行回复。
当 Claude 需要使用 tool(编辑文件、运行命令)时,您会在聊天中直接看到一个带有 **Allow** / **Deny** 按钮的权限提示(Telegram/Discord),或一个文本 `/perm` 命令提示 / 快捷回复 `1/2/3`(Feishu/QQ/WeChat)。
## 命令
所有命令均在 Claude Code 或 Codex 中运行:
| Claude Code | Codex(自然语言) | 描述 |
|---|---|---|
| `/claude-to-im setup` | "claude-to-im setup" / "配置" | 交互式设置向导 |
| `/claude-to-im start` | "start bridge" / "启动桥接" | 启动桥接 daemon |
| `/claude-to-im stop` | "stop bridge" / "停止桥接" | 停止桥接 daemon |
| `/claude-to-im status` | "bridge status" / "状态" | 显示 daemon 状态 |
| `/claude-to-im logs` | "查看日志" | 显示最后 50 行日志 |
| `/claude-to-im logs 200` | "logs 200" | 显示最后 200 行日志 |
| `/claude-to-im reconfigure` | "reconfigure" / "修改配置" | 交互式更新配置 |
| `/claude-to-im doctor` | "doctor" / "诊断" | 诊断问题 |
## 平台设置指南
`setup` 向导为每一步提供了内联指导。以下是总结:
### Telegram
1. 在 Telegram 上向 `@BotFather` 发送消息 → `/newbot` → 按照提示操作
2. 复制 bot token(格式:`123456789:AABbCc...`)
3. 推荐:`/setprivacy` → Disable(供群组使用)
4. 查找您的 User ID:向 `@userinfobot` 发送消息
### Discord
1. 前往 [Discord Developer Portal](https://discord.com/developers/applications) → New Application
2. Bot 标签页 → Reset Token → 复制它
3. 在 Privileged Gateway Intents 下启用 **Message Content Intent**
4. OAuth2 → URL Generator → scope 选择 `bot` → permissions 勾选:Send Messages、Read Message History、View Channels → 复制邀请 URL
### Feishu / Lark
1. 前往 [Feishu Open Platform](https://open.feishu.cn/app)(或 [Lark](https://open.larksuite.com/app))
2. 创建 Custom App → 获取 App ID 和 App Secret
3. **批量添加权限**:前往“Permissions & Scopes” → 使用批量配置添加所有必需的 scope(`setup` 向导会提供确切的 JSON)
4. 在“Add Features”下启用 Bot 功能
5. **Events & Callbacks**:选择 **“Long Connection”** 作为事件分发方式 → 添加 `im.message.receive_v1` 事件
6. **发布**:前往“Version Management & Release” → 创建版本 → 提交审核 → 在 Admin Console 中批准
7. **重要**:在版本获得批准并发布之前,bot 将无法工作
### QQ
1. 前往 [QQ Bot OpenClaw](https://q.qq.com/qqbot/openclaw)
2. 创建一个 QQ Bot 或选择现有的 bot → 获取 **App ID** 和 **App Secret**(仅需这两项必填字段)
3. 配置沙箱访问并使用 QQ 扫描二维码以添加 bot
4. `CTI_QQ_ALLOWED_USERS` 接受 `user_openid` 值(而非 QQ 号码)— 初始可为空
5. 如果底层 provider 不支持图片输入,请设置 `CTI_QQ_IMAGE_ENABLED=false`
### WeChat / Weixin
1. 从已安装的 Skill 目录运行本地二维码辅助程序:
- Claude Code 默认安装:`cd ~/.claude/skills/claude-to-im && npm run weixin:login`
- Codex 默认安装:`cd ~/.codex/skills/claude-to-im && npm run weixin:login`
2. 辅助程序会写入 `~/.claude-to-im/runtime/weixin-login.html` 并尝试自动在您的浏览器中打开它
3. 使用 WeChat 扫描二维码并在手机上确认
4. 成功后,关联的账号将存储于 `~/.claude-to-im/data/weixin-accounts.json`
5. 再次运行辅助程序将替换之前关联的 WeChat 账号
补充说明:
- `CTI_WEIXIN_MEDIA_ENABLED` 仅控制入站的图片/文件/视频下载
- 语音消息仅使用 WeChat 内置的语音转文本功能
- 如果 WeChat 未提供 `voice_item.text`,桥接将回复错误,而不是下载/转录原始语音音频
- 权限批准使用文本 `/perm ...` 命令或快捷回复 `1/2/3`
## 架构
```
~/.claude-to-im/
├── config.env ← Credentials & settings (chmod 600)
├── data/ ← Persistent JSON storage
│ ├── sessions.json
│ ├── bindings.json
│ ├── permissions.json
│ └── messages/ ← Per-session message history
├── logs/
│ └── bridge.log ← Auto-rotated, secrets redacted
└── runtime/
├── bridge.pid ← Daemon PID file
└── status.json ← Current status
```
### 关键组件
| 组件 | 作用 |
|---|---|
| `src/main.ts` | daemon 入口 — 组装 DI,启动桥接 |
| `src/config.ts` | 加载/保存 `config.env`,映射至桥接设置 |
| `src/store.ts` | JSON 文件 BridgeStore(30 个方法,直写缓存) |
| `src/llm-provider.ts` | Claude Agent SDK `query()` → SSE 流 |
| `src/codex-provider.ts` | Codex SDK `runStreamed()` → SSE 流 |
| `src/sse-utils.ts` | 共享 SSE 格式化助手 |
| `src/permission-gateway.ts` | 异步桥接:SDK `canUseTool` ↔ IM 按钮 |
| `src/logger.ts` | 密钥脱敏的文件日志(带轮换功能) |
| `scripts/daemon.sh` | 进程管理(启动/停止/状态/日志) |
| `scripts/doctor.sh` | 健康检查 |
| `SKILL.md` | Claude Code Skill 定义 |
### 权限流程
```
1. Claude wants to use a tool (e.g., Edit file)
2. SDK calls canUseTool() → LLMProvider emits permission_request SSE
3. Bridge sends inline buttons to IM chat: [Allow] [Deny]
4. canUseTool() blocks, waiting for user response (5 min timeout)
5. User taps Allow → bridge resolves the pending permission
6. SDK continues tool execution → result streamed back to IM
```
## 故障排除
运行诊断:
```
/claude-to-im doctor
```
此操作会检查:Node.js 版本、配置文件存在性与权限、token 有效性(实时 API 调用)、日志目录、PID 文件一致性以及最近的错误。
| 问题 | 解决方案 |
|---|---|
| `Bridge won't start` | 运行 `doctor`。检查 Node 是否 >= 20。检查日志。 |
| `Messages not received` | 使用 `doctor` 验证 token。检查允许的用户配置。 |
| `Permission timeout` | 用户未在 5 分钟内响应。tool 调用自动被拒绝。 |
| `Stale PID file` | 依次运行 `stop` 和 `start`。daemon.sh 会自动清理过期 PID。 |
查看 [references/troubleshooting.md](references/troubleshooting.md) 了解更多详情。
## 安全性
- 所有凭据均以 `chmod 600` 权限存储在 `~/.claude-to-im/config.env` 中
- token 在所有日志输出中都会被自动脱敏(基于模式的掩码处理)
- 允许的用户/频道/guild 列表限制了可以与 bot 交互的对象
- daemon 是一个本地进程,没有入站网络监听器
- 请参阅 [SECURITY.md](SECURITY.md) 了解威胁模型与事件响应
## 开发
```
npm install # Install dependencies
npm run dev # Run in dev mode
npm run typecheck # Type check
npm test # Run tests
npm run build # Build bundle
```
## 许可证
[MIT](LICENSE)
标签:Discord, GNU通用公共许可证, MITM代理, Node.js, SOC Prime, Telegram, 人工智能, 开发工具, 消息桥接, 用户模式Hook绕过, 自动化攻击, 飞书