mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-06-04 02:26:11 +08:00
✨ 导入导出支持 cookie
This commit is contained in:
parent
8742de6cd1
commit
5d160dcadc
@ -1,6 +1,6 @@
|
|||||||
"""nbesf is Nonebot Bison Enchangable Subscribes File!"""
|
"""nbesf is Nonebot Bison Enchangable Subscribes File!"""
|
||||||
|
|
||||||
from . import v1, v2
|
from . import v1, v2, v3
|
||||||
from .base import NBESFBase
|
from .base import NBESFBase
|
||||||
|
|
||||||
__all__ = ["v1", "v2", "NBESFBase"]
|
__all__ = ["v1", "v2", "v3", "NBESFBase"]
|
||||||
|
@ -11,6 +11,7 @@ from nonebot.compat import PYDANTIC_V2, ConfigDict, model_dump, type_validate_js
|
|||||||
from ..utils import NBESFParseErr
|
from ..utils import NBESFParseErr
|
||||||
from ....types import Tag, Category
|
from ....types import Tag, Category
|
||||||
from .base import NBESFBase, SubReceipt
|
from .base import NBESFBase, SubReceipt
|
||||||
|
from ...db_model import Cookie as DBCookie
|
||||||
from ...db_config import SubscribeDupException, config
|
from ...db_config import SubscribeDupException, config
|
||||||
|
|
||||||
# ===== nbesf 定义格式 ====== #
|
# ===== nbesf 定义格式 ====== #
|
||||||
@ -48,6 +49,18 @@ class SubPayload(BaseModel):
|
|||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
|
|
||||||
|
class Cookie(BaseModel):
|
||||||
|
"""Bison的魔法饼干"""
|
||||||
|
|
||||||
|
site_name: str
|
||||||
|
content: str
|
||||||
|
cookie_name: str
|
||||||
|
cd_milliseconds: int
|
||||||
|
is_universal: bool
|
||||||
|
tags: dict[str, str]
|
||||||
|
targets: list[Target]
|
||||||
|
|
||||||
|
|
||||||
class SubPack(BaseModel):
|
class SubPack(BaseModel):
|
||||||
"""Bison给指定用户派送的快递包"""
|
"""Bison给指定用户派送的快递包"""
|
||||||
|
|
||||||
@ -58,19 +71,21 @@ class SubPack(BaseModel):
|
|||||||
|
|
||||||
class SubGroup(NBESFBase):
|
class SubGroup(NBESFBase):
|
||||||
"""
|
"""
|
||||||
Bison的全部订单(按用户分组)
|
Bison的全部订单(按用户分组)和魔法饼干
|
||||||
|
|
||||||
结构参见`nbesf_model`下的对应版本
|
结构参见`nbesf_model`下的对应版本
|
||||||
"""
|
"""
|
||||||
|
|
||||||
version: int = NBESF_VERSION
|
version: int = NBESF_VERSION
|
||||||
groups: list[SubPack] = []
|
groups: list[SubPack] = []
|
||||||
|
cookies: list[Cookie] = []
|
||||||
|
|
||||||
|
|
||||||
# ======================= #
|
# ======================= #
|
||||||
|
|
||||||
|
|
||||||
async def subs_receipt_gen(nbesf_data: SubGroup):
|
async def subs_receipt_gen(nbesf_data: SubGroup):
|
||||||
|
logger.info("开始添加订阅流程")
|
||||||
for item in nbesf_data.groups:
|
for item in nbesf_data.groups:
|
||||||
sub_receipt = partial(SubReceipt, user=item.user_target)
|
sub_receipt = partial(SubReceipt, user=item.user_target)
|
||||||
|
|
||||||
@ -92,6 +107,27 @@ async def subs_receipt_gen(nbesf_data: SubGroup):
|
|||||||
logger.success(f"添加订阅条目 {repr(receipt)} 成功!")
|
logger.success(f"添加订阅条目 {repr(receipt)} 成功!")
|
||||||
|
|
||||||
|
|
||||||
|
async def magic_cookie_gen(nbesf_data: SubGroup):
|
||||||
|
logger.info("开始添加 Cookie 流程")
|
||||||
|
for cookie in nbesf_data.cookies:
|
||||||
|
try:
|
||||||
|
new_cookie = DBCookie(
|
||||||
|
site_name=cookie.site_name,
|
||||||
|
content=cookie.content,
|
||||||
|
cookie_name=cookie.cookie_name,
|
||||||
|
cd_milliseconds=cookie.cd_milliseconds,
|
||||||
|
is_universal=cookie.is_universal,
|
||||||
|
tags=cookie.tags,
|
||||||
|
)
|
||||||
|
cookie_id = await config.add_cookie(new_cookie)
|
||||||
|
for target in cookie.targets:
|
||||||
|
await config.add_cookie_target(target.target, target.platform_name, cookie_id)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"!添加 Cookie 条目 {repr(cookie)} 失败: {repr(e)}")
|
||||||
|
else:
|
||||||
|
logger.success(f"添加 Cookie 条目 {repr(cookie)} 成功!")
|
||||||
|
|
||||||
|
|
||||||
def nbesf_parser(raw_data: Any) -> SubGroup:
|
def nbesf_parser(raw_data: Any) -> SubGroup:
|
||||||
try:
|
try:
|
||||||
if isinstance(raw_data, str):
|
if isinstance(raw_data, str):
|
||||||
|
@ -11,11 +11,11 @@ from nonebot_plugin_datastore.db import create_session
|
|||||||
from sqlalchemy.orm.strategy_options import selectinload
|
from sqlalchemy.orm.strategy_options import selectinload
|
||||||
|
|
||||||
from .utils import NBESFVerMatchErr
|
from .utils import NBESFVerMatchErr
|
||||||
from ..db_model import User, Subscribe
|
from .nbesf_model import NBESFBase, v1, v2, v3
|
||||||
from .nbesf_model import NBESFBase, v1, v2
|
from ..db_model import User, Cookie, Target, Subscribe, CookieTarget
|
||||||
|
|
||||||
|
|
||||||
async def subscribes_export(selector: Callable[[Select], Select]) -> v2.SubGroup:
|
async def subscribes_export(selector: Callable[[Select], Select]) -> v3.SubGroup:
|
||||||
"""
|
"""
|
||||||
将Bison订阅导出为 Nonebot Bison Exchangable Subscribes File 标准格式的 SubGroup 类型数据
|
将Bison订阅导出为 Nonebot Bison Exchangable Subscribes File 标准格式的 SubGroup 类型数据
|
||||||
|
|
||||||
@ -34,22 +34,52 @@ async def subscribes_export(selector: Callable[[Select], Select]) -> v2.SubGroup
|
|||||||
user_stmt = cast(Select[tuple[User]], user_stmt)
|
user_stmt = cast(Select[tuple[User]], user_stmt)
|
||||||
user_data = await sess.scalars(user_stmt)
|
user_data = await sess.scalars(user_stmt)
|
||||||
|
|
||||||
groups: list[v2.SubPack] = []
|
groups: list[v3.SubPack] = []
|
||||||
user_id_sub_dict: dict[int, list[v2.SubPayload]] = defaultdict(list)
|
user_id_sub_dict: dict[int, list[v3.SubPayload]] = defaultdict(list)
|
||||||
|
|
||||||
for sub in sub_data:
|
for sub in sub_data:
|
||||||
sub_paylaod = type_validate_python(v2.SubPayload, sub)
|
sub_paylaod = type_validate_python(v3.SubPayload, sub)
|
||||||
user_id_sub_dict[sub.user_id].append(sub_paylaod)
|
user_id_sub_dict[sub.user_id].append(sub_paylaod)
|
||||||
|
|
||||||
for user in user_data:
|
for user in user_data:
|
||||||
assert isinstance(user, User)
|
assert isinstance(user, User)
|
||||||
sub_pack = v2.SubPack(
|
sub_pack = v3.SubPack(
|
||||||
user_target=PlatformTarget.deserialize(user.user_target),
|
user_target=PlatformTarget.deserialize(user.user_target),
|
||||||
subs=user_id_sub_dict[user.id],
|
subs=user_id_sub_dict[user.id],
|
||||||
)
|
)
|
||||||
groups.append(sub_pack)
|
groups.append(sub_pack)
|
||||||
|
|
||||||
sub_group = v2.SubGroup(groups=groups)
|
async with create_session() as sess:
|
||||||
|
cookie_target_stmt = (
|
||||||
|
select(CookieTarget)
|
||||||
|
.join(Cookie)
|
||||||
|
.join(Target)
|
||||||
|
.options(selectinload(CookieTarget.target))
|
||||||
|
.options(selectinload(CookieTarget.cookie))
|
||||||
|
)
|
||||||
|
cookie_target_data = await sess.scalars(cookie_target_stmt)
|
||||||
|
|
||||||
|
cookie_target_dict = defaultdict(list)
|
||||||
|
for cookie_target in cookie_target_data:
|
||||||
|
target_payload = type_validate_python(v3.Target, cookie_target.target)
|
||||||
|
cookie_target_dict[cookie_target.cookie].append(target_payload)
|
||||||
|
|
||||||
|
cookies: list[v3.Cookie] = []
|
||||||
|
for cookie, targets in cookie_target_dict.items():
|
||||||
|
assert isinstance(cookie, Cookie)
|
||||||
|
cookies.append(
|
||||||
|
v3.Cookie(
|
||||||
|
site_name=cookie.site_name,
|
||||||
|
content=cookie.content,
|
||||||
|
cookie_name=cookie.cookie_name,
|
||||||
|
cd_milliseconds=cookie.cd_milliseconds,
|
||||||
|
is_universal=cookie.is_universal,
|
||||||
|
tags=cookie.tags,
|
||||||
|
targets=targets,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
sub_group = v3.SubGroup(groups=groups, cookies=cookies)
|
||||||
|
|
||||||
return sub_group
|
return sub_group
|
||||||
|
|
||||||
@ -72,6 +102,10 @@ async def subscribes_import(
|
|||||||
case 2:
|
case 2:
|
||||||
assert isinstance(nbesf_data, v2.SubGroup)
|
assert isinstance(nbesf_data, v2.SubGroup)
|
||||||
await v2.subs_receipt_gen(nbesf_data)
|
await v2.subs_receipt_gen(nbesf_data)
|
||||||
|
case 3:
|
||||||
|
assert isinstance(nbesf_data, v3.SubGroup)
|
||||||
|
await v3.subs_receipt_gen(nbesf_data)
|
||||||
|
await v3.magic_cookie_gen(nbesf_data)
|
||||||
case _:
|
case _:
|
||||||
raise NBESFVerMatchErr(f"不支持的NBESF版本:{nbesf_data.version}")
|
raise NBESFVerMatchErr(f"不支持的NBESF版本:{nbesf_data.version}")
|
||||||
logger.info("订阅流程结束,请检查所有订阅记录是否全部添加成功")
|
logger.info("订阅流程结束,请检查所有订阅记录是否全部添加成功")
|
||||||
|
@ -11,7 +11,7 @@ from nonebot.log import logger
|
|||||||
from nonebot.compat import model_dump
|
from nonebot.compat import model_dump
|
||||||
|
|
||||||
from ..scheduler.manager import init_scheduler
|
from ..scheduler.manager import init_scheduler
|
||||||
from ..config.subs_io.nbesf_model import v1, v2
|
from ..config.subs_io.nbesf_model import v1, v2, v3
|
||||||
from ..config.subs_io import subscribes_export, subscribes_import
|
from ..config.subs_io import subscribes_export, subscribes_import
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -151,6 +151,8 @@ async def subs_import(path: str, format: str):
|
|||||||
nbesf_data = v1.nbesf_parser(import_items)
|
nbesf_data = v1.nbesf_parser(import_items)
|
||||||
case 2:
|
case 2:
|
||||||
nbesf_data = v2.nbesf_parser(import_items)
|
nbesf_data = v2.nbesf_parser(import_items)
|
||||||
|
case 3:
|
||||||
|
nbesf_data = v3.nbesf_parser(import_items)
|
||||||
case _:
|
case _:
|
||||||
raise NotImplementedError("不支持的NBESF版本")
|
raise NotImplementedError("不支持的NBESF版本")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user