105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
# Source: https://github.com/AkenClub/ken-iMoutai-Script/blob/main/2_login.py
|
||
# Raw: https://raw.githubusercontent.com/AkenClub/ken-iMoutai-Script/main/2_login.py
|
||
# Repo: AkenClub/ken-iMoutai-Script
|
||
# Path: 2_login.py
|
||
# UploadedAt: 2025-11-20T09:54:34+08:00
|
||
# SHA256: 153777702f935023b805885108b95cc7ecbd1b8f473d6024e20a4f594909fcba
|
||
# Category: APP版/账密
|
||
# Evidence: username/password/mobile/login
|
||
|
||
import time
|
||
import hashlib
|
||
import requests
|
||
import json
|
||
import logging
|
||
"""
|
||
2、登录,获取 USER_ID、TOKEN、COOKIE 等数据
|
||
|
||
上一步获取到验证码后,根据上一步输出的版本号和设备ID,填入下面信息进行登录请求,
|
||
运行后,输出用户信息,并记录用于后续预约。
|
||
|
||
"""
|
||
# ------ 填写以下 4 个变量值 --------
|
||
|
||
# 手机号码,和上一步的手机号码一致
|
||
PHONE_NUMBER = ''
|
||
# 验证码,填写收到的验证码
|
||
CODE = ""
|
||
# 设备 ID,和上一步的设备 ID 一致
|
||
DEVICE_ID = ""
|
||
# 版本号,和上一步的版本号一致
|
||
MT_VERSION = ""
|
||
|
||
# --------------------
|
||
'''
|
||
cron: 1 1 1 1 *
|
||
new Env("2_登录")
|
||
'''
|
||
|
||
# ***** 以下内容不用动 *****
|
||
|
||
SALT = "2af72f100c356273d46284f6fd1dfc08"
|
||
logging.basicConfig(level=logging.INFO,
|
||
format='%(asctime)s - %(levelname)s - %(message)s')
|
||
|
||
|
||
def signature(content, time):
|
||
text = SALT + content + str(time)
|
||
md5 = hashlib.md5(text.encode()).hexdigest()
|
||
return md5
|
||
|
||
|
||
def login(mobile, code, device_id, mt_version):
|
||
cur_time = int(time.time() * 1000)
|
||
data = {
|
||
"mobile": mobile,
|
||
"vCode": code,
|
||
"md5": signature(mobile + code, cur_time),
|
||
"timestamp": str(cur_time),
|
||
"MT-APP-Version": mt_version
|
||
}
|
||
headers = {
|
||
"MT-Device-ID": device_id,
|
||
"MT-APP-Version": mt_version,
|
||
"User-Agent": "iOS;16.3;Apple;?unrecognized?",
|
||
"Content-Type": "application/json"
|
||
}
|
||
url = "https://app.moutai519.com.cn/xhr/front/user/register/login"
|
||
response = requests.post(url, headers=headers, data=json.dumps(data))
|
||
json_response = response.json()
|
||
|
||
# 输出登录请求的返回结果
|
||
logging.info(f"「登录请求返回」:{json.dumps(json_response)}")
|
||
|
||
if json_response.get("code") == 2000:
|
||
logging.info("「登录请求-成功」")
|
||
user_data = json_response.get("data", {})
|
||
filtered_data = {
|
||
k: v
|
||
for k, v in user_data.items() if k not in
|
||
["idType", "verifyStatus", "idCode", "birthday", "userTag"]
|
||
}
|
||
return filtered_data
|
||
else:
|
||
logging.error("「登录请求-失败」")
|
||
raise Exception("登录失败,本地错误日志已记录")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# 判断入参
|
||
if not PHONE_NUMBER or not CODE or not DEVICE_ID or not MT_VERSION:
|
||
logging.error("「登录请求-失败」:缺少必要参数")
|
||
raise Exception("缺少必要参数")
|
||
|
||
result = login(PHONE_NUMBER, CODE, DEVICE_ID, MT_VERSION)
|
||
logging.info(f"「结果:用户信息」:{json.dumps(result)}")
|
||
|
||
logging.info("****************************")
|
||
logging.info("记录以下信息用于后续预约:")
|
||
logging.info(f"手机号码 - PHONE_NUMBER:{PHONE_NUMBER}")
|
||
logging.info(f"设备ID - DEVICE_ID:{DEVICE_ID}")
|
||
logging.info(f"版本号 - MT_VERSION:{MT_VERSION}")
|
||
logging.info(f"用户ID - USER_ID:{result['userId']}")
|
||
logging.info(f"Token - TOKEN:{result['token']}")
|
||
logging.info(f"Cookie - COOKIE:{result['cookie']}")
|