|
|
import hashlib
|
|
|
from uuid import uuid4
|
|
|
import time
|
|
|
|
|
|
CLIENT_ID = "ZQL_zwA4qhHcoe_2"
|
|
|
CLIENT_SECRET = "Og9Vr1L8Ee6bh0olFxFDRg"
|
|
|
CLIENT_VERSION = "1.06.0.2132"
|
|
|
PACKAG_ENAME = "com.thunder.downloader"
|
|
|
SDK_VERSION = "2.0.3.203100 "
|
|
|
APP_NAME = PACKAG_ENAME
|
|
|
|
|
|
|
|
|
def get_timestamp() -> int:
|
|
|
"""
|
|
|
Get current timestamp.
|
|
|
"""
|
|
|
return int(time.time() * 1000)
|
|
|
|
|
|
|
|
|
def device_id_generator() -> str:
|
|
|
"""
|
|
|
Generate a random device id.
|
|
|
"""
|
|
|
return str(uuid4()).replace("-", "")
|
|
|
|
|
|
|
|
|
SALTS = [
|
|
|
"kVy0WbPhiE4v6oxXZ88DvoA3Q",
|
|
|
"lON/AUoZKj8/nBtcE85mVbkOaVdVa",
|
|
|
"rLGffQrfBKH0BgwQ33yZofvO3Or",
|
|
|
"FO6HWqw",
|
|
|
"GbgvyA2",
|
|
|
"L1NU9QvIQIH7DTRt",
|
|
|
"y7llk4Y8WfYflt6",
|
|
|
"iuDp1WPbV3HRZudZtoXChxH4HNVBX5ZALe",
|
|
|
"8C28RTXmVcco0",
|
|
|
"X5Xh",
|
|
|
"7xe25YUgfGgD0xW3ezFS",
|
|
|
"",
|
|
|
"CKCR",
|
|
|
"8EmDjBo6h3eLaK7U6vU2Qys0NsMx",
|
|
|
"t2TeZBXKqbdP09Arh9C3",
|
|
|
]
|
|
|
|
|
|
|
|
|
def captcha_sign(device_id: str, timestamp: str) -> str:
|
|
|
"""
|
|
|
Generate a captcha sign.
|
|
|
|
|
|
在网页端的js中, 搜索 captcha_sign, 可以找到对应的js代码
|
|
|
|
|
|
"""
|
|
|
sign = CLIENT_ID + CLIENT_VERSION + PACKAG_ENAME + device_id + timestamp
|
|
|
for salt in SALTS:
|
|
|
sign = hashlib.md5((sign + salt).encode()).hexdigest()
|
|
|
return f"1.{sign}"
|
|
|
|
|
|
|
|
|
def generate_device_sign(device_id, package_name):
|
|
|
signature_base = f"{device_id}{package_name}1appkey"
|
|
|
|
|
|
|
|
|
sha1_hash = hashlib.sha1()
|
|
|
sha1_hash.update(signature_base.encode("utf-8"))
|
|
|
sha1_result = sha1_hash.hexdigest()
|
|
|
|
|
|
|
|
|
md5_hash = hashlib.md5()
|
|
|
md5_hash.update(sha1_result.encode("utf-8"))
|
|
|
md5_result = md5_hash.hexdigest()
|
|
|
|
|
|
device_sign = f"div101.{device_id}{md5_result}"
|
|
|
|
|
|
return device_sign
|
|
|
|
|
|
|
|
|
def build_custom_user_agent(device_id, user_id):
|
|
|
device_sign = generate_device_sign(device_id, PACKAG_ENAME)
|
|
|
|
|
|
user_agent_parts = [
|
|
|
f"ANDROID-{APP_NAME}/{CLIENT_VERSION}",
|
|
|
"protocolVersion/200",
|
|
|
"accesstype/",
|
|
|
f"clientid/{CLIENT_ID}",
|
|
|
f"clientversion/{CLIENT_VERSION}",
|
|
|
"action_type/",
|
|
|
"networktype/WIFI",
|
|
|
"sessionid/",
|
|
|
f"deviceid/{device_id}",
|
|
|
"providername/NONE",
|
|
|
f"devicesign/{device_sign}",
|
|
|
"refresh_token/",
|
|
|
f"sdkversion/{SDK_VERSION}",
|
|
|
f"datetime/{get_timestamp()}",
|
|
|
f"usrno/{user_id}",
|
|
|
f"appname/{APP_NAME}",
|
|
|
"session_origin/",
|
|
|
"grant_type/",
|
|
|
"appid/",
|
|
|
"clientip/",
|
|
|
"devicename/Xiaomi_M2004j7ac",
|
|
|
"osversion/13",
|
|
|
"platformversion/10",
|
|
|
"accessmode/",
|
|
|
"devicemodel/M2004J7AC",
|
|
|
]
|
|
|
|
|
|
return " ".join(user_agent_parts)
|
|
|
|