仓库:MuZiCul/WZRYTYF(原创)· 语言:Python (Flask 2.1.2) · 定位:体验服奖励定时自动兑换 + 更新监控 + 多通道推送
基于 Flask 的王者荣耀体验服奖励自动兑换系统:把浏览器抓包得到的 cURL 解析成可复用的任务,定时自动兑换皮肤/英雄碎片,监控体验服更新并推送通知。
blueprints/index.py)这是本项目最有技术含量的部分——用正则从 cURL 文本中提取登录凭据:
def curl2py(curl, wx, remarks):
# 提取 curl 主体(到 --data-raw 之前)
curl_re_expression = re.compile("curl(.*?)--data-raw", re.S)
curl_result = re.findall(curl_re_expression, curl)[0]
# 解析 QQ 号:从 ams_qqopenid_ Cookie 中提取 %7C 分隔的 QQ
qq_re_expression = re.compile("ams_qqopenid_(.*?);", re.S)
qq_result = re.findall(qq_re_expression, curl_result)[0]
qq_re_number = re.compile("%7C(.*?)%7C", re.S)
qq = re.findall(qq_re_number, qq_result)[0]
# 判断登录类型:存在 wxcode 则走微信通道
wx_re_expression = re.compile("wxcode=(.*?);", re.S)
wx_result_list = re.findall(wx_re_expression, curl_result)
if IsNotNull(wx_result_list):
type_ = TYPE_WX
openid_re_expression = re.compile("; openid=(.*?);", re.S)
qq = re.findall(openid_re_expression, curl_result)[0] # 微信取 openid
account = wx
else:
type_ = TYPE_QQ
account = qq
解析要点:
- QQ 号藏在 ams_qqopenid_ Cookie 中,以 URL 编码的 |(%7C)分隔
- 微信登录与 QQ 登录走不同凭据字段(openid vs QQ 号)
- URL 编码处理(%7C = |),需要手动解码提取
blueprints/exchange.py)def CheckWZRY():
from lxml import etree
# 配置化的 URL 与请求头(存在数据库 ArgumentsModel 中)
headers = eval(ArgumentsModel.query.filter_by(name='check_header').first().value)
URL = ArgumentsModel.query.filter_by(name='check_url').first().value
response = requests.get(url=URL, headers=headers)
json_data = json.loads(response.text)
data = json_data['data']['items'][0]
sTargetTitle = data['sTargetTitle']
if '体验服' in sTargetTitle: # 关键词筛选出体验服公告
tid = data['iId']
# 去重:查 UpdateLogModel 是否已推送过
if len(UpdateLogModel.query.filter_by(update_id=tid).all()) < 1:
db.session.add(UpdateLogModel(...))
# 拉取公告详情内容
URL = 'https://apps.game.qq.com/wmp/v3.1/public/searchNews.php?...id=' + str(tid)
sContent = json.loads(response.text[14:-1])['msg']['sContent']
# xpath 提取纯文本(去掉 HTML 标签)
data = etree.HTML(text=sContent)
result = data.xpath('string(.)')
sc_send('体验服又更新啦!', result) # Server 酱推送
send_to_wecom(i) # 企业微信推送
设计亮点:
- 配置外置:URL 和请求头存在数据库 ArgumentsModel 中,接口变更时改配置不改代码
- 去重机制:UpdateLogModel 记录已推送的 tid,避免重复通知
- 双通道推送:Server 酱 + 企业微信,任一方失败仍有另一条路
- JSONP 处理:返回是 jsonp(...) 包裹,用切片 text[14:-1] 剥壳再解析
- HTML 转文本:etree.HTML + xpath('string(.)') 提取纯文本
COOKIES_STATE_ADD / UPDATE / SUCCESS / DEFICIT / OVERDUE / ENDED / PAUSE
TYPE_WX / TYPE_QQ
用常量定义 Cookie 生命周期状态,精细化管理每个账号的可用性。
| 类别 | 技术 |
|---|---|
| 后端框架 | Flask 2.1.2 |
| 数据库 | MySQL + SQLAlchemy + Flask-Migrate |
| 定时任务 | Flask-APScheduler(SkinDebris 3 小时 / CheckWZRY 1 小时) |
| 前端 UI | LayUI |
| 部署 | Docker / Docker Compose |
| 推送 | 企业微信 + Server 酱 |
WZRYTYF/
├── app.py
├── config/(config.py / models.py / decorators.py / exts.py)
├── blueprints/
│ ├── index.py # 主页面 + cURL 解析(curl2py)
│ ├── search.py # 查询
│ └── exchange.py # 体验服更新检测(CheckWZRY)
├── utils/
│ ├── utils.py # IsNull/IsNotNull/send_to_wecom
│ └── serverchan.py # Server 酱推送
└── migrations/ requirements.txt Dockerfile docker-compose.yml
这个项目流程是:抓包 → 解析 → 定时化 → 通知。
配置外置、去重、双推送这几点是为长期稳定运行加的。和同作者的 QQScanLogin 属于同一技术体系(王者荣耀活动自动化)。
自动化脚本依赖第三方接口,接口策略变更时需同步维护;请遵守相关平台服务条款。