From c2056241df25a1052116a3c5dffea950110da763 Mon Sep 17 00:00:00 2001 From: gunyu1019 Date: Fri, 31 May 2024 11:27:40 +0000 Subject: [PATCH 1/2] [Fix] #8 - Add User-Agent info, when the request makes. --- chzzkpy/http.py | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/chzzkpy/http.py b/chzzkpy/http.py index 357fbb3..05db640 100644 --- a/chzzkpy/http.py +++ b/chzzkpy/http.py @@ -24,18 +24,21 @@ import asyncio import functools import logging -from typing import Annotated, Optional +from typing import Annotated, Final, Optional -from ahttp_client import Session, get, Path +from ahttp_client import Session, get, Path, Query from ahttp_client.extension import get_pydantic_response_model from ahttp_client.request import RequestCore from .base_model import ChzzkModel, Content +from .channel import Channel from .error import LoginRequired from .live import LiveStatus, LiveDetail +from .search import TopSearchResult from .user import User _log = logging.getLogger(__name__) +_user_agent: Final[str] = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36" class ChzzkSession(Session): @@ -75,6 +78,11 @@ async def before_request( request.headers["Cookie"] += self._token elif getattr(request.func, "__login_required__", False): raise LoginRequired() + + # Add User-Agent to avoid blocking + if "User-Agent" not in request.headers: + request.headers['User-Agent'] = _user_agent + return request, path @property @@ -100,6 +108,36 @@ async def live_detail( ) -> Content[LiveDetail]: pass + @get_pydantic_response_model() + @get("/service/v1/search/channels", directly_response=True) + async def search_channel( + self, + keyword: Annotated[str, Query], + offset: Annotated[int, Query] = 0, + size: Annotated[int, Query] = 13 + ) -> Content[TopSearchResult]: + pass + + @get_pydantic_response_model() + @get("/service/v1/search/lives", directly_response=True) + async def search_live( + self, + keyword: Annotated[str, Query], + offset: Annotated[int, Query] = 0, + size: Annotated[int, Query] = 13 + ) -> Content[TopSearchResult]: + pass + + @get_pydantic_response_model() + @get("/service/v1/search/videos", directly_response=True) + async def search_video( + self, + keyword: Annotated[str, Query], + offset: Annotated[int, Query] = 0, + size: Annotated[int, Query] = 13 + ) -> Content[TopSearchResult]: + pass + class NaverGameAPISession(ChzzkSession): def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None): From 233d19026f5802816d9acd9f2c4934bcb53eae63 Mon Sep 17 00:00:00 2001 From: gunyu1019 Date: Fri, 31 May 2024 11:28:28 +0000 Subject: [PATCH 2/2] [Release] bump version 0.0.5 --- chzzkpy/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chzzkpy/__init__.py b/chzzkpy/__init__.py index d55671a..770e605 100644 --- a/chzzkpy/__init__.py +++ b/chzzkpy/__init__.py @@ -39,7 +39,7 @@ __author__ = "gunyu1019" __license__ = "MIT" __copyright__ = "Copyright 2024-present gunyu1019" -__version__ = "0.0.4-alpha1" # version_info.to_string() +__version__ = "0.0.5-alpha1" # version_info.to_string() class VersionInfo(NamedTuple): @@ -57,5 +57,5 @@ def to_string(self) -> str: version_info: VersionInfo = VersionInfo( - major=0, minor=0, micro=4, release_level="alpha", serial=1 + major=0, minor=0, micro=5, release_level="alpha", serial=1 )