{"id":48147146,"url":"https://github.com/wxkingstar/clawrelay-wecom-server","last_synced_at":"2026-04-04T17:01:24.501Z","repository":{"id":343162192,"uuid":"1175729942","full_name":"wxkingstar/clawrelay-wecom-server","owner":"wxkingstar","description":"Claude Code 企业微信中转服务 — 通过 WebSocket 让企业微信机器人接入 Claude Code，无需公网IP，流式回复，开箱即用。A WeCom bot relay for Claude Code.","archived":false,"fork":false,"pushed_at":"2026-03-25T04:00:46.000Z","size":487,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T09:46:56.602Z","etag":null,"topics":["ai-chatbot","anthropic","claude","claude-code","claude-code-bot","claude-code-proxy","claude-code-relay","clawrelay","enterprise-wechat","openclaw","sse","streaming","websocket","wecom","wecom-bot"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wxkingstar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-08T04:50:15.000Z","updated_at":"2026-03-25T04:00:50.000Z","dependencies_parsed_at":"2026-03-09T11:07:35.440Z","dependency_job_id":null,"html_url":"https://github.com/wxkingstar/clawrelay-wecom-server","commit_stats":null,"previous_names":["wxkingstar/clawrelay-wecom-server"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wxkingstar/clawrelay-wecom-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wxkingstar%2Fclawrelay-wecom-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wxkingstar%2Fclawrelay-wecom-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wxkingstar%2Fclawrelay-wecom-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wxkingstar%2Fclawrelay-wecom-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wxkingstar","download_url":"https://codeload.github.com/wxkingstar/clawrelay-wecom-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wxkingstar%2Fclawrelay-wecom-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31407385,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-chatbot","anthropic","claude","claude-code","claude-code-bot","claude-code-proxy","claude-code-relay","clawrelay","enterprise-wechat","openclaw","sse","streaming","websocket","wecom","wecom-bot"],"created_at":"2026-04-04T17:01:21.366Z","updated_at":"2026-04-04T17:01:24.466Z","avatar_url":"https://github.com/wxkingstar.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ClawRelay WeCom Server\n\nClaude Code 企业微信中转服务 —— 三步启动，开箱即用。\n\n\u003e A WeCom (Enterprise WeChat) bot relay for Claude Code. Open-source alternative to [Openclaw](https://github.com/nicepkg/openclaw).\n\n![Python 3.12+](https://img.shields.io/badge/Python-3.12+-blue.svg)\n![License MIT](https://img.shields.io/badge/License-MIT-yellow.svg)\n\n将 [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) 接入企业微信的开源中转方案。支持流式回复、多模态消息、多机器人管理，**无需公网 IP**。\n\n```\n企业微信用户发消息 → 本服务 WebSocket 接收 → clawrelay-api → Claude Code 处理 → 流式回复推送\n```\n\n无需回调 URL，无需数据库。通过 WebSocket 长连接直连企业微信，YAML 配置即用。\n\n---\n\n## 30 秒了解\n\n你需要准备：\n\n1. **企业微信智能机器人**的 `bot_id` 和 `secret`（从企业微信管理后台 → 应用管理 → 智能机器人 获取）\n2. **[clawrelay-api](https://github.com/roodkcab/clawrelay-api)** 运行在本机（默认端口 50009）\n\n然后：\n\n```bash\ngit clone https://github.com/wxkingstar/clawrelay-wecom-server.git\ncd clawrelay-wecom-server\npip install -r requirements.txt\npython main.py\n```\n\n首次启动会自动进入**配置向导**，按提示填入 `bot_id` 和 `secret` 即可：\n\n```\n============================================================\n  ClawRelay WeCom Server — 首次配置向导\n============================================================\n\n  bot_id（企业微信机器人 ID）: __________\n  secret（企业微信机器人密钥）: __________\n  relay_url（clawrelay-api 地址）[http://localhost:50009]: __________\n\n  配置已保存到 config/bots.yaml\n```\n\n配置完成，服务自动启动 WebSocket 连接。去企业微信给机器人发条消息试试吧。\n\n---\n\n## Docker 部署\n\n```bash\ngit clone https://github.com/wxkingstar/clawrelay-wecom-server.git\ncd clawrelay-wecom-server\n\n# 编辑配置（Docker 中不支持交互式向导，需提前填写）\ncp config/bots.yaml.example config/bots.yaml\nvim config/bots.yaml\n\ndocker compose up -d\n```\n\n\u003e Docker 模式下 `relay_url` 需使用 `http://host.docker.internal:50009`（而非 `localhost`）连接宿主机的 clawrelay-api。\n\n```bash\ndocker compose logs -f app   # 查看日志\ndocker compose down           # 停止\n```\n\n---\n\n## 功能一览\n\n| 特性 | 说明 |\n|------|------|\n| **WebSocket 长连接** | 无需公网 IP、回调 URL，WSS 直连企业微信 |\n| **零外部依赖** | 无数据库，YAML 配置 + 内存会话 + JSONL 日志 |\n| **首次配置向导** | 启动即引导，无需手动编辑配置文件 |\n| **多机器人** | 一个服务托管多个机器人，YAML 中加一段配置即可 |\n| **流式回复** | 300ms 节流推送，实时展示 AI 回复和思考过程 |\n| **多模态** | 文本 / 图片 / 语音 / 文件 / 图文混排 |\n| **会话管理** | 2h 自动过期，发送 `reset` 或 `new` 手动重置 |\n| **自定义命令** | 模块化扩展，动态加载 |\n| **用户白名单** | 按机器人维度的访问控制 |\n\n---\n\n## 配置说明\n\n配置文件：`config/bots.yaml`\n\n```yaml\nbots:\n  my_bot:\n    # === 必填 ===\n    bot_id: \"YOUR_BOT_ID\"\n    secret: \"YOUR_BOT_SECRET\"\n    relay_url: \"http://localhost:50009\"    # Docker 中改为 http://host.docker.internal:50009\n\n    # === 可选 ===\n    name: \"My Bot\"                         # 机器人名称（群聊中过滤 @提及）\n    description: \"My AI assistant\"\n    working_dir: \"/path/to/project\"        # Claude 工作目录\n    model: \"claude-sonnet-4-6\"             # 模型名称\n    system_prompt: \"You are a helpful assistant.\"\n\n    allowed_users:                          # 用户白名单（不设 = 不限制）\n      - \"user_id_1\"\n\n    env_vars:                               # 注入 Claude 子进程的环境变量\n      MY_API_KEY: \"xxx\"\n\n    custom_commands:                        # 自定义命令模块\n      - \"src.handlers.custom.demo_commands\"\n```\n\n添加多个机器人只需在 `bots:` 下增加新的配置块，重启生效。\n\n---\n\n## 自定义命令\n\n在 `src/handlers/custom/` 下创建 Python 文件：\n\n```python\nfrom src.handlers.command_handlers import CommandHandler\n\nclass PingCommandHandler(CommandHandler):\n    command = \"ping\"\n    description = \"Check if the bot is alive\"\n\n    def handle(self, cmd, stream_id, user_id):\n        return \"Pong!\", None\n\ndef register_commands(command_router):\n    command_router.register(PingCommandHandler())\n```\n\n在 `config/bots.yaml` 中添加模块路径后重启即可。参考示例：[`src/handlers/custom/demo_commands.py`](src/handlers/custom/demo_commands.py)\n\n---\n\n## 环境变量\n\n| 变量名 | 说明 | 默认值 |\n|--------|------|--------|\n| `BOT_CONFIG_PATH` | 配置文件路径 | `config/bots.yaml` |\n| `CHAT_LOG_DIR` | 聊天日志目录 | `logs` |\n| `WEIXIN_AGENT_TIMEOUT_SECONDS` | 任务超时（秒） | `30` |\n| `WEIXIN_MAX_FILE_SIZE` | 文件大小限制（字节） | `20971520` (20MB) |\n\n---\n\n## 架构\n\n```\n┌──────────┐    WSS     ┌─────────────────────────┐   SSE    ┌───────────────┐\n│ 企业微信  │ \u003c───────\u003e │  ClawRelay WeCom Server  │ ──────\u003e │ clawrelay-api │\n│          │  长连接     │  (Python asyncio)        │ \u003c────── │ (Go :50009)   │\n└──────────┘             └─────────────────────────┘  流式响应 └───────┬───────┘\n                                                                       │\n                                                                       v\n                                                              ┌───────────────┐\n                                                              │  Claude Code  │\n                                                              └───────────────┘\n```\n\n- **WebSocket 长连接**：通过 `wss://openws.work.weixin.qq.com` 连接企业微信，30s 心跳保活，断线自动重连\n- **会话管理**：每个用户-机器人对独立会话，内存存储，2h 过期\n- **多机器人隔离**：每个机器人独立的 WebSocket 连接、命令路由器和会话管理\n\n\u003cdetails\u003e\n\u003csummary\u003e项目结构\u003c/summary\u003e\n\n```\nclawrelay-wecom-server/\n├── main.py                              # 入口（asyncio，per-bot WebSocket）\n├── config/\n│   ├── bots.yaml.example               # 机器人配置模板（复制为 bots.yaml 使用）\n│   └── bot_config.py                   # 配置加载 \u0026 首次向导\n├── src/\n│   ├── adapters/\n│   │   └── claude_relay_adapter.py     # clawrelay-api SSE 客户端\n│   ├── transport/\n│   │   ├── ws_client.py                # WebSocket 连接、心跳、重连\n│   │   └── message_dispatcher.py       # 消息路由、节流推送\n│   ├── core/\n│   │   ├── claude_relay_orchestrator.py # AI 调用编排\n│   │   ├── session_manager.py          # 会话管理（内存，2h 过期）\n│   │   ├── chat_logger.py             # 聊天日志（JSONL）\n│   │   └── task_registry.py           # 异步任务注册表\n│   ├── handlers/\n│   │   ├── command_handlers.py         # 内置命令（help, reset 等）\n│   │   └── custom/\n│   │       └── demo_commands.py        # 自定义命令示例\n│   └── utils/\n│       ├── weixin_utils.py             # 消息构建 \u0026 文件解密\n│       ├── text_utils.py               # 文本处理\n│       └── logging_config.py           # 日志配置\n├── logs/                                # 聊天日志（chat.jsonl）\n├── Dockerfile\n├── docker-compose.yml\n└── requirements.txt\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e消息处理流程\u003c/summary\u003e\n\n```\n用户发送消息\n    │\n    v\n企业微信 WebSocket 推送\n    │\n    v\n消息路由 ─── text ────\u003e 命令检查 ─── 匹配 ──\u003e 执行命令（reset, help, 自定义...）\n    │                        │\n    │                     不匹配\n    │                        v\n    │              ClaudeRelayOrchestrator\n    │                        │\n    │                        ├── 获取/创建会话\n    │                        ├── SSE 流式调用 clawrelay-api\n    │                        ├── 300ms 节流推送回复\n    │                        └── 记录聊天日志\n    │\n    ├── voice ──\u003e 语音转文字 → 同 text\n    ├── image ──\u003e 解密图片 → 多模态分析\n    ├── file  ──\u003e 解密文件 → 内容分析\n    ├── mixed ──\u003e 图文分离 → 多模态分析\n    └── event ──\u003e 欢迎语 / 卡片事件\n```\n\n\u003c/details\u003e\n\n---\n\n## 相关项目\n\n| 项目 | 说明 |\n|------|------|\n| [clawrelay-api](https://github.com/roodkcab/clawrelay-api) | Go 编写的 Claude Code 中转 API（本项目的后端依赖） |\n\n---\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwxkingstar%2Fclawrelay-wecom-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwxkingstar%2Fclawrelay-wecom-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwxkingstar%2Fclawrelay-wecom-server/lists"}