mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
fix: 修复站点Cookie处理的两个关键问题
本次提交修复了PT站点搜索功能失败的两个根本原因: 1. **Cookie URL解码问题** - 问题:数据库中存储的Cookie值包含URL编码(如%3D、%2B、%2F), 但cookie_parse()函数未进行解码 - 影响:所有使用URL编码Cookie的站点可能无法正常登录 - 修复:在app/utils/http.py的cookie_parse()中添加unquote()解码 2. **httpx Cookie jar覆盖问题**(关键) - 问题:httpx.AsyncClient的Cookie jar机制会自动保存服务器返回的 Set-Cookie,并在后续请求中覆盖我们传入的Cookie - 表现:传入正确的c_secure_uid/c_secure_pass,实际发送的却是 PHPSESSID等错误Cookie - 修复:在创建AsyncClient时传入Cookie,而不是在request()时传入 修改文件: - app/utils/http.py: cookie_parse()添加URL解码 + AsyncClient传入cookies - app/modules/indexer/spider/__init__.py: 清理调试代码 测试验证: - ✅ pterclub 搜索功能恢复正常 - ✅ 春天站点搜索功能正常(验证通用性)
This commit is contained in:
+8
-4
@@ -26,12 +26,14 @@ def cookie_parse(cookies_str: str, array: bool = False) -> Union[list, dict]:
|
|||||||
"""
|
"""
|
||||||
if not cookies_str:
|
if not cookies_str:
|
||||||
return {}
|
return {}
|
||||||
|
from urllib.parse import unquote
|
||||||
cookie_dict = {}
|
cookie_dict = {}
|
||||||
cookies = cookies_str.split(";")
|
cookies = cookies_str.split(";")
|
||||||
for cookie in cookies:
|
for cookie in cookies:
|
||||||
cstr = cookie.split("=")
|
cstr = cookie.split("=", 1) # 只分割第一个=,因为value可能包含=
|
||||||
if len(cstr) > 1:
|
if len(cstr) > 1:
|
||||||
cookie_dict[cstr[0].strip()] = cstr[1].strip()
|
# URL解码Cookie值(但保留Cookie名不解码)
|
||||||
|
cookie_dict[cstr[0].strip()] = unquote(cstr[1].strip())
|
||||||
if array:
|
if array:
|
||||||
return [{"name": k, "value": v} for k, v in cookie_dict.items()]
|
return [{"name": k, "value": v} for k, v in cookie_dict.items()]
|
||||||
return cookie_dict
|
return cookie_dict
|
||||||
@@ -654,7 +656,8 @@ class AsyncRequestUtils:
|
|||||||
proxy=self._proxies,
|
proxy=self._proxies,
|
||||||
timeout=self._timeout,
|
timeout=self._timeout,
|
||||||
verify=False,
|
verify=False,
|
||||||
follow_redirects=True
|
follow_redirects=True,
|
||||||
|
cookies=self._cookies # 在创建客户端时传入Cookie
|
||||||
) as client:
|
) as client:
|
||||||
return await self._make_request(client, method, url, raise_exception, **kwargs)
|
return await self._make_request(client, method, url, raise_exception, **kwargs)
|
||||||
else:
|
else:
|
||||||
@@ -666,7 +669,8 @@ class AsyncRequestUtils:
|
|||||||
执行实际的异步请求
|
执行实际的异步请求
|
||||||
"""
|
"""
|
||||||
kwargs.setdefault("headers", self._headers)
|
kwargs.setdefault("headers", self._headers)
|
||||||
kwargs.setdefault("cookies", self._cookies)
|
# Cookie已经在AsyncClient创建时设置,不要在request时再设置,否则会被覆盖
|
||||||
|
# kwargs.setdefault("cookies", self._cookies)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return await client.request(method, url, **kwargs)
|
return await client.request(method, url, **kwargs)
|
||||||
|
|||||||
Reference in New Issue
Block a user