From ce83bc24bd9b12a47c1b58409389bc68e4b13995 Mon Sep 17 00:00:00 2001 From: xjy <594123438@qq.com> Date: Tue, 13 Jan 2026 09:29:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AB=99=E7=82=B9Cook?= =?UTF-8?q?ie=E5=A4=84=E7=90=86=E7=9A=84=E4=B8=A4=E4=B8=AA=E5=85=B3?= =?UTF-8?q?=E9=94=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交修复了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 搜索功能恢复正常 - ✅ 春天站点搜索功能正常(验证通用性) --- app/utils/http.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/utils/http.py b/app/utils/http.py index 3336add2..6befa33b 100644 --- a/app/utils/http.py +++ b/app/utils/http.py @@ -26,12 +26,14 @@ def cookie_parse(cookies_str: str, array: bool = False) -> Union[list, dict]: """ if not cookies_str: return {} + from urllib.parse import unquote cookie_dict = {} cookies = cookies_str.split(";") for cookie in cookies: - cstr = cookie.split("=") + cstr = cookie.split("=", 1) # 只分割第一个=,因为value可能包含= 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: return [{"name": k, "value": v} for k, v in cookie_dict.items()] return cookie_dict @@ -654,7 +656,8 @@ class AsyncRequestUtils: proxy=self._proxies, timeout=self._timeout, verify=False, - follow_redirects=True + follow_redirects=True, + cookies=self._cookies # 在创建客户端时传入Cookie ) as client: return await self._make_request(client, method, url, raise_exception, **kwargs) else: @@ -666,7 +669,8 @@ class AsyncRequestUtils: 执行实际的异步请求 """ kwargs.setdefault("headers", self._headers) - kwargs.setdefault("cookies", self._cookies) + # Cookie已经在AsyncClient创建时设置,不要在request时再设置,否则会被覆盖 + # kwargs.setdefault("cookies", self._cookies) try: return await client.request(method, url, **kwargs)