完全对齐目标 ck
This commit is contained in:
+41
-8
@@ -56,6 +56,8 @@ class DouyuLogin:
|
||||
WEBLOGIN_API = "https://msg.douyu.com/webLogin"
|
||||
CSRF_API = "https://www.douyu.com/japi/carnival/nc/common/generateCsrf"
|
||||
CSRF_REFERER = "https://www.douyu.com/pages/live-peace-handbook/web/shop?ditchname=pass0&roomId=9263298"
|
||||
ACF_CCN_API = "https://www.douyu.com/curl/csrfNlApi/getCsrfCookie"
|
||||
ACF_CCN_REFERER = "https://www.douyu.com/pages/ord-task-center?clientType=web&panelSource=1&rid=0"
|
||||
LOGIN_REFERER = (
|
||||
"https://passport.douyu.com/index/login?"
|
||||
"passport_reg_callback=PASSPORT_REG_SUCCESS_CALLBACK&"
|
||||
@@ -734,8 +736,9 @@ class DouyuLogin:
|
||||
except Exception as e:
|
||||
logger.warning(f"WebLogin请求失败(不影响登录): {e}")
|
||||
|
||||
# 登录成功后访问斗鱼 Web CSRF 接口,补齐 cvl_csrf_token;响应里的 acf_ccn 也会进入 session cookie jar。
|
||||
# 登录成功后补齐 Web 侧 Cookie,再导出完整 CK。
|
||||
self._generate_csrf_cookie()
|
||||
self._generate_acf_ccn_cookie()
|
||||
|
||||
return self._format_cookie_string()
|
||||
|
||||
@@ -743,8 +746,7 @@ class DouyuLogin:
|
||||
"""
|
||||
访问斗鱼 generateCsrf 接口,从 Set-Cookie 中同步 cvl_csrf_token。
|
||||
|
||||
requests.Session 会自动接收响应中的 Set-Cookie,所以这里不只保存
|
||||
cvl_csrf_token;接口额外下发的 acf_ccn 等 Cookie 也会保留到最终 CK。
|
||||
requests.Session 会自动接收响应中的 Set-Cookie,最终导出时会保留到 CK。
|
||||
"""
|
||||
logger.info("补齐CSRF Cookie...")
|
||||
headers = {
|
||||
@@ -780,14 +782,45 @@ class DouyuLogin:
|
||||
if not csrf_token:
|
||||
raise ValueError("生成CSRF失败: 响应没有 cvl_csrf_token")
|
||||
|
||||
if cookies.get('acf_ccn'):
|
||||
logger.info("已同步 acf_ccn Cookie")
|
||||
else:
|
||||
logger.warning("generateCsrf 响应未同步 acf_ccn Cookie")
|
||||
|
||||
logger.info("CSRF Cookie已补齐")
|
||||
return csrf_token
|
||||
|
||||
def _generate_acf_ccn_cookie(self) -> str:
|
||||
"""访问 getCsrfCookie 接口,从 Set-Cookie 中同步 acf_ccn。"""
|
||||
logger.info("补齐 acf_ccn Cookie...")
|
||||
headers = {
|
||||
'Accept': 'application/json, text/plain, */*',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9',
|
||||
'Cache-Control': 'no-cache',
|
||||
'Pragma': 'no-cache',
|
||||
'Priority': 'u=1, i',
|
||||
'Referer': self.ACF_CCN_REFERER,
|
||||
'Sec-CH-UA': '"Google Chrome";v="149", "Chromium";v="149", "Not)A;Brand";v="24"',
|
||||
'Sec-CH-UA-Mobile': '?0',
|
||||
'Sec-CH-UA-Platform': '"macOS"',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
# 该接口抓包没有 Origin、表单 Content-Type 和 X-Requested-With。
|
||||
'Origin': None,
|
||||
'Content-Type': None,
|
||||
'X-Requested-With': None,
|
||||
}
|
||||
response = self._request('get', self.ACF_CCN_API, headers=headers)
|
||||
response.raise_for_status()
|
||||
|
||||
cookies = self.session.cookies.get_dict()
|
||||
acf_ccn = cookies.get('acf_ccn', '') or response.cookies.get('acf_ccn', '')
|
||||
if acf_ccn and not cookies.get('acf_ccn'):
|
||||
# 极少数情况下响应 Cookie 未合入 get_dict,手动补到斗鱼域名下。
|
||||
self.session.cookies.set('acf_ccn', acf_ccn, domain='.douyu.com', path='/')
|
||||
|
||||
if not acf_ccn:
|
||||
raise ValueError("补齐 acf_ccn 失败: 响应没有 acf_ccn")
|
||||
|
||||
logger.info("acf_ccn Cookie已补齐")
|
||||
return acf_ccn
|
||||
|
||||
def _format_cookie_string(self) -> str:
|
||||
"""把当前 session 中的 Cookie 格式化为可导出的 CK 字符串。"""
|
||||
cookies = self.session.cookies.get_dict()
|
||||
|
||||
Reference in New Issue
Block a user