重构为 HTTP SSO 扫码方案并引入 Vue3 前端
移除 Playwright 浏览器自动化,改用 passport/SSO HTTP 接口获取二维码与轮询登录;后端模块化拆分,前端替换为 Vue3 SPA。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
LOGIN_COOKIE_KEYS = frozenset({
|
||||
"sessionid", "sessionid_ss", "sid_guard", "uid_tt", "uid_tt_ss",
|
||||
"sso_uid_tt", "sso_uid_tt_ss", "passport_sso_user_id",
|
||||
"sid_ucp_sso", "sid_guard_ee", "uid_tt_ee",
|
||||
"passport_auth_status", "login_time", "multi_sids",
|
||||
"is_login", "douyin_tt",
|
||||
})
|
||||
|
||||
|
||||
def match_login_cookies(cookie_names):
|
||||
name_set = set(cookie_names)
|
||||
return [k for k in LOGIN_COOKIE_KEYS if k in name_set]
|
||||
|
||||
|
||||
def is_logged_in(cookies, cookie_names):
|
||||
matched = match_login_cookies(cookie_names)
|
||||
name_set = set(cookie_names)
|
||||
if len(matched) >= 2:
|
||||
return True
|
||||
has_session = bool(name_set & {"sessionid", "sessionid_ss", "sid_guard", "sid_tt"})
|
||||
has_uid = bool(name_set & {"uid_tt", "uid_tt_ss", "passport_sso_user_id"})
|
||||
if has_session and has_uid:
|
||||
return True
|
||||
if has_session and len(cookies) >= 30:
|
||||
return True
|
||||
for c in cookies:
|
||||
if c["name"] == "passport_auth_status":
|
||||
val = str(c.get("value", "")).lower()
|
||||
if val in ("1", "true", "yes", "2") and has_session:
|
||||
return True
|
||||
if c["name"] == "login_time" and c.get("value"):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def extract_nickname(cookies):
|
||||
for c in cookies:
|
||||
if c["name"] in ("passport_sso_user_name", "nickname", "user_name", "user_nickname"):
|
||||
return c["value"]
|
||||
for c in cookies:
|
||||
if c["name"] == "uid_tt" and c.get("value"):
|
||||
return f"用户{c['value'][:8]}"
|
||||
return "用户"
|
||||
|
||||
|
||||
def cookies_to_json(cookie_jar) -> list[dict]:
|
||||
"""将 requests CookieJar 转为前端 JSON 列表"""
|
||||
items = []
|
||||
for c in cookie_jar:
|
||||
items.append({
|
||||
"name": c.name,
|
||||
"value": c.value,
|
||||
"domain": c.domain or ".douyin.com",
|
||||
"path": c.path or "/",
|
||||
"expires": c.expires,
|
||||
"httpOnly": bool(getattr(c, "_rest", {}).get("HttpOnly") or False),
|
||||
"secure": bool(c.secure),
|
||||
})
|
||||
return items
|
||||
Reference in New Issue
Block a user