前言
越来越多的开发者希望把 Claude、GPT 等大模型能力嵌入微信生态——让机器人自动回复、智能总结群消息、处理客服问题。然而个人微信并未开放官方 Bot API,直接调 Web 端极易封号。本文以 WechatApi 的 iPad 协议接入方案为底层,从零搭建一套"微信消息收发 + Claude AI 推理"全链路实战,帮你绕开封号风险、快速跑通最小可用原型。
一、为什么选 iPad 协议而非 Web Hook
个人微信的接入方案大致分三类:网页版抓包、桌面客户端注入、iPad/iOS 协议模拟。前两者随官方版本迭代频繁失效,且行为特征明显,封号率高。基于 iPad 协议的个人微信 API 模拟的是移动端设备登录行为,心跳、登录态、消息收发全部贴近真实客户端,被检测的概率远低于前两者。
WechatApi 的核心思路是:在云端维护一个 iPad 设备会话(通过 appId 标识),开发者只需对接 HTTP 接口,无需关心底层 IM 协议细节。这对接入 Claude 这样的第三方 AI 服务来说尤为重要——你只需要写"收到消息→调 Claude→把回复发回微信"这三步逻辑,其余脏活都由 API 层处理。
二、整体架构与数据流
微信用户发消息
│
▼
WechatApi 云端 iPad 会话
│ Webhook 推送 / 轮询
▼
你的业务服务器(Python / Node / Java …)
│ 组装 Prompt
▼
Anthropic Claude API
│ 返回 AI 回复文本
▼
你的业务服务器
│ 调 WechatApi 发消息接口
▼
微信用户收到回复
整个链路没有任何"外挂注入",全部走标准 HTTP,部署在普通 VPS 即可。日常运维只需关注两个维度:
| 维度 | WechatApi 侧 | Claude API 侧 |
|---|---|---|
| 鉴权方式 | 请求头 VideosApi-token + 请求体 appId | 请求头 x-api-key |
| 限流单位 | 按设备 appId 并发 | 按账户 RPM / TPM |
| 超时建议 | 10 s | 30 s(流式可更长) |
| 错误重试 | ret≠200 时退避重试 | status_code 429/529 指数退避 |
| 日志关键字段 | ret, msg, data.msgId | usage.input_tokens, stop_reason |
三、环境准备与 WechatApi 初始化
3.1 注册并获取 Token
前往 WechatApi 控制台 注册账号,创建设备后会得到两个关键凭证:
- VideosApi-token:账户级鉴权 Token,放在所有请求的 Header 里
- appId:设备 ID,标识具体哪个微信账号的 iPad 会话,放在请求 Body 里
这两个值请妥善保存,不要硬编码到代码里,建议写入环境变量或 .env 文件。
3.2 依赖安装
bash# 创建虚拟环境
python3 -m venv venv && source venv/bin/activate
# 安装依赖
pip install anthropic httpx python-dotenv fastapi uvicorn
anthropic:官方 Python SDK,调用 Claude 模型httpx:异步 HTTP 客户端,用于调 WechatApifastapi + uvicorn:接收 WechatApi 的 Webhook 推送
3.3 环境变量配置
bash# .env 文件(不要提交到 Git)
WECHAT_API_TOKEN=your_videos_api_token_here
WECHAT_APP_ID=your_app_id_here
ANTHROPIC_API_KEY=your_claude_api_key_here
四、接收微信消息(Webhook 模式)
WechatApi 支持两种消息获取方式:轮询拉取和 Webhook 主动推送。生产环境强烈推荐 Webhook,延迟低且不占用轮询配额。
在控制台将回调地址设置为你服务器的公网地址,例如 https://your-server.com/wechat/hook,WechatApi 会在收到新消息时向该地址 POST 一段 JSON:
json{
"appId": "your_app_id",
"msgType": 1,
"fromUser": "wxid_xxxxxxxx",
"toUser": "wxid_yyyyyyyy",
"content": "你好,帮我查一下今天的天气",
"createTime": 1718000000,
"msgId": "msg_abc123def456"
}
字段说明:
msgType:消息类型,1=文本,3=图片,43=视频,49=链接/小程序等fromUser:发送方的微信 ID(wxid)content:消息正文,文本消息直接用,图片/视频需要进一步下载msgId:消息唯一 ID,可用于去重和回执追踪
下面是一个最简 FastAPI Webhook 接收端:
pythonimport os
from fastapi import FastAPI, Request
from dotenv import load_dotenv
from handler import process_message # 见下一节
load_dotenv()
app = FastAPI()
@app.post("/wechat/hook")
async def wechat_hook(request: Request):
payload = await request.json()
msg_type = payload.get("msgType")
# 只处理文本消息,其他类型忽略
if msg_type == 1:
await process_message(payload)
return {"status": "ok"}
启动命令:
bashuvicorn main:app --host 0.0.0.0 --port 8000
如果你的服务器没有公网域名,可以先用 ngrok http 8000 临时暴露进行调试。
五、调用 Claude 生成回复
这一步是整个链路的核心。你需要把微信消息的 content 作为用户输入,传给 Claude,再拿到回复文本。
Claude 的上下文窗口很大(claude-3-5-sonnet 支持 200k tokens),可以在每次调用时把最近 N 轮对话历史一起传入,实现多轮对话记忆。下面的代码用一个简单的 dict 缓存对话历史,生产环境建议换成 Redis 并设置过期时间。
pythonimport anthropic
import os
claude_client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
# 内存对话历史,key=fromUser,value=消息列表
conversation_history: dict[str, list] = {}
SYSTEM_PROMPT = """你是一个微信智能助手,回答简洁友好,适合在手机上阅读。
遇到不确定的问题请如实说不知道,不要编造内容。"""
async def call_claude(from_user: str, user_text: str) -> str:
"""调用 Claude,维护多轮对话历史"""
history = conversation_history.setdefault(from_user, [])
history.append({"role": "user", "content": user_text})
# 只保留最近 10 轮,防止 token 超限
if len(history) > 20:
history = history[-20:]
conversation_history[from_user] = history
response = claude_client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=history,
)
assistant_text = response.content[0].text
history.append({"role": "assistant", "content": assistant_text})
return assistant_text
几个实践建议:
- System Prompt 定调:告诉 Claude 它是微信助手,输出要适合手机阅读(短段落、少用 Markdown 特殊符号),否则
粗体这类标记会原样显示在微信里,影响体验。 - 超时控制:Claude 默认非流式请求可能需要 10-20 秒,务必设置合理的超时并给用户发"正在思考中……"的提示消息,缓解等待焦虑。
- 敏感词过滤:在把 Claude 回复发送到微信之前,建议过一遍关键词黑名单,防止 AI 幻觉输出违规内容导致账号被封。
六、通过 WechatApi 发送回复消息
拿到 Claude 的回复文本后,调 WechatApi 的发送接口把消息发回给用户。这里是整个链路里与 WechatApi 交互最频繁的环节,也是 微信机器人开发 的核心调用范式。
pythonimport httpx
import os
WECHAT_BASE_URL = "https://api.wechatapi.net" # 示意,以控制台实际地址为准
WECHAT_TOKEN = os.getenv("WECHAT_API_TOKEN")
WECHAT_APP_ID = os.getenv("WECHAT_APP_ID")
async def send_text_message(to_user: str, content: str) -> dict:
"""发送文本消息"""
headers = {
"Content-Type": "application/json",
"VideosApi-token": WECHAT_TOKEN,
}
body = {
"appId": WECHAT_APP_ID,
"toUser": to_user,
"content": content,
}
async with httpx.AsyncClient(timeout=10) as client:
resp = await client.post(
f"{WECHAT_BASE_URL}/message/send/text",
headers=headers,
json=body,
)
result = resp.json()
# WechatApi 标准返回格式
# {"ret": 200, "msg": "success", "data": {"msgId": "..."}}
if result.get("ret") != 200:
raise RuntimeError(f"发送失败: {result.get('msg')}")
return result["data"]
WechatApi 的返回体遵循统一格式:
json{
"ret": 200,
"msg": "success",
"data": {
"msgId": "msg_sent_xyz789"
}
}
ret 不为 200 时表示接口调用异常,常见错误码:
| ret 码 | 含义 | 处理建议 |
|---|---|---|
| 200 | 成功 | 正常 |
| 401 | Token 无效或过期 | 检查 VideosApi-token 配置 |
| 403 | appId 不存在或未登录 | 检查设备登录状态 |
| 429 | 请求频率过高 | 降速,指数退避后重试 |
| 500 | 服务端内部错误 | 重试 1-2 次,若持续报错联系支持 |
七、完整流程串联与进阶玩法
7.1 完整 process_message 函数
pythonasync def process_message(payload: dict):
from_user = payload["fromUser"]
content = payload["content"]
# 1. 先给用户发"思考中"提示,降低等待焦虑
await send_text_message(from_user, "💭 正在思考,请稍候……")
try:
# 2. 调 Claude 生成回复
reply = await call_claude(from_user, content)
# 3. 发送 AI 回复
await send_text_message(from_user, reply)
except Exception as e:
await send_text_message(from_user, f"抱歉,处理失败:{str(e)[:50]}")
7.2 群消息处理
群消息的 fromUser 格式为 groupid@chatroom,content 前缀会带有 @昵称\n。处理群消息时需要先判断是否被 @,再去掉 @ 前缀再传给 Claude:
pythondef extract_group_mention(content: str, bot_name: str) -> str | None:
"""如果消息中 @ 了机器人,返回去掉 @ 后的纯文本,否则返回 None"""
mention_prefix = f"@{bot_name}"
if mention_prefix in content:
return content.replace(mention_prefix, "").strip()
return None
群机器人在 微信群管理机器人 场景下应用极广,比如自动记录群内通知、AI 问答、关键词触发等。结合 Claude 的长上下文能力,还可以实现群聊摘要——每隔一段时间把最近 N 条群消息打包成 Prompt,让 Claude 总结今日要点,自动发到群里。
7.3 企业/SCRM 场景
如果你的业务需要管理多个微信账号、自动添加好友、标签分组、定时群发,建议在基础机器人之上接入 微信 SCRM 能力。SCRM 层可以统一管理多个 appId,避免在代码里硬编码设备 ID,同时提供操作日志和风控预警,大幅降低运营风险。
八、注意事项与风控建议
接入个人微信 API 做自动化,有几条红线必须知晓:
- 消息频率控制:微信对单账号发消息频率有隐性限制,建议连续发送之间至少间隔 1-2 秒,群发场景需更保守(每条至少 3-5 秒)。
- 禁止批量加好友:自动加好友是高风险操作,短时间内大量发起好友请求极易触发风控。微信二次开发 的安全边界需严格遵守平台规则。
- 内容合规:AI 生成内容需要过滤,尤其在客服、营销场景下,避免输出违规信息导致账号被封。
- 登录态维护:iPad 会话会周期性掉线,需要监听 WechatApi 的登录状态回调,及时扫码重新登录或触发告警。
- 本地/云端部署:建议将服务部署在固定 IP 的云服务器上,与登录设备的 IP 保持一致,减少异地登录检测风险。
小结
本文完整演示了"WechatApi(iPad 协议)+ Claude 大模型"的接入链路:从 Webhook 接收消息、组装多轮对话 Prompt 调用 Claude、到通过 WechatApi 把 AI 回复发回微信,核心代码不超过 150 行。整套方案的优势在于:底层设备协议稳定、上层 AI 能力可按需替换、横向扩展只需增加 appId 数量。
如果你正在构建智能客服、群助手或私域运营机器人,WechatApi 提供的个人微信 HTTP API 是目前开发体验最顺畅的方案之一,控制台注册即可试用,文档完善、支持响应及时。
