fix async

This commit is contained in:
jxxghp
2025-07-31 13:32:47 +08:00
parent ee4d6d0db3
commit 6873de7243
7 changed files with 133 additions and 18 deletions

View File

@@ -1,10 +1,12 @@
from datetime import datetime
from typing import Optional
import httpx
import requests
from app.core.cache import cached
from app.core.config import settings
from app.utils.asyncio import AsyncUtils
from app.utils.http import RequestUtils, AsyncRequestUtils
@@ -29,7 +31,8 @@ class BangumiApi(object):
def __init__(self):
self._session = requests.Session()
self._req = RequestUtils(session=self._session)
self._async_req = AsyncRequestUtils()
self._client = httpx.AsyncClient()
self._async_req = AsyncRequestUtils(client=self._client)
@cached(maxsize=settings.CONF.bangumi, ttl=settings.CONF.meta)
def __invoke(self, url, key: Optional[str] = None, **kwargs):
@@ -303,3 +306,5 @@ class BangumiApi(object):
def close(self):
if self._session:
self._session.close()
if self._client:
AsyncUtils.run_async(self._client.aclose())

View File

@@ -12,6 +12,7 @@ import requests
from app.core.cache import cached
from app.core.config import settings
from app.utils.asyncio import AsyncUtils
from app.utils.http import RequestUtils, AsyncRequestUtils
from app.utils.singleton import WeakSingleton
@@ -155,7 +156,7 @@ class DoubanApi(metaclass=WeakSingleton):
def __init__(self):
self._session = requests.Session()
self._async_req = AsyncRequestUtils()
self._client = httpx.AsyncClient()
@classmethod
def __sign(cls, url: str, ts: str, method='GET') -> str:
@@ -249,7 +250,10 @@ class DoubanApi(metaclass=WeakSingleton):
GET请求异步版本
"""
req_url, params = self._prepare_get_request(url, **kwargs)
resp = await self._async_req.get_res(url=req_url, params=params)
resp = await AsyncRequestUtils(
ua=choice(self._user_agents),
client=self._client
).get_res(url=req_url, params=params)
return self._handle_response(resp)
def _prepare_post_request(self, url: str, **kwargs) -> tuple[str, dict]:
@@ -292,7 +296,10 @@ class DoubanApi(metaclass=WeakSingleton):
POST请求异步版本
"""
req_url, params = self._prepare_post_request(url, **kwargs)
resp = await self._async_req.post_res(url=req_url, data=params)
resp = await AsyncRequestUtils(
ua=settings.NORMAL_USER_AGENT,
client=self._client
).post_res(url=req_url, data=params)
return self._handle_response(resp)
def imdbid(self, imdbid: str,
@@ -869,3 +876,5 @@ class DoubanApi(metaclass=WeakSingleton):
def close(self):
if self._session:
self._session.close()
if self._client:
AsyncUtils.run_async(self._client.aclose())

View File

@@ -352,7 +352,11 @@ class SiteParserBase(metaclass=ABCMeta):
headers=req_headers).get_res(url=url)
if res is not None and res.status_code in (200, 500, 403):
if req_headers and "application/json" in str(req_headers.get("Accept")):
return json.dumps(res.json())
try:
return json.dumps(res.json())
except (json.JSONDecodeError, ValueError) as e:
logger.error(f"{self._site_name} API响应JSON解析失败: {e}")
return ""
else:
# 如果cloudflare 有防护,尝试使用浏览器仿真
if under_challenge(res.text):

View File

@@ -5,11 +5,13 @@ import logging
import time
from datetime import datetime
import httpx
import requests
import requests.exceptions
from app.core.cache import cached
from app.core.config import settings
from app.utils.asyncio import AsyncUtils
from app.utils.http import RequestUtils, AsyncRequestUtils
from .exceptions import TMDbException
@@ -17,14 +19,13 @@ logger = logging.getLogger(__name__)
class TMDb(object):
_req = None
_async_req = None
_session = None
def __init__(self, obj_cached=True, session=None, language=None):
def __init__(self, obj_cached=True, session=None, client=None, language=None):
self._api_key = settings.TMDB_API_KEY
self._language = language or settings.TMDB_LOCALE or "en-US"
self._session_id = None
self._session = session
self._client = client
self._wait_on_rate_limit = True
self._debug_enabled = False
self._cache_enabled = obj_cached
@@ -34,13 +35,14 @@ class TMDb(object):
self._total_results = None
self._total_pages = None
if session is not None:
self._req = RequestUtils(session=session, proxies=self.proxies)
else:
if not self._session:
self._session = requests.Session()
self._req = RequestUtils(session=self._session, proxies=self.proxies)
# 初始化异步请求客户端
self._async_req = AsyncRequestUtils(proxies=self.proxies)
self._req = RequestUtils(session=self._session, proxies=self.proxies)
if not self._client:
self._client = httpx.AsyncClient()
self._async_req = AsyncRequestUtils(client=self._client, proxies=self.proxies)
self._remaining = 40
self._reset = None
self._timeout = 15
@@ -277,3 +279,5 @@ class TMDb(object):
def close(self):
if self._session:
self._session.close()
if self._client:
AsyncUtils.run_async(self._client.aclose())