-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨ 新增(imaotai_login.py):添加了茅台商城登录及验证码获取功能
- Loading branch information
Showing
1 changed file
with
180 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,180 @@ | ||
import hashlib | ||
import json | ||
import time | ||
|
||
import requests | ||
|
||
""" | ||
获取地点信息,这里用的高德 api,需要自己去高德开发者平台申请自己的 key | ||
""" | ||
AMAP_KEY = "" | ||
|
||
|
||
SALT = "2af72f100c356273d46284f6fd1dfc08" | ||
|
||
CURRENT_TIME = str(int(time.time() * 1000)) | ||
headers = {} | ||
|
||
|
||
mt_version = json.loads( | ||
requests.get("https://itunes.apple.com/cn/lookup?id=1600482450").text | ||
)["results"][0]["version"] | ||
|
||
|
||
header_context = """ | ||
MT-Lat: 28.499562 | ||
MT-K: 1675213490331 | ||
MT-Lng: 102.182324 | ||
Host: app.moutai519.com.cn | ||
MT-User-Tag: 0 | ||
Accept: */* | ||
MT-Network-Type: WIFI | ||
MT-Token: 1 | ||
MT-Team-ID: 1 | ||
MT-Info: 028e7f96f6369cafe1d105579c5b9377 | ||
MT-Device-ID: 2F2075D0-B66C-4287-A903-DBFF6358342A | ||
MT-Bundle-ID: com.moutai.mall | ||
Accept-Language: en-CN;q=1, zh-Hans-CN;q=0.9 | ||
MT-Request-ID: 167560018873318465 | ||
MT-APP-Version: 1.3.7 | ||
User-Agent: iOS;16.3;Apple;?unrecognized? | ||
MT-R: clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/HGhHdw== | ||
Content-Length: 93 | ||
Accept-Encoding: gzip, deflate, br | ||
Connection: keep-alive | ||
Content-Type: application/json | ||
userId: 2 | ||
""" | ||
|
||
|
||
# 初始化请求头 | ||
def init_headers( | ||
user_id: str = "1", token: str = "2", lat: str = "29.83826", lng: str = "119.74375" | ||
): | ||
for k in header_context.strip().split("\n"): | ||
temp_l = k.split(": ") | ||
dict.update(headers, {temp_l[0]: temp_l[1]}) | ||
dict.update(headers, {"userId": user_id}) | ||
dict.update(headers, {"MT-Token": token}) | ||
dict.update(headers, {"MT-Lat": lat}) | ||
dict.update(headers, {"MT-Lng": lng}) | ||
dict.update(headers, {"MT-APP-Version": mt_version}) | ||
|
||
|
||
# 用高德api获取地图信息 | ||
def select_geo(i: str): | ||
# 校验高德api是否配置 | ||
if AMAP_KEY is None: | ||
print("!!!!请配置 AMAP_KEY (高德地图的MapKey)") | ||
raise ValueError | ||
resp = requests.get( | ||
f"https://restapi.amap.com/v3/geocode/geo?key={AMAP_KEY}&output=json&address={i}" | ||
) | ||
geocodes: list = resp.json()["geocodes"] | ||
return geocodes | ||
|
||
|
||
def signature(data: dict): | ||
keys = sorted(data.keys()) | ||
temp_v = "" | ||
for item in keys: | ||
temp_v += data[item] | ||
text = SALT + temp_v + CURRENT_TIME | ||
hl = hashlib.md5() | ||
hl.update(text.encode(encoding="utf8")) | ||
md5 = hl.hexdigest() | ||
return md5 | ||
|
||
|
||
# 获取登录手机验证码 | ||
def get_vcode(mobile: str): | ||
params = {"mobile": mobile} | ||
md5 = signature(params) | ||
dict.update( | ||
params, {"md5": md5, "timestamp": CURRENT_TIME, "MT-APP-Version": mt_version} | ||
) | ||
responses = requests.post( | ||
"https://app.moutai519.com.cn/xhr/front/user/register/vcode", | ||
json=params, | ||
headers=headers, | ||
) | ||
if responses.status_code != 200: | ||
print( | ||
f"get v_code : params : {params}, response code : {responses.status_code}, response body : {responses.text}" | ||
) | ||
|
||
|
||
# 执行登录操作 | ||
def login(mobile: str, v_code: str): | ||
params = {"mobile": mobile, "vCode": v_code, "ydToken": "", "ydLogId": ""} | ||
md5 = signature(params) | ||
dict.update( | ||
params, {"md5": md5, "timestamp": CURRENT_TIME, "MT-APP-Version": mt_version} | ||
) | ||
responses = requests.post( | ||
"https://app.moutai519.com.cn/xhr/front/user/register/login", | ||
json=params, | ||
headers=headers, | ||
) | ||
if responses.status_code != 200: | ||
print( | ||
f"login : params : {params}, response code : {responses.status_code}, response body : {responses.text}" | ||
) | ||
dict.update(headers, {"MT-Token": responses.json()["data"]["token"]}) | ||
dict.update(headers, {"userId": responses.json()["data"]["userId"]}) | ||
return responses.json()["data"]["token"], responses.json()["data"]["userId"] | ||
|
||
|
||
def get_location(): | ||
while 1: | ||
location = input( | ||
"请输入精确小区位置,例如[小区名称],为你自动预约附近的门店:" | ||
).strip() | ||
selects = select_geo(location) | ||
|
||
a = 0 | ||
for item in selects: | ||
formatted_address = item["formatted_address"] | ||
province = item["province"] | ||
print(f"{a} : [地区:{province},位置:{formatted_address}]") | ||
a += 1 | ||
user_select = input("请选择位置序号,重新输入请输入[-]:").strip() | ||
if user_select == "-": | ||
continue | ||
select = selects[int(user_select)] | ||
formatted_address = select["formatted_address"] | ||
province = select["province"] | ||
print(f"已选择 地区:{province},[{formatted_address}]附近的门店") | ||
return select | ||
|
||
|
||
if __name__ == "__main__": | ||
items = [] | ||
while 1: | ||
init_headers() | ||
location_select: dict = get_location() | ||
province = location_select["province"] | ||
city = location_select["city"] | ||
location: str = location_select["location"] | ||
|
||
mobile = input("输入手机号[18888888888]:").strip() | ||
get_vcode(mobile) | ||
code = input(f"输入 [{mobile}] 验证码[8888]:").strip() | ||
token, userId = login(mobile, code) | ||
item = { | ||
"province": province, | ||
"city": str(city), | ||
"lat": location.split(",")[1], | ||
"lng": location.split(",")[0], | ||
"mobile": str(mobile), | ||
"token": str(token), | ||
"userid": str(userId), | ||
"reserve_rule": 0, | ||
"item_codes": ["10941", "10942"], | ||
} | ||
items.append(item) | ||
condition = input("是否继续添加账号[y/n]:").strip() | ||
with open("account.json", "w") as f: | ||
f.write(json.dumps(items, ensure_ascii=False, indent=4)) | ||
if condition.lower() == "n": | ||
break |