♻️ 更新部分方法使用 scheduler_dict 进行cookie操作

This commit is contained in:
suyiiyii 2024-10-29 14:15:15 +08:00
parent 29c2eb456d
commit 32c237015f
Signed by: suyiiyii
GPG Key ID: 044704CB29B8AD85
4 changed files with 22 additions and 36 deletions

View File

@ -47,12 +47,12 @@ class BilibiliClientManager(CookieClientManager):
@classmethod @classmethod
@override @override
async def _generate_anonymous_cookie(cls) -> CookieModel: async def _generate_anonymous_cookie(self) -> CookieModel:
cookies = await cls._get_cookies() cookies = await self._get_cookies()
cookie = CookieModel( cookie = CookieModel(
cookie_name=f"{cls._site_name} anonymous", cookie_name=f"{self._site_name} anonymous",
site_name=cls._site_name, site_name=self._site_name,
content=json.dumps(cls._gen_json_cookie(cookies)), content=json.dumps(self._gen_json_cookie(cookies)),
is_universal=True, is_universal=True,
is_anonymous=True, is_anonymous=True,
last_usage=datetime.now(), last_usage=datetime.now(),

View File

@ -10,14 +10,14 @@ from ..post import Post
from .platform import NewMessage from .platform import NewMessage
from ..types import Target, RawPost from ..types import Target, RawPost
from ..utils import text_similarity from ..utils import text_similarity
from ..utils.site import CookieSite, create_cookie_client_manager from ..utils.site import CookieSite, CookieClientManager
class RssSite(CookieSite): class RssSite(CookieSite):
name = "rss" name = "rss"
schedule_type = "interval" schedule_type = "interval"
schedule_setting = {"seconds": 30} schedule_setting = {"seconds": 30}
client_mgr = create_cookie_client_manager("rss") client_mgr = CookieClientManager
class RssPost(Post): class RssPost(Post):

View File

@ -13,8 +13,8 @@ from bs4 import BeautifulSoup as bs
from ..post import Post from ..post import Post
from .platform import NewMessage from .platform import NewMessage
from ..utils import http_client, text_fletten from ..utils import http_client, text_fletten
from ..utils.site import CookieSite, CookieClientManager
from ..types import Tag, Target, RawPost, ApiError, Category from ..types import Tag, Target, RawPost, ApiError, Category
from ..utils.site import CookieSite, create_cookie_client_manager
_HEADER = { _HEADER = {
"accept": ( "accept": (
@ -40,7 +40,7 @@ class WeiboSite(CookieSite):
name = "weibo.com" name = "weibo.com"
schedule_type = "interval" schedule_type = "interval"
schedule_setting = {"seconds": 3} schedule_setting = {"seconds": 3}
client_mgr = create_cookie_client_manager(name) client_mgr = CookieClientManager
default_cookie_cd: int = timedelta(seconds=15) default_cookie_cd: int = timedelta(seconds=15)
@classmethod @classmethod

View File

@ -43,16 +43,13 @@ class DefaultClientManager(ClientManager):
class CookieClientManager(ClientManager): class CookieClientManager(ClientManager):
_site_name: str # 绑定的 site_name需要使用 create_cookie_client_manager 创建 Client_mgr 时绑定
def __init__(self, site: "Site") -> None: def __init__(self, site: "Site") -> None:
self._site = site self._site = site
@classmethod async def _generate_anonymous_cookie(self) -> Cookie:
async def _generate_anonymous_cookie(cls) -> Cookie:
return Cookie( return Cookie(
cookie_name=f"{cls._site_name} anonymous", cookie_name=f"{self._site.name} anonymous",
site_name=cls._site_name, site_name=self._site.name,
content="{}", content="{}",
is_universal=True, is_universal=True,
is_anonymous=True, is_anonymous=True,
@ -62,28 +59,26 @@ class CookieClientManager(ClientManager):
status="", status="",
) )
@classmethod async def _refresh_anonymous_cookie(self):
async def _refresh_anonymous_cookie(cls):
"""更新已有的匿名cookie若不存在则添加""" """更新已有的匿名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: if existing_anonymous_cookies:
for cookie in 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 new_anonymous_cookie.id = cookie.id # 保持原有的id
await config.update_cookie(new_anonymous_cookie) await config.update_cookie(new_anonymous_cookie)
else: else:
new_anonymous_cookie = await cls._generate_anonymous_cookie() new_anonymous_cookie = await self._generate_anonymous_cookie()
await config.add_cookie(new_anonymous_cookie) await config.add_cookie(new_anonymous_cookie)
@classmethod async def add_user_cookie(self, content: str, cookie_name: str | None = None) -> Cookie:
async def add_user_cookie(cls, content: str, cookie_name: str | None = None) -> Cookie:
"""添加用户 cookie""" """添加用户 cookie"""
from ..platform import site_manager 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): if not await cookie_site.validate_cookie(content):
raise ValueError() 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.cookie_name = cookie_name if cookie_name else await cookie_site.get_cookie_name(content)
cookie.cd = cookie_site.default_cookie_cd cookie.cd = cookie_site.default_cookie_cd
cookie_id = await config.add_cookie(cookie) cookie_id = await config.add_cookie(cookie)
@ -106,7 +101,7 @@ class CookieClientManager(ClientManager):
async def _choose_cookie(self, target: Target | None) -> Cookie: async def _choose_cookie(self, target: Target | None) -> Cookie:
"""选择 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()) cookies = (cookie for cookie in cookies if cookie.last_usage + cookie.cd < datetime.now())
cookie = min(cookies, key=lambda x: x.last_usage) cookie = min(cookies, key=lambda x: x.last_usage)
return cookie return cookie
@ -116,9 +111,9 @@ class CookieClientManager(ClientManager):
client = http_client() client = http_client()
cookie = await self._choose_cookie(target) cookie = await self._choose_cookie(target)
if cookie.is_universal: if cookie.is_universal:
logger.trace(f"平台 {self._site_name} 未获取到用户cookie, 使用匿名cookie") logger.trace(f"平台 {self._site.name} 未获取到用户cookie, 使用匿名cookie")
else: 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) return await self._assemble_client(client, cookie)
@ -145,15 +140,6 @@ def is_cookie_client_manager(manger: type[ClientManager]) -> bool:
return issubclass(manger, CookieClientManager) 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): class Site(metaclass=RegistryMeta, base=True):
schedule_type: Literal["date", "interval", "cron"] schedule_type: Literal["date", "interval", "cron"]
schedule_setting: dict schedule_setting: dict