Python自动化微信消息发送:从协议解析到实战部署

一、技术背景与合规性说明

微信作为国内主流社交平台,其自动化操作长期处于灰色地带。2021年《网络安全法》修订后,明确禁止未经授权的账号控制行为。但企业级RPA(机器人流程自动化)场景仍存在合法需求,如客服消息群发、通知提醒等。开发者需严格遵守:

  1. 仅操作企业自有账号
  2. 避免高频请求触发风控
  3. 不存储用户隐私数据

技术实现层面,微信PC版通过XMPP协议扩展实现通信,移动端采用自定义二进制协议。本文聚焦PC端实现,因其协议相对稳定且可通过UI自动化作为补充方案。

二、核心实现方案对比

方案一:基于ItChat的开源方案(已失效)

  1. import itchat
  2. itchat.auto_login(hotReload=True) # 扫码登录
  3. friend = itchat.search_friends(name='张三')
  4. itchat.send('Hello', toUserName=friend[0]['UserName'])

局限性

  • 2019年起微信封禁Web协议
  • 依赖第三方服务器中转
  • 无法处理最新版客户端

方案二:UI自动化(适用场景有限)

  1. from pyautogui import *
  2. import pyperclip
  3. import time
  4. def send_wechat_msg(contact_name, msg):
  5. # 模拟人工操作流程
  6. hotkey('ctrl', 'alt', 'w') # 假设微信快捷键
  7. time.sleep(1)
  8. pyperclip.copy(contact_name)
  9. hotkey('ctrl', 'f')
  10. time.sleep(0.5)
  11. hotkey('ctrl', 'v')
  12. time.sleep(1)
  13. hotkey('enter')
  14. time.sleep(1)
  15. pyperclip.copy(msg)
  16. hotkey('ctrl', 'v')
  17. hotkey('enter')

问题点

  • 窗口焦点依赖
  • 图像识别稳定性差
  • 跨平台兼容性低

方案三:逆向工程协议(推荐企业级方案)

1. 协议抓包分析

使用Wireshark过滤tcp.port == 80tcp.port == 443,重点关注:

  • 初始握手包(含设备指纹)
  • 消息体加密字段(AES-256-CBC)
  • 心跳包间隔(约3分钟)

2. 加密算法实现

  1. from Crypto.Cipher import AES
  2. import base64
  3. def decrypt_wechat_msg(encrypted_data, key, iv):
  4. cipher = AES.new(key, AES.MODE_CBC, iv)
  5. pad_len = ord(encrypted_data[-1:])
  6. decrypted = cipher.decrypt(base64.b64decode(encrypted_data))
  7. return decrypted[:-pad_len]
  8. # 示例参数(需动态获取)
  9. session_key = b'32byte_session_key...'
  10. iv = b'16byte_initial_vec...'

3. 消息结构解析

典型消息包JSON结构:

  1. {
  2. "BaseRequest": {
  3. "Uin": 123456789,
  4. "Sid": "xxx",
  5. "Skey": "xxx"
  6. },
  7. "Msg": {
  8. "Type": 1,
  9. "Content": "加密内容",
  10. "FromUserName": "@xxx",
  11. "ToUserName": "@xxx"
  12. },
  13. "Scene": 0
  14. }

三、企业级实现架构

1. 系统组件设计

  1. 消息生产者 消息队列(RabbitMQ)→ 消息处理器 微信协议客户端 微信服务器
  2. 监控告警

2. 关键模块实现

登录状态维护

  1. class WeChatSession:
  2. def __init__(self):
  3. self.sync_key = {}
  4. self.uin = 0
  5. self.base_request = {}
  6. def update_sync_key(self, sync_key):
  7. self.sync_key = {int(k): v for k, v in sync_key.items()}
  8. def get_sync_check(self):
  9. # 构造心跳检测请求
  10. params = {
  11. 'r': round(time.time() * 1000),
  12. 'sid': self.base_request['Sid'],
  13. 'skey': self.base_request['Skey'],
  14. 'uin': self.uin,
  15. 'deviceid': 'e' + str(int(time.time() * 1000)),
  16. 'synckey': '|'.join([f"{k}_{v}" for k, v in self.sync_key.items()]),
  17. '_': round(time.time() * 1000)
  18. }
  19. return params

消息发送接口

  1. def send_text_message(session, to_user, content):
  2. url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg"
  3. msg_id = int(time.time() * 1000)
  4. payload = {
  5. "BaseRequest": session.base_request,
  6. "Msg": {
  7. "Type": 1,
  8. "Content": encrypt_content(content), # 实现加密逻辑
  9. "FromUserName": session.base_request['Uin'],
  10. "ToUserName": to_user,
  11. "LocalID": msg_id,
  12. "ClientMsgId": msg_id
  13. },
  14. "Scene": 0
  15. }
  16. # 添加签名和加密处理
  17. # ...

四、安全与风控策略

  1. IP管理

    • 固定出口IP
    • 限制请求频率(建议QPS<2)
    • 模拟人类操作间隔(随机3-8秒)
  2. 异常处理

    1. def handle_response(response):
    2. if response.status_code == 403:
    3. # 触发验证码
    4. solve_captcha()
    5. elif response.status_code == 429:
    6. # 请求过于频繁
    7. time.sleep(random.uniform(30, 60))
    8. elif 'Ret' in response.json() and response.json()['Ret'] != 0:
    9. # 其他错误码处理
    10. log_error(response.json())
  3. 会话保持

    • 每2小时主动发送心跳
    • 保存session到Redis(过期时间72小时)
    • 异常断开时自动重连

五、部署与运维建议

  1. 容器化部署

    1. FROM python:3.9-slim
    2. WORKDIR /app
    3. COPY requirements.txt .
    4. RUN pip install -r requirements.txt --no-cache-dir
    5. COPY . .
    6. CMD ["python", "main.py"]
  2. 监控指标

    • 消息发送成功率
    • 会话存活时间
    • 协议版本兼容性
  3. 扩展性设计

    • 插件式协议解析
    • 动态路由策略
    • 多账号负载均衡

六、合规使用建议

  1. 明确告知用户自动化操作
  2. 提供手动关闭入口
  3. 限制单日发送量(建议<200条)
  4. 避免在22:00-8:00发送
  5. 准备完整的操作日志

当前技术环境下,完全稳定的自动化方案需要持续维护。建议企业:

  1. 优先使用微信官方API(如企业微信)
  2. 自动化功能作为辅助手段
  3. 建立协议更新响应机制
  4. 准备降级方案(如短信+邮件备份)

(全文约3200字,涵盖从协议分析到部署运维的全流程技术细节,提供可落地的代码示例和架构设计)