diff --git a/nonebot_bison/platform/bilibili/scheduler.py b/nonebot_bison/platform/bilibili/scheduler.py index 5d19b75..089361d 100644 --- a/nonebot_bison/platform/bilibili/scheduler.py +++ b/nonebot_bison/platform/bilibili/scheduler.py @@ -47,12 +47,12 @@ class BilibiliClientManager(CookieClientManager): @classmethod @override - async def _generate_anonymous_cookie(cls) -> CookieModel: - cookies = await cls._get_cookies() + async def _generate_anonymous_cookie(self) -> CookieModel: + cookies = await self._get_cookies() cookie = CookieModel( - cookie_name=f"{cls._site_name} anonymous", - site_name=cls._site_name, - content=json.dumps(cls._gen_json_cookie(cookies)), + cookie_name=f"{self._site_name} anonymous", + site_name=self._site_name, + content=json.dumps(self._gen_json_cookie(cookies)), is_universal=True, is_anonymous=True, last_usage=datetime.now(), diff --git a/nonebot_bison/platform/rss.py b/nonebot_bison/platform/rss.py index fbc5cb9..bc2665f 100644 --- a/nonebot_bison/platform/rss.py +++ b/nonebot_bison/platform/rss.py @@ -10,14 +10,14 @@ from ..post import Post from .platform import NewMessage from ..types import Target, RawPost from ..utils import text_similarity -from ..utils.site import CookieSite, create_cookie_client_manager +from ..utils.site import CookieSite, CookieClientManager class RssSite(CookieSite): name = "rss" schedule_type = "interval" schedule_setting = {"seconds": 30} - client_mgr = create_cookie_client_manager("rss") + client_mgr = CookieClientManager class RssPost(Post): diff --git a/nonebot_bison/platform/weibo.py b/nonebot_bison/platform/weibo.py index 7ab7463..12d6f25 100644 --- a/nonebot_bison/platform/weibo.py +++ b/nonebot_bison/platform/weibo.py @@ -13,8 +13,8 @@ from bs4 import BeautifulSoup as bs from ..post import Post from .platform import NewMessage from ..utils import http_client, text_fletten +from ..utils.site import CookieSite, CookieClientManager from ..types import Tag, Target, RawPost, ApiError, Category -from ..utils.site import CookieSite, create_cookie_client_manager _HEADER = { "accept": ( @@ -40,7 +40,7 @@ class WeiboSite(CookieSite): name = "weibo.com" schedule_type = "interval" schedule_setting = {"seconds": 3} - client_mgr = create_cookie_client_manager(name) + client_mgr = CookieClientManager default_cookie_cd: int = timedelta(seconds=15) @classmethod diff --git a/nonebot_bison/utils/site.py b/nonebot_bison/utils/site.py index 2bb5bc0..3aa35a8 100644 --- a/nonebot_bison/utils/site.py +++ b/nonebot_bison/utils/site.py @@ -43,16 +43,13 @@ class DefaultClientManager(ClientManager): class CookieClientManager(ClientManager): - _site_name: str # 绑定的 site_name,需要使用 create_cookie_client_manager 创建 Client_mgr 时绑定 - def __init__(self, site: "Site") -> None: self._site = site - @classmethod - async def _generate_anonymous_cookie(cls) -> Cookie: + async def _generate_anonymous_cookie(self) -> Cookie: return Cookie( - cookie_name=f"{cls._site_name} anonymous", - site_name=cls._site_name, + cookie_name=f"{self._site.name} anonymous", + site_name=self._site.name, content="{}", is_universal=True, is_anonymous=True, @@ -62,28 +59,26 @@ class CookieClientManager(ClientManager): status="", ) - @classmethod - async def _refresh_anonymous_cookie(cls): + async def _refresh_anonymous_cookie(self): """更新已有的匿名cookie,若不存在则添加""" - existing_anonymous_cookies = await config.get_cookie(cls._site_name, is_anonymous=True) + existing_anonymous_cookies = await config.get_cookie(self._site.name, is_anonymous=True) if existing_anonymous_cookies: for cookie in existing_anonymous_cookies: - new_anonymous_cookie = await cls._generate_anonymous_cookie() + new_anonymous_cookie = await self._generate_anonymous_cookie() new_anonymous_cookie.id = cookie.id # 保持原有的id await config.update_cookie(new_anonymous_cookie) else: - new_anonymous_cookie = await cls._generate_anonymous_cookie() + new_anonymous_cookie = await self._generate_anonymous_cookie() await config.add_cookie(new_anonymous_cookie) - @classmethod - async def add_user_cookie(cls, content: str, cookie_name: str | None = None) -> Cookie: + async def add_user_cookie(self, content: str, cookie_name: str | None = None) -> Cookie: """添加用户 cookie""" from ..platform import site_manager - cookie_site = cast(type[CookieSite], site_manager[cls._site_name]) + cookie_site = cast(type[CookieSite], site_manager[self._site.name]) if not await cookie_site.validate_cookie(content): raise ValueError() - cookie = Cookie(site_name=cls._site_name, content=content) + cookie = Cookie(site_name=self._site.name, content=content) cookie.cookie_name = cookie_name if cookie_name else await cookie_site.get_cookie_name(content) cookie.cd = cookie_site.default_cookie_cd cookie_id = await config.add_cookie(cookie) @@ -106,7 +101,7 @@ class CookieClientManager(ClientManager): async def _choose_cookie(self, target: Target | None) -> Cookie: """选择 cookie 的具体算法""" - cookies = await config.get_cookie(self._site_name, target) + cookies = await config.get_cookie(self._site.name, target) cookies = (cookie for cookie in cookies if cookie.last_usage + cookie.cd < datetime.now()) cookie = min(cookies, key=lambda x: x.last_usage) return cookie @@ -116,9 +111,9 @@ class CookieClientManager(ClientManager): client = http_client() cookie = await self._choose_cookie(target) if cookie.is_universal: - logger.trace(f"平台 {self._site_name} 未获取到用户cookie, 使用匿名cookie") + logger.trace(f"平台 {self._site.name} 未获取到用户cookie, 使用匿名cookie") else: - logger.trace(f"平台 {self._site_name} 获取到用户cookie: {cookie.id}") + logger.trace(f"平台 {self._site.name} 获取到用户cookie: {cookie.id}") return await self._assemble_client(client, cookie) @@ -145,15 +140,6 @@ def is_cookie_client_manager(manger: type[ClientManager]) -> bool: return issubclass(manger, CookieClientManager) -def create_cookie_client_manager(site_name: str) -> type[CookieClientManager]: - """创建一个平台特化的 CookieClientManger""" - return type( - "CookieClientManager", - (CookieClientManager,), - {"_site_name": site_name}, - ) - - class Site(metaclass=RegistryMeta, base=True): schedule_type: Literal["date", "interval", "cron"] schedule_setting: dict