某茅台抢购助手是一款桌面端工具,用于帮助用户在 i茅台的申购/抢购活动中更高效地完成“选择商品 → 选择门店 → 到点提交”的重复操作,减少手动操作延迟与遗漏风险,并提供清晰的执行日志与状态反馈。
适用场景:
多账号需要统一管理、统一配置、统一执行
商品开售时间不固定(如 20:00/20:09 等),需要到点自动提交
希望在电脑端统一配置,结果在手机 i茅台 App 内查看
二、核心功能(能做什么)
账号管理
支持手机号 + 验证码登录
支持多账号批量管理
自动检测 token 失效并提示重新登录
商品管理与实时同步
支持商品勾选、记忆上次选择
启动/手动“刷新”同步商品数据(以 i茅台接口返回为准)
自动区分可申购商品与不可申购(云购等)商品
省/市配置 & 店铺选择
省/市信息用于匹配投放门店并选择 shopId
自动按省/市匹配门店;接口异常时提供回退策略,保证流程尽可能不中断
定时抢购(到点自动执行)
支持自定义多个时间点(如 20:00:00、20:09:00 等)
到点自动触发提交逻辑,减少手动卡点误差
执行引擎(稳定性)
支持并发执行、失败自动重试(可配置次数)
详细日志输出:每个账号、每个商品的提交结果与失败原因
崩溃自动弹出错误详情,便于快速定位问题
结果查看(与手机 App 打通)
若程序提示“提交成功/申购成功”(服务器返回成功),对应记录会出现在手机 i茅台 App:
我的 → 申购单/申购记录 中查看状态、结果与后续付款流程(如有)
三、典型使用流程
登录账号(可多个)
配置省/市(用于选店)
刷新商品列表并勾选目标商品
设置定时点(例如 20:00、20:09)
启动任务 → 等待日志提示结果
打开手机 i茅台 App「我的 → 申购单/申购记录」查看
1. 项目结构与技术栈
语言/运行:Python 3.8+
GUI:Tkinter(桌面应用)
网络请求:urllib.request(不依赖 requests)
本地存储:SQLite(账号、配置、选择项持久化)
打包发布:PyInstaller(单文件 EXE,windowed 模式)
加密:pycryptodome(AES-256-CBC,用于构造 actParam)
目录(核心):
main.py:程序入口 + 全局异常捕获(崩溃弹窗)
gui.py:界面、交互、配置保存、任务启动
database.py:SQLite 数据层 + 全局配置 + 商品列表(并支持动态同步)
services/imoutai.py:i茅台 官方 API 客户端(登录、获取 session、选店、提交申购)
services/engine.py:任务执行引擎(并发、重试、日志输出)
services/log_broadcaster.py:日志广播队列(线程安全把引擎日志送到 GUI)
2. 启动流程(main → gui)
main.py
设置 sys.excepthook,任何未捕获异常都会弹出错误详情窗口(可复制堆栈)
from gui import main as gui_main; gui_main()
gui.py
init_db() 初始化数据库
构建 UI(账号区、商品区、定时区、日志区等)
set_mode("real") 进入真实 API 模式
启动轮询:日志队列刷新、状态刷新
3. 数据层实现(database.py)
3.1 SQLite 表(概念)
accounts:手机号、token、cookie、省、市、创建时间
global_config:全局配置(省/市、重试次数、并发数、定时点等)
selection:保存“已选账号/已选商品”的勾选状态
3.2 省/市读取策略(关键修复点)
用户在界面填写省/市,会写入 global_config
引擎执行任务时优先取账号表里的 province/city;如果为空则回退到 global_config
解决“我填了地址但仍提示请配置省/市”的问题
4. i茅台 API 客户端(services/imoutai.py)
4.1 登录
发送验证码:/xhr/front/user/register/vcode
登录:/xhr/front/user/register/login
关键:构造 i茅台 需要的请求头(MT-*)
4.2 获取 session / 商品列表同步
session/get:/mt-backend/xhr/front/mall/index/session/get/{today_ts}
fetch_product_list(token):
用完整头(含 mt-lat/mt-lng 等)
解析