mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-07 08:26:53 +08:00
fix douban api
This commit is contained in:
+38
-41
@@ -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')):
|
||||||
|
|||||||
Reference in New Issue
Block a user