From 0059844f3e36caa50280faa52d8f5e1ea7624334 Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Thu, 19 Dec 2024 05:21:56 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E4=BD=BF=E7=94=A8=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA/=E7=89=B9=E6=AE=8A=20UA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../games/tetrio/api/leaderboards.py | 9 ++++++- nonebot_plugin_tetris_stats/utils/request.py | 27 ++++++++++++------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/leaderboards.py b/nonebot_plugin_tetris_stats/games/tetrio/api/leaderboards.py index fbf2eb66..8775e444 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/leaderboards.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/leaderboards.py @@ -1,10 +1,12 @@ from typing import Literal, overload from uuid import UUID +from nonebot import __version__ as __nonebot_version__ from nonebot.compat import type_validate_json from yarl import URL from ....utils.exception import RequestError +from ....version import __version__ from ..constant import BASE_URL from .cache import Cache from .schemas.base import FailedModel @@ -22,7 +24,12 @@ async def by( await get( BASE_URL / f'users/by/{by_type}', parameter, - {'X-Session-ID': str(x_session_id)} if x_session_id is not None else None, + { + 'X-Session-ID': str(x_session_id), + 'User-Agent': f'nonebot-plugin-tetris-stats/{__version__} (Windows NT 10.0; Win64; x64) NoneBot2/{__nonebot_version__}', + } + if x_session_id is not None + else None, ), ) if isinstance(model, FailedModel): diff --git a/nonebot_plugin_tetris_stats/utils/request.py b/nonebot_plugin_tetris_stats/utils/request.py index 525ea6e7..0bf03d84 100644 --- a/nonebot_plugin_tetris_stats/utils/request.py +++ b/nonebot_plugin_tetris_stats/utils/request.py @@ -2,6 +2,7 @@ from http import HTTPStatus from typing import Any +from fake_useragent import UserAgent from httpx import AsyncClient, HTTPError from msgspec import DecodeError, Struct, json from nonebot import get_driver @@ -113,6 +114,8 @@ class Request: def __init__(self, proxy: str | None) -> None: self.proxy = proxy self.anti_cloudflares: dict[str, AntiCloudflare] = {} + self.client = AsyncClient(timeout=config.tetris.request_timeout, proxy=self.proxy) + self.ua = UserAgent() async def request( self, @@ -129,16 +132,20 @@ async def request( else: cookies = None headers = None - headers = headers if extra_headers is None else extra_headers if headers is None else headers | extra_headers + if headers is None: + headers = {} + if extra_headers: + headers.update(extra_headers) + headers.setdefault('User-Agent', self.ua.random) try: - async with AsyncClient(cookies=cookies, timeout=config.tetris.request_timeout, proxy=self.proxy) as session: - response = await session.get(str(url), headers=headers) - if response.status_code != HTTPStatus.OK: - msg = f'请求错误 code: {response.status_code} {HTTPStatus(response.status_code).phrase}\n{response.text}' - raise RequestError(msg, status_code=response.status_code) - if is_json: - decoder.decode(response.content) - return response.content + response = await self.client.get(str(url), cookies=cookies, headers=headers) + if response.status_code != HTTPStatus.OK: + msg = ( + f'请求错误 code: {response.status_code} {HTTPStatus(response.status_code).phrase}\n{response.text}' + ) + raise RequestError(msg, status_code=response.status_code) + if is_json: + decoder.decode(response.content) except HTTPError as e: msg = f'请求错误 \n{e!r}' raise RequestError(msg) from e @@ -146,6 +153,8 @@ async def request( if enable_anti_cloudflare and url.host is not None: return await self.anti_cloudflares.setdefault(url.host, AntiCloudflare(url.host))(str(url), self.proxy) raise + else: + return response.content async def failover_request( self,