青龙脚本 - i 茅台 - 预约、旅行、登录、验证码等流程一条龙完成 免抓包
项目地址: ken-iMoutai-Script: 青龙脚本,完成 i茅台 预约申购、登录、短信验证码、耐力值和小茅运领取、旅行 等功能 (github.com)
欢迎小星星⭐点亮鼓励一下哇~
ken-iMoutai-Script 是一个青龙脚本,旨在自动化完成 i茅台的预约申购、登录、短信验证码处理、耐力值和小茅运领取、旅行功能以及自动化选择店铺等功能。
功能
- 登录
- 短信验证码
- 预约申购
- 耐力值和小茅运领取
- 旅行功能
- 自动化选择店铺 🆕
- 定时检查 TOKEN 有效期 🆕
青龙版本:正式版 v2.17.10
使用方法
第 1、2、3 步都是修改脚本里面开头的变量值,然后手动运行一下,查看日志并且记录所需的数据。
之后将上述步骤获得的数据组成青龙面板里面的环境变量
KEN_IMAOTAI_ENV,就能定时执行第 4、5 步的脚本了。TOKEN 有效期一般一个月,过期了重新执行一下第 1、2 步拿到数据修改
KEN_IMAOTAI_ENV值即可。
拉取仓库:
在青龙面板-订阅管理-创建订阅,复制以下命令到
名称输入框即可自动配置订阅链接,定时规则自定,例如0 5 * * *,添加完成后点击列表行运行,脚本会自动添加到定时任务。1
ql repo https://github.com/AkenClub/ken-iMoutai-Script.git获取登录验证码
运行
1_generate_code.py脚本以获取登录验证码,并记录设备ID、版本号等数据。- (脚本文件内)变量配置:
1
2# 填写手机号码,收到验证码后在 2_login.py 中填写验证码
PHONE_NUMBER = ''登录
使用获取到的验证码、设备ID 和版本号进行登录请求,输出用户信息并记录以备后续使用。请运行
2_login.py脚本。- (脚本文件内)变量配置:
1
2
3
4
5
6
7
8# 手机号码,和上一步的手机号码一致
PHONE_NUMBER = ''
# 验证码,填写收到的验证码
CODE = ""
# 设备 ID,和上一步的设备 ID 一致
DEVICE_ID = ""
# 版本号,和上一步的版本号一致
MT_VERSION = ""查询可预约商品和售卖商店
运行
3_retrieve_shop_and_product_info.py脚本查询可预约的商品和商店信息,获取 SHOP_ID、LAT、LNG 、省份、城市 等数据。- (脚本文件内)变量配置:
1
2
3
4# 省份
PROVINCE_NAME = "广西壮族自治区"
# 城市
CITY_NAME = "南宁市"预约商品
每日 9:10 开始预约,并根据青龙面板的通知渠道进行通知。请运行
4_reserve_product.py脚本。配置环境变量
KEN_IMAOTAI_ENV:内容格式为:PHONE_NUMBER$USER_ID$DEVICE_ID$MT_VERSION$PRODUCT_ID_LIST$SHOP_ID^SHOP_MODE^PROVINCE^CITY$LAT$LNG$TOKEN$COOKIE
解释:手机号码$用户ID$设备ID$版本号$商品ID列表$店铺ID^店铺缺货时自动采用的模式^省份^城市$纬度$经度$TOKEN$COOKIE
多个用户时使用 & 连接。
常量。
PHONE_NUMBER: 用户的手机号码。 — 自己手机号码
CODE: 短信验证码。 — 运行 1_generate_code.py 获取
DEVICE_ID: 设备的唯一标识符。 — 运行 1_generate_code.py 获取
MT_VERSION: 应用程序的版本号。 — 运行 1_generate_code.py 获取
USER_ID: 用户的唯一标识符。 — 运行 2_login.py 获取
TOKEN: 用于身份验证的令牌。 — 运行 2_login.py 获取
COOKIE: 用于会话管理的Cookie。 — 运行 2_login.py 获取
PRODUCT_ID_LIST: 商品ID列表,表示用户想要预约的商品。— 运行 3_retrieve_shop_and_product_info.py 获取
SHOP_ID: 店铺的唯一标识符。 — 运行 3_retrieve_shop_and_product_info.py 获取
可设置为 AUTO,则根据 SHOP_MODE 的值来选择店铺 ID。
SHOP_MODE:店铺缺货模式,可选值为 NEAREST(距离最近)或 INVENTORY(库存最多)。设置该值时,需要同时设置 PROVINCE 和 CITY。
非必填,但 SHOP_ID 设置 AUTO 时为必填,需要同时设置 SHOP_MODE、PROVINCE 和 CITY。
PROVINCE: 用户所在的省份。 — 与 3_retrieve_shop_and_product_info.py 填写的省份一致
非必填,但 SHOP_MODE 设置为 NEAREST 或 INVENTORY 时为必填。
CITY: 用户所在的城市。 — 与 3_retrieve_shop_and_product_info.py 填写的城市一致
非必填,但 SHOP_MODE 设置为 NEAREST 或 INVENTORY 时为必填。
LAT: 用户所在位置的纬度。 — 运行 3_retrieve_shop_and_product_info.py 获取
LNG: 用户所在位置的经度。 — 运行 3_retrieve_shop_and_product_info.py 获取
注意:PRODUCT_ID_LIST 里面的 ID 值需要用单引号,整个环境变量里的标点符号都是用英文符号。
旅行 & 获取小茅运、首次分享奖励
每日从早上 9 点到晚上 8 点之间,每 7 个小时执行一次旅行任务。请运行
5_travel_and_rewards.py脚本。9:15、16:15 执行,每日旅行两次应该足够用完耐力值了,可自行修改。- 配置环境变量
KEN_IMAOTAI_ENV:同上
- 配置环境变量
配置通知
在控制面板 - 配置文件 - 右上角确定是
config.sh里,例如配置企业微信机器人,则填写QYWX_KEY的值即可。不需要通知的内容末尾添加随机句子,可以配置
1
2## 禁用一言(随机句子)
export HITOKOTO="false"定时检查 TOKEN 有效期
需要安装依赖 PyJWT:面板 - 依赖管理 - 右上角新建依赖 - 类型 python3 - 拆分 否 - 名称 - PyJWT - 确定。
等安装完成刷新页面去运行一次脚本
99_check_for_validity.py,测试没问题后,脚本会每天定时在 8/20:58 自动执行并通知。
环境变量示例
使用
指定店铺ID+NEAREST模式自动选择距离最近的店铺推荐该配置,可以减少接口调用,加快运行效率。
注意:设置 SHOP_MODE 为 NEAREST 值后,需要同时设置 省份(PROVINCE) 和 城市(CITY) 的值
1
KEN_IMAOTAI_ENV="13812345678$9876543210$abcd1234-5678-90ef-ghij-klmn01234567$1.8.0$['12345', '54321']$45678^NEAREST^北京市^北京市$39.904202$116.407394$eyJhbGciOiJIUzI1$eyJzZXNzaW9uX2lk"说明:此配置运行时先使用用户指定的店铺 ID
45678预约,若商品支持在该店铺预约,则直接使用该店铺预约;若该店铺不支持预约这个商品,会根据用户所在位置北京市,自动选择距离最近的店铺进行商品预订。使用
AUTO+NEAREST模式自动选择距离最近的店铺注意:设置 SHOP_MODE 为 NEAREST 值后,需要同时设置 省份(PROVINCE) 和 城市(CITY) 的值
1
KEN_IMAOTAI_ENV="13812345678$9876543210$abcd1234-5678-90ef-ghij-klmn01234567$1.8.0$['12345', '54321']$AUTO^NEAREST^北京市^北京市$39.904202$116.407394$eyJhbGciOiJIUzI1$eyJzZXNzaW9uX2lk"说明:该配置会根据用户所在位置北京市,自动选择距离最近的店铺进行商品预订。
使用
AUTO+INVENTORY模式选择库存最多的店铺注意:设置 SHOP_MODE 为 INVENTORY 值后,需要同时设置 省份(PROVINCE) 和 城市(CITY) 的值
1
KEN_IMAOTAI_ENV="13987654321$1029384756$abcd-1234-efgh-5678-ijkl90123456$1.8.1$['98765', '56789']$AUTO^INVENTORY^上海市^上海市$31.230391$121.473701$eyJzZXNzaW9uIjoxMjM0$eyJ1c2VyX2Nvb2tpZQ"说明:此配置在上海市自动选择库存最多的店铺来完成预订。
指定店铺ID且不使用自动选择模式
注意:可能会出现“商品ID XXX 申购失败:当前选择的门店不参与本场申购,请选择另外的门店申购”情况,建议设置 SHOP_MODE、PROVINCE 和 CITY 值,在店铺缺货时根据指定模式自动选择店铺。
1
KEN_IMAOTAI_ENV="13656789012$1122334455$1234abcd-5678-efgh-9012-ijkl34567890$1.9.0$['11223']$45678$22.543096$114.057865$eyJzdG9yZV9jb29raWVfZGF0YQ$eyJ0b2tlbiI6"说明:此配置使用用户指定的店铺 ID
45678,无自动选择店铺。多个用户配置
使用 & 连接。
1
KEN_IMAOTAI_ENV="13876543210$9988776655$abcd1234-5678-efgh-ijkl-901234567890$1.8.2$['10999']$AUTO^INVENTORY^广东省^广州市$23.129163$113.264435$eyJzaWduZWRfY29va2ll$eyJ0b2tlbiIgY2hlY2s&13965432108$7766554433$dcba4321-8765-ghij-klmn-098765432109$1.9.0$['10500']$45678^NEAREST^江苏省^南京市$32.060255$118.796877$eyJ1c2VyX2Nvb2tpZQ$eyJvcGVuX3Nlc3Npb25fa2V5"说明:该配置包含两个用户的信息:第一个用户在广东省广州市使用
AUTO+INVENTORY模式自动选择库存最多的店铺;第二个用户在江苏省南京市指定店铺 ID45678,使用NEAREST模式选择距离最近的店铺。
常见问题
缺少依赖,
ModuleNotFoundError: No module named 'Crypto'?解决:单独安装
pycryptodome依赖1
docker exec -it 青龙容器名 /bin/bash在容器内使用 pip 安装 pycryptodome:
1
pip install pycryptodome运行日志显示
申购完成,但是在 i茅台 APP 上的预约申购页面还是显示预约申购按钮?解决:如果继续点击
预约申购,最后会提示你已经申购的了。也可以在 i茅台APP - 我的 - 我的申购单 里面能看到
静候申购结果。 有小伙伴已经申购成功,证明该方式可行。正确定义了环境变量,但是还报错“环境变量未定义”?例如
1
2
3
4
5
6
7
8/ql/data/config/config.sh: line 291: '10941', '10942': syntax error: operand expected (error token is "'10941', '10942'")
## 开始执行... 2024-09-20 14:21:27
无推送渠道,请检查通知变量是否正确
Traceback (most recent call last):
File "/ql/data/scripts/AkenClub_ken-iMoutai-Script/4_product_reservation.py", line 183, in <module>
raise Exception(errText)
Exception: 🚫 KEN_IMAOTAI_ENV 环境变量未定义解决:在旧版本 2.13.8 能复现,升级青龙版本解决。目前在 v2.17.10、v2.17.11 可用。升级青龙版本需自行检查对其他脚本有无影响。
有其他奇奇怪怪的报错?可以试试升级青龙版本到 v2.17.10+
计划
增加累计申购N天的小茅运检测和领取功能ad4101c已完成,需重新拉库增加 7 日连续申购领取小茅运奖励功能673dda4已完成,需重新拉库增加判断目标店铺不支持某个商品预约时,自动选择可预约的其他店铺81971ad 已完成,需重新拉库。环境变量做了兼容,建议设置自动化选择店铺相关变量值- 增加周末欢乐购
参考与致谢
本项目参考了以下两个项目:
- yize8888/maotai - 提供了实现思路。
- oddfar/campus-imaotai - 提供了基础实现。
感谢这些项目的作者和贡献者,他们的工作为本项目提供了宝贵的参考和灵感。
yize8888/maotai项目是青龙脚本,但没有登录、验证码获取、店铺信息、旅行相关等功能,使用时候需要额外抓包;
oddfar/campus-imaotai虽然功能齐全,但不是青龙脚本,对于原本已经运行青龙面板的用户来说,增加了额外的运行压力。本项目将两者的优缺点融合在一起,主要用 python 重写了 oddfar/campus-imaotai 相关 Java 接口。
免责声明
本项目涉及抓取接口数据,仅用于学习和交流目的。请注意以下几点:
- 合法性和合规性: 使用本脚本时,请确保遵守所有相关法律法规以及服务条款。本项目的使用可能涉及到法律风险,用户需要对使用本脚本的行为负责。
- 数据隐私: 本脚本涉及对接口数据的抓取,用户需自行保证对其账号、数据和隐私的保护,避免泄露敏感信息。
- 风险提示: 由于抓取接口数据可能会受到系统限制或变更,脚本的正常运行和功能实现无法得到保证。使用本项目的风险由用户自行承担。
- 第三方服务: 本项目的部分功能可能依赖于第三方服务或接口,这些服务的变更或不可用可能会影响脚本的正常工作。
- 学习和交流: 本项目仅用于学习和交流目的,旨在帮助用户了解接口抓取和自动化处理的技术。请勿用于商业用途或其他非法活动。
- 责任声明: 本项目作者不对因使用本脚本而产生的任何直接或间接损失负责。请用户在使用前充分理解相关风险,并确保合法合规使用。
许可证
本项目使用 Apache-2.0 许可证 进行许可。有关更多详细信息,请参阅 LICENSE 文件。