做账号和联系人管理,先要分清管理对象在哪个层级。层级搞错了,接口怎么调都会混乱。按抽象程度分三层管理对象。
一、实例层——管理 wId 这个运行单元
Eyun用 wId 标识一个微信实例,一个 wId 对应一个登录的微信号。多开场景下,程序同时管理多个 wId,每个 wId 的消息、好友、群聊完全隔离。
实例层的管理动作包括:获取实例列表、查询实例在线状态、处理实例上下线。wId 是所有后续接口调用的必填参数,管理好多实例是规模化运营的前提。
二、账号层——管理登录态与身份
每个 wId 背后是一个真实微信号,账号层管的是这个号的登录态:是否在线、Token 是否有效、掉线后怎么处理。
Token 过期(错误码 1002)要重新获取,实例掉线会触发状态事件回调。账号层稳定,上面的业务才能稳定——这一层出问题,所有接口调用都会失败。
三、联系人层——管理好友数据
联系人层是业务最常接触的:好友列表、好友资料、备注标签、群成员。这些数据通过联系人接口和群接口获取,通过事件回调保持增量更新。
联系人数据建议落库存储,本地维护一份。回调推增量,同步接口拉全量,两边对账保证数据一致。
三层管理对照
管理层级 | 管理对象 | 核心动作 | 出问题的影响 |
|---|---|---|---|
实例层 | wId | 多实例、隔离 | 消息串号 |
账号层 | 登录态、Token | 在线监控、重连 | 全部接口失效 |
联系人层 | 好友、群成员 | 同步、更新、落库 | 数据不准 |
多实例管理示例
INSTANCES = ["wId_001", "wId_002", "wId_003"] def broadcast(text): # 给每个实例的所有人群发,互不干扰 for wid in INSTANCES: for friend in get_contacts(wid): sendText(wid, friend["wxid"], text) @app.post("/webhook") def webhook(): d = request.json wid = d["wId"] # 回调里带 wId,区分是哪个实例 route_by_instance(wid, d) return {"code": "1000"}落地建议
三层从下往上依赖:实例层要先理清(有几个 wId、怎么隔离),账号层要盯稳(在线监控、掉线告警),联系人层才能做准(数据同步、落库)。很多项目直接跳到联系人层,结果实例串号、掉线不知,数据再准也没用。