fix douban api

This commit is contained in:
jxxghp
2025-07-31 08:18:00 +08:00
parent 67229fd032
commit b6ff9f7196
+38 -41
View File
@@ -4,9 +4,10 @@ import hashlib
import hmac import hmac
from datetime import datetime from datetime import datetime
from random import choice from random import choice
from typing import Optional from typing import Optional, Union
from urllib import parse from urllib import parse
import httpx
import requests import requests
from app.core.cache import cached from app.core.cache import cached
@@ -199,9 +200,9 @@ class DoubanApi(metaclass=WeakSingleton):
""" """
return await self.__async_invoke(url, **kwargs) return await self.__async_invoke(url, **kwargs)
def __invoke(self, url: str, **kwargs) -> dict: def _prepare_get_request(self, url: str, **kwargs) -> tuple[str, dict]:
""" """
GET请求 准备GET请求的URL和参数
""" """
req_url = self._base_url + url req_url = self._base_url + url
@@ -219,39 +220,49 @@ class DoubanApi(metaclass=WeakSingleton):
'_ts': ts, '_ts': ts,
'_sig': self.__sign(url=req_url, ts=ts) '_sig': self.__sign(url=req_url, ts=ts)
}) })
return req_url, params
@staticmethod
def _handle_response(resp: Union[requests.Response, httpx.Response]) -> dict:
"""
处理HTTP响应
"""
if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text:
return resp.json()
return resp.json() if resp else {}
@cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
def __invoke(self, url: str, **kwargs) -> dict:
"""
GET请求
"""
req_url, params = self._prepare_get_request(url, **kwargs)
resp = RequestUtils( resp = RequestUtils(
ua=choice(self._user_agents), ua=choice(self._user_agents),
session=self._session session=self._session
).get_res(url=req_url, params=params) ).get_res(url=req_url, params=params)
if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text: return self._handle_response(resp)
return resp.json()
return resp.json() if resp else {}
@cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta) @cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
async def __async_invoke(self, url: str, **kwargs) -> dict: async def __async_invoke(self, url: str, **kwargs) -> dict:
""" """
GET请求(异步版本) GET请求(异步版本)
""" """
req_url = self._base_url + url req_url, params = self._prepare_get_request(url, **kwargs)
resp = await self._async_req.get_res(url=req_url, params=params)
return self._handle_response(resp)
params: dict = {'apiKey': self._api_key} def _prepare_post_request(self, url: str, **kwargs) -> tuple[str, dict]:
"""
准备POST请求的URL和参数
"""
req_url = self._api_url + url
params = {'apikey': self._api_key2}
if kwargs: if kwargs:
params.update(kwargs) params.update(kwargs)
if '_ts' in params:
ts = params.pop( params.pop('_ts')
'_ts', return req_url, params
datetime.strftime(datetime.now(), '%Y%m%d')
)
params.update({
'os_rom': 'android',
'apiKey': self._api_key,
'_ts': ts,
'_sig': self.__sign(url=req_url, ts=ts)
})
resp = await self._async_req.get_res(url=req_url, params=params)
if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text:
return resp.json()
return resp.json() if resp else {}
@cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta) @cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
def __post(self, url: str, **kwargs) -> dict: def __post(self, url: str, **kwargs) -> dict:
@@ -268,35 +279,21 @@ class DoubanApi(metaclass=WeakSingleton):
} }
) )
""" """
req_url = self._api_url + url req_url, params = self._prepare_post_request(url, **kwargs)
params = {'apikey': self._api_key2}
if kwargs:
params.update(kwargs)
if '_ts' in params:
params.pop('_ts')
resp = RequestUtils( resp = RequestUtils(
ua=settings.NORMAL_USER_AGENT, ua=settings.NORMAL_USER_AGENT,
session=self._session, session=self._session,
).post_res(url=req_url, data=params) ).post_res(url=req_url, data=params)
if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text: return self._handle_response(resp)
return resp.json()
return resp.json() if resp else {}
@cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta) @cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
async def __async_post(self, url: str, **kwargs) -> dict: async def __async_post(self, url: str, **kwargs) -> dict:
""" """
POST请求(异步版本) POST请求(异步版本)
""" """
req_url = self._api_url + url req_url, params = self._prepare_post_request(url, **kwargs)
params = {'apikey': self._api_key2}
if kwargs:
params.update(kwargs)
if '_ts' in params:
params.pop('_ts')
resp = await self._async_req.post_res(url=req_url, data=params) resp = await self._async_req.post_res(url=req_url, data=params)
if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text: return self._handle_response(resp)
return resp.json()
return resp.json() if resp else {}
def imdbid(self, imdbid: str, def imdbid(self, imdbid: str,
ts=datetime.strftime(datetime.now(), '%Y%m%d')): ts=datetime.strftime(datetime.now(), '%Y%m%d')):