mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-06-02 09:26:12 +08:00
♻️ 更新部分方法使用 scheduler_dict 进行cookie操作
This commit is contained in:
parent
29c2eb456d
commit
32c237015f
@ -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(),
|
||||||
|
@ -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):
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user