基于 Claude Code 的本地 AI 机器人,通过微信公众号 API 对接私人测试号。
特点:
- ✅ 零门槛部署:无需 ICP 备案,个人开发者可用
- ✅ 支持智谱 AI:可配置 GLM-4 模型(通过智谱 API)
- ✅ 开箱即用:Docker Compose 一键启动
- ✅ 长连接复用:高效的消息处理和会话管理
访问 微信公众平台测试号:
- 扫码登录
- 获取
appID和appsecret - 记录下
appID(后续配置使用)
创建 .env 文件:
cp .env.example .env编辑 .env 填写微信配置:
# 微信公众号配置 WECHAT_TOKEN=your_custom_token_here # 自定义 Token(微信服务器验证用) WECHAT_APPID=your_wechat_appid_here # 从测试号页面获取 WECHAT_APPSECRET=your_wechat_appsecret_here # 从测试号页面获取 # 服务配置 PORT=15878 NODE_ENV=production DEBUG=0# 克隆仓库 git clone https://github.com/ferocknew/wechat_node_ai_bot.git cd wechat_node_ai_bot # 创建 home 目录(挂载到容器) mkdir -p home/.claude # 配置 Claude API(支持 Anthropic 官方或智谱 AI) cat > home/.claude/settings.json << 'EOF' { "hasCompletedOnboarding": true, "env": { "ANTHROPIC_AUTH_TOKEN": "your_api_key_here", "ANTHROPIC_BASE_URL": "https://api.anthropic.com", "API_TIMEOUT_MS": "3000000", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1, "ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-3-5-haiku-20241022", "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-3-5-sonnet-20241022", "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-3-5-opus-20241022" } } EOF💡 使用智谱 AI(推荐国内用户):
修改 home/.claude/settings.json:
{ "hasCompletedOnboarding": true, "env": { "ANTHROPIC_AUTH_TOKEN": "your_zhipu_api_key", "ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic", "API_TIMEOUT_MS": "3000000", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1, "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-4.5-air", "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-4.7", "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-4.7" } }📖 获取智谱 API Key:https://bigmodel.cn/activity/trial-card/NYR9RXFCDK
# 构建并启动容器 docker compose up --build -d # 查看日志 docker compose logs -f ccbot # 检查服务状态 curl http://localhost:15878/使用 Nginx/Caddy 等反向代理,将 https://your-domain.com 转发到 http://localhost:15878
在微信测试号页面配置服务器 URL:
| 配置项 | 值 |
|---|---|
| URL | https://your-domain.com/api/wechat |
| Token | 与 .env 中的 WECHAT_TOKEN 一致 |
| 消息加解密 | 明文模式 |
点击"提交"验证,成功后即可开始聊天!
- 扫描测试号页面的二维码关注公众号
- 发送消息即可与 Claude 对话
- 支持多轮对话,上下文自动保持
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │ 微信公众号 │────▶│ ccbot HTTP │────▶│ Claude Code CLI │ │ (测试号) │ │ Server │ │ (stream-json) │ └─────────────┘ └──────────────┘ └─────────────────┘ │ ▼ ┌─────────────┐ │ 会话状态管理 │ │ (内存) │ └─────────────┘ - Node.js >= 24.0.0
- pnpm >= 10.0.0
- Claude CLI 已安装并登录(
claude命令可用) - 微信测试号(申请地址)
# 安装 pnpm(如果未安装) npm install -g pnpm # 使用 nvm 切换到 Node.js 24 nvm install 24 && nvm use 24 # 安装依赖 pnpm install本项目使用 Claude Code 历史版本(@anthropic-ai/claude-code@2.0.37),原因如下:
- 历史版本优势:可以通过配置
~/.claude/settings.json直接使用 API Key,无需登录 - 升级路径:使用历史版本安装后,可通过
claude update更新到最新版本 - Docker 部署:容器内预装历史版本,避免交互式登录流程
本地开发安装:
# 安装 Claude CLI(推荐历史版本) pnpm add -g @anthropic-ai/claude-code@2.0.37 # 配置 API Key(可选,推荐使用 settings.json) cat > ~/.claude/settings.json << EOF { "apiKey": "sk-ant-api03-...", "baseUrl": "https://api.anthropic.com" } EOF # 或登录 Anthropic 账户 claude auth login访问 微信公众平台测试号 获取:
appIDappsecret- 服务器配置中的
Token
微信测试号优势:
- ✅ 支持任意域名:无需 ICP 备案,个人开发者可用
- ✅ 支持自定义端口:可使用非标准端口(如 15878)
- ✅ HTTPS 灵活:可使用内网穿透 + 自签名证书
- ✅ 即时生效:配置服务器 URL 后立即生效
对比企业号限制:
- ❌ 企业微信/公众号需要企业认证
- ❌ 需要域名 ICP 备案
- ❌ 必须使用 80/443 标准端口
- ❌ 审核周期长(1-7 个工作日)
微信测试号限制:
- 消息推送限制:每天 50 万条
- 不支持 Markdown 格式,仅支持纯文本
复制 .env.example 到 .env 并填写配置:
cp .env.example .env编辑 .env:
# 微信公众号配置 WECHAT_TOKEN=your_custom_token WECHAT_APPID=your_appid WECHAT_APPSECRET=your_appsecret # 服务配置 PORT=15878 NODE_ENV=development # 调试模式 DEBUG=1在微信测试号后台配置服务器:
| 字段 | 值 |
|---|---|
| URL | http://your-domain.com/api/wechat |
| Token | 与 WECHAT_TOKEN 一致 |
| 消息加解密 | 明文模式 |
注意:本地开发可使用内网穿透工具(如 ngrok、frp)暴露本地端口
# 开发模式(自动重启) pnpm dev # 生产模式 pnpm start # 类型检查 pnpm typecheck启动成功后访问:
- API 文档:http://localhost:15878/docs
- 健康检查:http://localhost:15878/
- 扫描测试号二维码关注
- 发送消息即可与 Claude 对话
- 支持多轮对话,上下文自动保持
# 发送消息给 Claude curl -X POST http://localhost:15878/api/claude/chat \ -H "Content-Type: application/json" \ -d '{ "message": "你好,请介绍一下自己", "model": "claude-sonnet-4-20250514" }' # 获取会话列表 curl http://localhost:15878/api/claude/sessions # 继续上一次对话 curl -X POST http://localhost:15878/api/claude/chat \ -H "Content-Type: application/json" \ -d '{ "message": "继续", "sessionId": "xxx", "continue": true }'| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / | 服务健康状态 |
| GET | /info | 服务详细信息 |
| GET | /docs | OpenAPI 交互文档 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/wechat | 服务器验证(微信调用) |
| POST | /api/wechat | 接收消息推送(微信调用) |
| POST | /api/wechat/custom | 发送客服消息 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/claude/chat | 发送消息给 Claude |
| GET | /api/claude/sessions | 获取会话列表 |
| GET | /api/claude/sessions/:id | 获取会话详情 |
| DELETE | /api/claude/sessions/:id | 删除会话 |
src/ ├── server.ts # HTTP 服务器入口 ├── routes/ │ ├── health.ts # 健康检查路由 │ ├── wechat.ts # 微信公众号路由 │ └── claude.ts # Claude 集成路由 ├── utils/ │ └── xml.ts # XML 解析工具 ├── sdk/ # Claude Code SDK(复用 Happy CLI) │ ├── query.ts # 核心:spawn + stream-json │ ├── types.ts # SDK 类型定义 │ ├── stream.ts # 异步流实现 │ ├── utils.ts # 工具函数 │ └── prompts.ts # 系统提示词 ├── scanner/ # Claude 会话文件监听 │ └── sessionScanner.ts # 会话扫描器 └── types/ # 类型定义 └── claude_types.ts # Claude 消息类型 lib/ # 通用工具库 ├── utils/ │ ├── logger.ts # 日志系统 │ ├── path.ts # Claude 项目路径 │ ├── time.ts # 延迟、退避 │ └── runtime.ts # 运行时检测 ├── sync/ │ └── sync.ts # 防抖同步 └── watcher/ └── startFileWatcher.ts # 文件监听 本项目提供 Docker 部署方案,主要优势:
- 进程隔离:Claude CLI 运行在独立容器内,避免影响宿主系统
- 文件系统隔离:容器内
/home/ccbot目录独立,防止敏感文件泄露 - 网络隔离:可通过 Docker 网络策略限制出站流量
- 资源限制:可通过 Docker 限制 CPU、内存使用
# 1. 构建镜像 docker build -t ccbot:latest . # 2. 启动容器(使用 Docker Compose 推荐) docker-compose up -d # 或手动运行 docker run -d \ --name ccbot \ -p 15878:15878 \ -v $(pwd)/home:/home/ccbot \ -e WECHAT_TOKEN=your_token \ -e WECHAT_APPID=your_appid \ -e WECHAT_APPSECRET=your_secret \ ccbot:latest容器启动时支持以下环境变量:
| 变量名 | 说明 | 默认值 |
|---|---|---|
WECHAT_TOKEN | 微信服务器验证 Token | 必填 |
WECHAT_APPID | 微信测试号 AppID | 必填 |
WECHAT_APPSECRET | 微信测试号 AppSecret | 必填 |
PORT | HTTP 服务端口 | 15878 |
NODE_ENV | 运行环境 | production |
DEBUG | 调试模式 | 0 |
- Claude 配置:映射
./home:/home/ccbot保存 Claude CLI 配置和会话 - 日志文件:容器内
~/.ccbot/logs/,可通过docker logs ccbot查看
容器内置健康检查,每 30 秒检查一次服务状态:
# 查看健康状态 docker ps --filter name=ccbot # 查看健康检查日志 docker inspect ccbot --format='{{json .State.Health}}' | jqClaude Code 通过 MCP (Model Context Protocol) 扩展能力,容器内默认支持:
npx 类型 MCP(推荐):
- ✅ 开箱即用,无需额外配置
- 示例:
@modelcontextprotocol/server-filesystem、@modelcontextprotocol/server-github
uvx 类型 MCP(Python):
⚠️ 需要额外安装 Python 和 uv- 修改
Dockerfile添加:# 安装 Python 和 uv RUN apt-get update && apt-get install -y \ python3 \ python3-pip \ && curl -LsSf https://astral.sh/uv/install.sh | sh
配置 MCP 服务器:
在容器内的 ~/.claude/settings.json 或 ~/.claude/mcp.json 中配置:
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"] } } }如需持久化 MCP 配置,挂载配置目录:
docker run -v $(pwd)/home:/home/ccbot ccbot:latest为什么选择 Node.js 技术栈?
- Claude Code 依赖:Claude CLI 本质上是 Node.js 应用,必须在 Node.js 环境中运行
- MCP 服务器支持:
- ✅ npx 类型:原生支持,可直接调用 Node.js MCP 服务器
⚠️ uvx 类型:需要在 Dockerfile 中额外安装 Python 和 uv 运行时
- 生态丰富:npm 生态系统庞大,MCP 服务器多使用 Node.js 编写
- 统一技术栈:避免跨语言通信的复杂性
MCP (Model Context Protocol) 支持情况:
| MCP 类型 | 支持情况 | 说明 |
|---|---|---|
npx | ✅ 原生支持 | 直接在容器内运行,无需额外配置 |
uvx (Python) | 需在 Dockerfile 安装 Python + uv | |
docker | ✅ 支持 | 通过 Docker socket 挂载支持 |
stdio | ✅ 支持 | 通过 stdin/stdout 通信 |
如需使用 Python MCP 服务器,需修改 Dockerfile:
# 安装 Python 和 uv RUN apt-get update && apt-get install -y \ python3 \ python3-pip \ && curl -LsSf https://astral.sh/uv/install.sh | sh| 类别 | 技术 |
|---|---|
| 语言 | TypeScript 5.x |
| 运行时 | Node.js 24 |
| 包管理 | pnpm |
| 执行器 | tsx |
| HTTP 框架 | Fastify |
| API 文档 | @fastify/swagger |
- 语言:TypeScript(严格模式关闭,允许渐进式迁移)
- 模块系统:ES Modules (
"type": "module") - 导入别名:使用
@/前缀(通过 tsconfig.json paths 配置) - 文件扩展名:所有源文件使用
.ts扩展名 - 类型定义:内联类型注解,优先使用
interface和type
// SDK 模块 import { query } from '@sdk/index.ts' // 工具模块 import { logger } from '@lib/utils/logger.ts' // 路由模块 import { wechatRoutes } from '@routes/wechat.ts'# 开启调试日志 DEBUG=1 pnpm dev # 日志文件位置 ~/.ccbot/logs/<timestamp>-pid-<pid>.log本项目复用了 Happy CLI 的 Claude Code 集成部分:
demo/cli/src/claude/sdk/→src/sdk/demo/cli/src/claude/utils/sessionScanner.ts→src/scanner/
ISC