重构为 HTTP SSO 扫码方案并引入 Vue3 前端

移除 Playwright 浏览器自动化,改用 passport/SSO HTTP 接口获取二维码与轮询登录;后端模块化拆分,前端替换为 Vue3 SPA。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
travel
2026-06-25 10:47:55 +08:00
parent 853dacf528
commit 9e0644095f
33 changed files with 4792 additions and 1640 deletions
+59
View File
@@ -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