93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
"""斗鱼 Cookie 有效性检测服务。"""
|
||
|
||
from datetime import datetime, timezone
|
||
|
||
import requests
|
||
|
||
|
||
CHECK_UA = (
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36"
|
||
)
|
||
FISH_BALL_API = "https://www.douyu.com/wjapi/nc/exchange/fishBall"
|
||
USER_LEVEL_API = "https://www.douyu.com/japi/interactnc/web/userLevel/userLevelDetail"
|
||
|
||
|
||
def check_douyu_cookie(cookie: str) -> dict:
|
||
"""检测斗鱼 Cookie 有效性,鱼丸与等级接口均通过才算有效。"""
|
||
checked_at = datetime.now(timezone.utc)
|
||
base = {
|
||
"checked_at": checked_at,
|
||
"fish_ball": None,
|
||
"nickname": None,
|
||
"level": None,
|
||
}
|
||
if not cookie:
|
||
return {**base, "valid": False, "message": "Cookie 为空"}
|
||
|
||
fish_ok = False
|
||
fish_msg = ""
|
||
fish_ball = None
|
||
try:
|
||
fish_data = requests.get(
|
||
FISH_BALL_API,
|
||
params={"appCode": "YJTX"},
|
||
headers={
|
||
"User-Agent": CHECK_UA,
|
||
"Accept": "application/json, text/plain, */*",
|
||
"Referer": "https://www.douyu.com/member/walletcenter",
|
||
"Cookie": cookie,
|
||
},
|
||
timeout=(5, 10),
|
||
).json()
|
||
if isinstance(fish_data, dict) and fish_data.get("error") in (0, "0"):
|
||
fish_ok = True
|
||
fish_ball = (fish_data.get("data") or {}).get("count") if isinstance(fish_data.get("data"), dict) else None
|
||
else:
|
||
fish_msg = str(fish_data.get("msg") or fish_data.get("error") or "响应异常") if isinstance(fish_data, dict) else "响应异常"
|
||
except Exception as exc:
|
||
fish_msg = f"请求失败: {exc}"
|
||
|
||
level_ok = False
|
||
level_msg = ""
|
||
nickname = None
|
||
level = None
|
||
try:
|
||
level_data = requests.get(
|
||
USER_LEVEL_API,
|
||
params={"rid": "0"},
|
||
headers={
|
||
"User-Agent": CHECK_UA,
|
||
"Accept": "application/json, text/plain, */*",
|
||
"Referer": "https://www.douyu.com/pages/ord-user-level?clientType=web",
|
||
"Cookie": cookie,
|
||
},
|
||
timeout=(5, 10),
|
||
).json()
|
||
if isinstance(level_data, dict) and level_data.get("error") in (0, "0"):
|
||
level_ok = True
|
||
info = level_data.get("data") if isinstance(level_data.get("data"), dict) else {}
|
||
nickname = str(info.get("nn") or "") or None
|
||
level = info.get("lv")
|
||
else:
|
||
level_msg = str(level_data.get("msg") or level_data.get("error") or "响应异常") if isinstance(level_data, dict) else "响应异常"
|
||
except Exception as exc:
|
||
level_msg = f"请求失败: {exc}"
|
||
|
||
valid = fish_ok and level_ok
|
||
if valid:
|
||
message = "有效"
|
||
else:
|
||
message = ";".join([
|
||
f"鱼丸接口: {'ok' if fish_ok else (fish_msg or '失败')}",
|
||
f"等级接口: {'ok' if level_ok else (level_msg or '失败')}",
|
||
])
|
||
return {
|
||
**base,
|
||
"valid": valid,
|
||
"message": message[:200],
|
||
"fish_ball": fish_ball,
|
||
"nickname": nickname,
|
||
"level": level,
|
||
}
|