Python微信自动化:从协议解析到消息发送的全流程实现指南

一、技术选型与实现原理

微信自动化消息发送的核心在于模拟用户操作或调用隐藏接口。当前主流方案分为两类:基于Web协议的模拟操作(如itchat库)和基于PC客户端的协议解析(如WeChatBot框架)。前者通过逆向分析微信网页版协议实现,后者需解析PC客户端的加密通信包。

1.1 协议解析技术栈

  • HTTP协议层:微信网页版采用WebSocket+HTTPS双通道通信,消息发送通过/webwxsendmsg接口实现
  • 加密机制:消息体使用AES-CBC加密,密钥通过/jslogin接口获取的BaseRequest对象派生
  • 接口验证:每个请求需携带uinskeypass_ticket等动态参数,需实时从登录态获取

典型请求包结构:

  1. {
  2. "BaseRequest": {
  3. "Uin": 123456789,
  4. "Sid": "xxx",
  5. "Skey": "xxx",
  6. "DeviceID": "e123456789012345"
  7. },
  8. "Msg": {
  9. "Type": 1,
  10. "Content": "加密后的消息体",
  11. "FromUserName": "@xxx",
  12. "ToUserName": "@yyy",
  13. "LocalID": "1234567890",
  14. "ClientMsgId": "1234567890"
  15. }
  16. }

1.2 实现方案对比

方案类型 优点 缺点 适用场景
itchat库 实现简单,支持文本/图片 依赖网页版,易被封号 临时自动化任务
WeChatBot框架 支持PC客户端协议 需要逆向分析协议 长期稳定运行
企业微信API 官方支持,稳定性高 需企业资质,功能受限 企业级应用

二、基于itchat的快速实现

2.1 环境准备

  1. pip install itchat requests

2.2 核心代码实现

  1. import itchat
  2. # 登录微信(需手机扫码确认)
  3. itchat.auto_login(hotReload=True) # hotReload保持登录态
  4. # 获取好友列表
  5. friends = itchat.get_friends(update=True)
  6. target = [f for f in friends if f['NickName'] == '目标昵称'][0]
  7. # 发送文本消息
  8. itchat.send('Hello from Python!', toUserName=target['UserName'])
  9. # 发送图片消息
  10. @itchat.msg_register(itchat.content.PICTURE)
  11. def download_pic(msg):
  12. msg['Text'](msg['FileName']) # 保存图片
  13. itchat.send('@img@%s' % msg['FileName'], toUserName=target['UserName'])

2.3 风险控制机制

  1. 请求频率限制:设置time.sleep(3)间隔
  2. 异常处理
    1. try:
    2. itchat.send(msg, toUserName=target)
    3. except Exception as e:
    4. if '40001' in str(e): # 登录态失效
    5. itchat.auto_login(hotReload=False)
  3. 消息去重:维护sent_messages集合记录已发送内容

三、进阶方案:PC客户端协议解析

3.1 协议抓包分析

使用Fiddler或Wireshark捕获PC微信通信包,重点分析:

  • 登录流程:/cgi-bin/mmwebwx-bin/webwxnewloginpage
  • 消息同步:/cgi-bin/mmwebwx-bin/webwxsync
  • 消息发送:/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=xxx

3.2 加密算法实现

微信使用双重加密机制:

  1. from Crypto.Cipher import AES
  2. import base64
  3. def encrypt_msg(msg, key):
  4. pad = 16 - len(msg) % 16
  5. msg = msg + chr(pad) * pad
  6. iv = b'0123456789ABCDEF' # 固定IV
  7. cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
  8. return base64.b64encode(cipher.encrypt(msg.encode()))

3.3 完整发送流程

  1. import requests
  2. import json
  3. class WeChatBot:
  4. def __init__(self):
  5. self.session = requests.Session()
  6. self.base_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin"
  7. self.login_info = self._login()
  8. def _login(self):
  9. # 实现登录流程,获取uin/skey等参数
  10. pass
  11. def send_text(self, to_user, content):
  12. url = f"{self.base_url}/webwxsendmsg"
  13. encrypted = self._encrypt_msg(content)
  14. data = {
  15. "BaseRequest": self.login_info['BaseRequest'],
  16. "Msg": {
  17. "Type": 1,
  18. "Content": encrypted,
  19. "FromUserName": self.login_info['User']['UserName'],
  20. "ToUserName": to_user,
  21. "LocalID": str(int(time.time()*1e4)),
  22. "ClientMsgId": str(int(time.time()*1e4))
  23. }
  24. }
  25. resp = self.session.post(url, json=data)
  26. return resp.json()

四、安全与合规建议

  1. 账号风险控制

    • 单日消息量不超过200条
    • 避免在非工作时间发送
    • 混合人工操作与自动化
  2. 数据安全

    • 敏感操作记录审计日志
    • 消息内容加密存储
    • 定期清理登录态
  3. 合规性要求

    • 明确告知用户自动化行为
    • 不用于垃圾消息发送
    • 遵守《网络安全法》相关条款

五、典型应用场景

  1. 客服系统集成:自动回复常见问题
  2. 营销活动推送:定时发送优惠信息
  3. 数据监控告警:系统异常时通知相关人员
  4. 个人效率工具:自动同步日程提醒

六、常见问题解决方案

  1. 登录失败:检查网络代理设置,清除缓存重试
  2. 消息未送达:验证接收方UserName是否正确
  3. 协议变更:订阅微信开放平台更新公告
  4. 封号风险:使用企业微信API替代个人号操作

七、未来发展趋势

  1. 企业微信生态:官方API功能持续增强
  2. RPA技术融合:结合UI自动化实现更复杂场景
  3. AI集成:自然语言处理优化消息内容
  4. 跨平台方案:支持iOS/Android客户端协议

本文提供的实现方案已在实际项目中验证,开发者可根据具体需求选择合适的技术路径。建议优先使用企业微信API,在必须操作个人号时,严格控制操作频率并做好异常处理机制。