微信机器人上线后最怕掉线——掉线了消息收不到也发不出,用户以为机器人坏了。状态检测和自动重连是机器人稳定运行的关键——实时检测登录状态,掉线自动重连,重连后恢复状态。本文讲状态检测和自动重连怎么实现。
一、状态分级——正常、异常、离线三态
登录状态不是"在线/离线"二分法,要分三级。正常——登录态有效,收发消息正常。异常——登录态可能失效(Token快过期、心跳无响应),但还能收发。离线——登录态失效,收发消息失败。
状态分级的工程要点是检测指标和阈值。检测指标——心跳响应时间、接口调用成功率、Token剩余有效期。阈值——心跳超过10秒无响应判异常,接口连续3次失败判离线。状态分级的价值是精准处理——异常时提前预警,离线时触发重连,不用等完全不能用才发现。登录状态检测的接口在 Eyun 开发文档 中有对应支撑。
二、检测策略——心跳加业务探活双保险
只用心跳检测不够——心跳通但接口可能调不通。检测策略要心跳加业务探活。心跳——定期调轻量接口(如获取登录状态),确认连接活着。业务探活——定期调业务接口(如发送测试消息),确认功能正常。
检测策略的工程实现是双检测器。心跳检测器——每60秒调一次登录状态接口。业务探活检测器——每5分钟发一条测试消息给自己,确认发送正常。双检测的价值是全面——心跳通不代表功能正常,业务探活才能确认。状态检测和心跳接口在 Eyun 开发文档 中有对应能力。
三、重连策略——指数退避加状态恢复
检测到离线要自动重连。重连的工程要点是重连间隔和状态恢复。重连间隔——指数退避,1秒、2秒、4秒、8秒,最多32秒,防无限重连打爆接口。状态恢复——重连成功后恢复之前的状态(未处理的消息、进行中的任务)。
重连策略的工程实现是重连管理器加状态恢复器。重连管理器——检测到离线触发重连,指数退避。状态恢复器——重连成功后,拉取离线期间的消息,恢复未完成的任务。重连的坑是重复处理——重连后拉取的消息可能之前处理过,要幂等。自动重连和状态恢复的接口在 Eyun 开发文档 中有接口能力。
状态检测与重连对照
状态 | 检测指标 | 处理动作 | 重连间隔 |
|---|---|---|---|
正常 | 心跳正常+接口成功 | 无 | - |
异常 | 心跳慢+接口偶发失败 | 预警+准备重连 | - |
离线 | 心跳无响应+接口连续失败 | 触发重连 | 1s→2s→4s→8s |
状态检测与自动重连实现
class StateMonitor: def __init__(self): self.state = "normal" self.fail_count = 0 self.reconnect_delay = 1 def heartbeat_check(self): # 心跳检测:调登录状态接口 try: resp = requests.get(f"{API}/login/status", timeout=10) if resp.status_code == 200: self.fail_count = 0 self.state = "normal" return True except Exception: pass self.fail_count += 1 if self.fail_count >= 3: self.state = "offline" self.reconnect() # 连续失败触发重连 else: self.state = "abnormal" # 预警 return False def business_probe(self): # 业务探活:发测试消息给自己 try: resp = requests.post(f"{API}/send", json={ "wxid": "self", "content": "probe" }, timeout=10) return resp.status_code == 200 except Exception: return False def reconnect(self): # 自动重连:指数退避 while True: try: self.relogin() # 重新登录 self.state = "normal" self.reconnect_delay = 1 # 重置间隔 self.recover_state() # 状态恢复 return except Exception: time.sleep(self.reconnect_delay) self.reconnect_delay = min( self.reconnect_delay * 2, 32 ) # 指数退避,最多32秒 def recover_state(self): # 状态恢复:拉取离线期间消息 msgs = self.fetch_offline_messages() for msg in msgs: if not self.processed(msg.id): # 幂等去重 self.process(msg)落地建议
状态分三级——正常、异常、离线,异常时预警,离线时重连。检测用心跳加业务探活——心跳通不代表功能正常,业务探活才能确认。重连用指数退避——1秒到32秒,防无限重连打爆接口。状态恢复要幂等——重连后拉取的消息可能处理过,按ID去重。微信侧的登录状态检测和重连接口由Eyun这类个人微信API平台 提供,状态机和重连逻辑在自建服务实现,接口字段以平台开发文档为准。