mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-06-02 09:26:12 +08:00
✨ 根据数据库的修改对应的逻辑,同时移除多余的init_cookie和_check_cookie
This commit is contained in:
parent
af246df222
commit
16331b50d5
@ -1,3 +1,5 @@
|
||||
from typing import cast
|
||||
|
||||
from nonebot.log import logger
|
||||
|
||||
from ..utils import Site
|
||||
@ -7,7 +9,7 @@ from ..config.db_model import Target
|
||||
from ..types import Target as T_Target
|
||||
from ..platform import platform_manager
|
||||
from ..plugin_config import plugin_config
|
||||
from ..utils.site import is_cookie_client_manager
|
||||
from ..utils.site import CookieClientManager, is_cookie_client_manager
|
||||
|
||||
scheduler_dict: dict[type[Site], Scheduler] = {}
|
||||
|
||||
@ -32,7 +34,8 @@ async def init_scheduler():
|
||||
_schedule_class_platform_dict[site].append(platform_name)
|
||||
for site, target_list in _schedule_class_dict.items():
|
||||
if is_cookie_client_manager(site.client_mgr):
|
||||
await site.client_mgr.refresh_universal_cookie()
|
||||
client_mgr = cast(CookieClientManager, site.client_mgr)
|
||||
await client_mgr.refresh_anonymous_cookie()
|
||||
if not plugin_config.bison_use_browser and site.require_browser:
|
||||
logger.warning(f"{site.name} requires browser, it will not schedule.")
|
||||
continue
|
||||
|
@ -5,8 +5,6 @@ from nonebot.matcher import Matcher
|
||||
from nonebot.params import Arg, ArgPlainText
|
||||
from nonebot.adapters import Message, MessageTemplate
|
||||
|
||||
from ..config import config
|
||||
from ..config.db_model import Cookie
|
||||
from ..platform import platform_manager
|
||||
from .utils import common_platform, gen_handle_cancel
|
||||
from ..utils.site import CookieClientManager, is_cookie_client_manager
|
||||
@ -64,10 +62,8 @@ def do_add_cookie(add_cookie: type[Matcher]):
|
||||
|
||||
@add_cookie.handle()
|
||||
async def add_cookie_process(state: T_State):
|
||||
cookie = Cookie(site_name=state["site"].name, content=state["cookie"])
|
||||
client_mgr = cast(CookieClientManager, platform_manager[state["platform"]].site.client_mgr)
|
||||
cookie = await client_mgr.init_cookie(cookie)
|
||||
await config.add_cookie(cookie)
|
||||
await client_mgr.add_user_cookie(state["cookie"])
|
||||
await add_cookie.finish(
|
||||
f"已添加 Cookie: {state['cookie']} 到平台 {state['platform']}" + "\n请使用“关联cookie”为 Cookie 关联订阅"
|
||||
)
|
||||
|
@ -44,26 +44,27 @@ class DefaultClientManager(ClientManager):
|
||||
|
||||
class CookieClientManager(ClientManager):
|
||||
_site_name: str
|
||||
_cookie_cd: int = 10
|
||||
_default_cd: int = timedelta(seconds=10)
|
||||
|
||||
@classmethod
|
||||
async def refresh_universal_cookie(cls):
|
||||
async def refresh_anonymous_cookie(cls):
|
||||
"""移除已有的匿名cookie,添加一个新的匿名cookie"""
|
||||
universal_cookies = await config.get_unviersal_cookie(cls._site_name)
|
||||
universal_cookie = Cookie(site_name=cls._site_name, content="{}", is_universal=True, tags={"temporary": True})
|
||||
for cookie in universal_cookies:
|
||||
if not cookie.tags.get("temporary"):
|
||||
anonymous_cookies = await config.get_unviersal_cookie(cls._site_name)
|
||||
anonymous_cookie = Cookie(site_name=cls._site_name, content="{}", is_universal=True, is_anonymous=True)
|
||||
for cookie in anonymous_cookies:
|
||||
if not cookie.is_anonymous:
|
||||
continue
|
||||
await config.delete_cookie_by_id(cookie.id)
|
||||
universal_cookie.id = cookie.id # 保持原有的id
|
||||
await config.add_cookie(universal_cookie)
|
||||
anonymous_cookie.id = cookie.id # 保持原有的id
|
||||
anonymous_cookie.last_usage = datetime.now() # 使得第一次请求优先使用用户 cookie
|
||||
await config.add_cookie(anonymous_cookie)
|
||||
|
||||
@classmethod
|
||||
async def init_cookie(cls, cookie: Cookie) -> Cookie:
|
||||
"""初始化 cookie,添加用户 cookie 时使用"""
|
||||
cookie.cd = cls._cookie_cd
|
||||
cookie.last_usage = datetime.now() # 使得优先使用用户 cookie
|
||||
return cookie
|
||||
async def add_user_cookie(cls, content: str):
|
||||
"""添加用户 cookie"""
|
||||
cookie = Cookie(site_name=cls._site_name, content=content)
|
||||
cookie.cd = cls._default_cd
|
||||
config.add_cookie(cookie)
|
||||
|
||||
@classmethod
|
||||
async def validate_cookie(cls, content: str) -> bool:
|
||||
@ -103,14 +104,10 @@ class CookieClientManager(ClientManager):
|
||||
cookies = await config.get_universal_cookie(self._site_name)
|
||||
if target:
|
||||
cookies += await config.get_cookie(self._site_name, target)
|
||||
cookies = (cookie for cookie in cookies if cookie.last_usage + timedelta(seconds=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)
|
||||
return cookie
|
||||
|
||||
async def _check_cookie(self, cookie: Cookie) -> Cookie:
|
||||
"""检查Cookie,可以做一些自定义的逻辑,比如说Site的统一风控"""
|
||||
return cookie
|
||||
|
||||
async def get_client(self, target: Target | None) -> AsyncClient:
|
||||
"""获取 client,根据 target 选择 cookie"""
|
||||
client = http_client()
|
||||
|
Loading…
x
Reference in New Issue
Block a user