一、什么是微信二次开发
微信二次开发,就是在个人微信账号的基础上,通过技术手段扩展微信的自动化能力——比如自动回复、批量加好友、群管理、对接AI客服等。
但微信官方没有提供个人号的开放API,所以所有二次开发方案,本质上都是绕过官方限制。这就带来第一个核心问题:用什么协议/技术去做?
二、协议选型:四种主流方案对比
市面上能实现微信二次开发的技术路线,无外乎以下四种:
| iPad协议 | 模拟iPad客户端登录,直接与微信服务器通信 | 稳定、功能全(支持朋友圈、视频号) | 逆向门槛高、需要持续维护 | 低 |
| Hook注入 | 注入微信客户端进程,Hook函数拦截消息 | 技术成熟、响应快 | 客户端更新后失效、兼容性差 | 高 |
| 模拟机(安卓多开) | 用模拟器+微信多开,配合Xposed等框架 | 开发简单 | 性能差、容易被检测 | 高 |
| Web协议 | 模拟微信网页版登录 | 实现简单 | 功能极有限(不支持朋友圈、视频号) | 中 |
选型结论:如果对稳定性和功能覆盖有要求,iPad协议是目前最优解——它不是破解,而是模拟合法设备登录,不修改微信客户端本身,封号风险最低。
三、接入方式:自研协议 vs 使用第三方API
确定了协议路线,第二个问题是:自己逆协议还是用现成的API服务?
自研协议
优点:完全可控、无第三方依赖;缺点:协议逆向门槛极高——微信的私有协议(尤其是iPad协议)没有公开文档,需要抓包、逆向、持续跟进更新,一个小版本迭代可能就让你的代码全废。
另外,自研方案需要自己解决:登录设备管理、regionId地区配置、代理IP池维护、滑块验证处理、掉线重连逻辑、频率控制……这些都是坑,踩一个就是封号。
第三方API服务
比如WTAPI这类基于iPad协议封装的HTTP API服务,优势很直接:
- 标准REST接口:不用碰私有协议,会调HTTP就能接
- 多语言SDK:Java/Python/Go/C++/PHP都有现成的
- 功能覆盖全:登录、消息、好友、群、朋友圈、视频号都有
- 稳定性维护:协议更新有人帮你跟进,不用自己逆向
接入门槛从"协议逆向"降到"HTTP调用",开发时间从几周缩到几小时。
四、API接入全流程(以WTAPI为例)
所有接口以文档为准(weiti.apifox.cn),以下是核心步骤:
步骤1:扫码登录
首次登录时 appId 传空,服务端会分配一个;regionId 填账号常用的省份代码(比如440000是广东):
curl -X POST https://wx.chuapi.com/finder/v2/api/login/getLoginQrCode \\
-H "Content-Type: application/json" \\
-H "X-finder-TOKEN: 你的Token" \\
-d '{"appId": "", "regionId": "440000"}'
返回值:
{
"ret": 200,
"msg": "操作成功",
"data": {
"appId": "wxid_app123", // 必须保存,后续所有请求都要用
"uuid": "abc123",
"qrImgUrl": "二维码图片地址"
}
}
关键:appId 持久化保存,掉线重登必须传同一个,否则会被识别为新设备。
步骤2:轮询确认登录
curl -X POST https://wx.chuapi.com/finder/v2/api/login/checkLogin \\
-H "Content-Type: application/json" \\
-H "X-finder-TOKEN: 你的Token" \\
-d '{"appId": "wxid_app123", "uuid": "abc123", "autoSliding": true}'
status=2 时登录成功:
| 0 | 等待扫码 |
| 1 | 已扫码,待确认 |
| 2 | 登录成功 |
| 3 | 二维码过期,重新获取 |
建议每2秒轮询一次,登录成功后停止。
步骤3:发送消息
curl -X POST https://wx.chuapi.com/finder/v2/api/message/postText \\
-H "Content-Type: application/json" \\
-H "X-finder-TOKEN: 你的Token" \\
-d '{
"appId": "wxid_app123",
"toWxid": "对方wxid或群chatRoomId",
"content": "你好,这是一条测试消息"
}'
ret=200 表示发送成功。
步骤4:接收消息(Webhook回调)
在平台后台配置你的公网回调地址,收到消息时平台会POST过来,格式:
{
"appId": "wxid_app123",
"msgType": 1,
"fromUser": "wxid_xxx",
"nickName": "张三",
"content": "你好",
"createTime": 1697000000,
"chatRoomId": "" // 空=私聊,有值=群消息
}
回调必须5秒内返回 {"ret": 200},否则平台会重推。
五、Python版最小可用机器人
把上面四步串起来:
from flask import Flask, request, jsonify
import requests, threading, queue, time, random
app = Flask(__name__)
msg_queue = queue.Queue()
BASE_URL = "https://wx.chuapi.com"
TOKEN = "你的X-finder-TOKEN"
APP_ID = "你的appId"
# 发送消息
def send_text(to_wxid, content):
return requests.post(
f"{BASE_URL}/finder/v2/api/message/postText",
headers={"Content-Type": "application/json", "X-finder-TOKEN": TOKEN},
json={"appId": APP_ID, "toWxid": to_wxid, "content": content},
timeout=10
).json().get("ret") == 200
# 回调接收
@app.route("/callback", methods=["POST"])
def callback():
msg = request.get_json()
if msg and msg.get("msgType") == 1:
msg_queue.put(msg)
return jsonify({"ret": 200})
# 消费者:串行发送 + 限频
def consumer():
while True:
msg = msg_queue.get()
try:
to_wxid = msg.get("chatRoomId") or msg["fromUser"]
reply = f"已收到:{msg['content']}"
send_text(to_wxid, reply)
finally:
# 随机间隔 1~5 秒,控制频率
time.sleep(random.uniform(1, 5))
threading.Thread(target=consumer, daemon=True).start()
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
六、避坑清单
| 新号首夜掉线 | 以为登录失败 | 正常现象,重新走扫码流程 |
| 换appId重登 | 被识别为新设备 | appId持久化,重登传同一个 |
| 发消息太快 | 触发风控/封号 | 1分钟≤40条,消费者串行+随机间隔 |
| regionId填异地 | 异地登录风险 | 选账号常用地区的省份代码 |
| 回调没返回{“ret”:200} | 消息重推/丢失 | 任何分支都保证返回这个格式 |
| 群消息不回复 | 群体验差 | 判断chatRoomId有值时,只响应@机器人的消息 |
七、小结
微信二次开发的核心路径:协议选型(iPad协议最优)→ 接入方式(第三方API服务最快)→ 扫码登录 → 回调收消息 → postText发消息。自研协议门槛极高(需要逆向+持续维护),用WTAPI这类iPad协议封装的HTTP API服务,把"协议逆向"的复杂问题变成了"HTTP调用"的标准问题,开发者半天内就能跑通自动回复机器人。接口细节以官方文档为准,开发前建议先通读一遍接口列表。
参考资料
- 接口定义与参数说明文档:weiti.apifox.cn





