适配小刻食堂平台 (#379)

* 🐛 插入新的Schedulable时应传入use_batch参数

*  适配ceobecanteen平台

Co-authored-by: phidiaLam <2957035701@qq.com>

*   明日方舟公告与官网采用截图分享 (#480)

*  明日方舟公告与官网采用截图分享

* 💄 auto fix by pre-commit hooks

* 🐛 修复缺少的导入,优化逻辑

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Azide <rukuy@qq.com>

* 🐛 优化截图图片效果

* 🐛 修复错误将转发内图片视作头图的问题

* 🍱 使用正式 Bison Logo

* 💄 auto fix by pre-commit hooks

* 🐛 请求小刻API时不在headers里添加过多字段

* 🐛 get_comb_id方法删除无用的targets参数

* 💡 get_comb_id方法更新注释

* 🔥 移除发送部分的更改

*  在命名中明确表示cond_func意图

* ♻️ 拆分get_comb_id功能

* ♻️ 调整缓存逻辑

*  使用uri在theme中调用platform截图

* ♻️ 重构截图逻辑

*  添加模糊匹配提示

*  适配新版Site

* 💄 auto fix by pre-commit hooks

* 🐛 去掉不必要的排序

* 🐛 修正不应出现的驼峰变量名

* ♻️ 按review意见修改

* ♻️ 调整截图函数逻辑

* 🔊 调低日志等级

* ✏️ 修复一些拼写和格式

---------

Co-authored-by: phidiaLam <2957035701@qq.com>
Co-authored-by: 洛梧藤 <67498817+phidiaLam@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Azide 2024-07-13 01:06:42 +08:00 committed by GitHub
parent 4eb7a17306
commit e2a97a9e56
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 3290 additions and 270 deletions

View File

@ -1,12 +1,13 @@
import random import random
import string import string
from datetime import timedelta
from expiringdict import ExpiringDict from expiringdictx import ExpiringDict
class TokenManager: class TokenManager:
def __init__(self): def __init__(self):
self.token_manager = ExpiringDict(max_len=100, max_age_seconds=60 * 10) self.token_manager = ExpiringDict[str, tuple](capacity=100, default_age=timedelta(minutes=10))
def get_user(self, token: str) -> tuple | None: def get_user(self, token: str) -> tuple | None:
res = self.token_manager.get(token) res = self.token_manager.get(token)

View File

@ -0,0 +1 @@
from .platform import CeobeCanteen as CeobeCanteen

View File

@ -0,0 +1,119 @@
from typing import TypeAlias
from functools import partial
from datetime import timedelta
from types import MappingProxyType
from collections.abc import Callable
from httpx import AsyncClient, AsyncHTTPTransport
from expiringdictx import SimpleCache, ExpiringDict
from hishel import Controller, AsyncCacheTransport, AsyncInMemoryStorage
from .const import DATASOURCE_URL
from .utils import process_response
from .models import CeobeSource, CeobeTarget, DataSourceResponse
cache_transport = AsyncCacheTransport(
AsyncHTTPTransport(),
storage=AsyncInMemoryStorage(),
controller=Controller(
always_revalidate=True,
),
)
CeobeClient = partial(
AsyncClient,
transport=cache_transport,
)
UniqueId: TypeAlias = str
class CeobeCache:
# 不在 __init__ 中初始化,让多个实例共享一个缓存
_cache = SimpleCache()
def __init__(self, lifetime: timedelta, store_key: str | None = None):
self.store_key = store_key
self.lifetime = lifetime
def __set_name__(self, owner, name: str):
self.key = self.store_key or name
def __get__(self, instance, owner):
return self._cache.get(self.key)
def __set__(self, instance, value):
self._cache[self.key, self.lifetime] = value
class CeobeDataSourceCache:
"""数据源缓存, 以unique_id为key存储数据源"""
def __init__(self):
self._cache = ExpiringDict[UniqueId, CeobeTarget](capacity=100, default_age=timedelta(days=1))
self.client = CeobeClient()
self.url = DATASOURCE_URL
@property
def cache(self) -> MappingProxyType[str, CeobeTarget]:
return MappingProxyType(self._cache)
async def refresh_data_sources(self) -> MappingProxyType[UniqueId, CeobeTarget]:
"""请求数据源API刷新缓存"""
data_sources_resp = await self.client.get(self.url)
data_sources = process_response(data_sources_resp, DataSourceResponse).data
for ds in data_sources:
self._cache[ds.unique_id] = ds
return self.cache
async def get_all(self, force_refresh: bool = False) -> MappingProxyType[UniqueId, CeobeTarget]:
"""获取所有数据源, 如果缓存为空则尝试刷新缓存"""
if not self.cache or force_refresh:
await self.refresh_data_sources()
return self.cache
def select_one(self, cond_func: Callable[[CeobeTarget], bool]) -> CeobeTarget | None:
"""根据条件获取数据源
不会刷新缓存
"""
cache = self._cache.values()
return next(filter(cond_func, cache), None)
async def get_by_unique_id(self, unique_id: str) -> CeobeTarget | None:
"""根据unique_id获取数据源
如果在缓存中找不到会刷新缓存
"""
if target := self._cache.get(unique_id):
return target
await self.refresh_data_sources()
return self._cache.get(unique_id)
async def get_by_nickname(self, nickname: str) -> CeobeTarget | None:
"""根据nickname获取数据源
如果在缓存中找不到会刷新缓存
"""
def select_by_nickname(target: CeobeTarget):
return target.nickname == nickname
if target := self.select_one(select_by_nickname):
return target
await self.refresh_data_sources()
return self.select_one(select_by_nickname)
async def get_by_source(self, source: CeobeSource) -> CeobeTarget | None:
"""根据source获取数据源
如果在缓存中找不到会刷新缓存
"""
def select_by_source(target: CeobeTarget):
return target.db_unique_key == source.data and target.datasource == source.type
if target := self.select_one(select_by_source):
return target
await self.refresh_data_sources()
return self.select_one(select_by_source)

View File

@ -0,0 +1,4 @@
DATASOURCE_URL = "https://server.ceobecanteen.top/api/v1/canteen/config/datasource/list"
COMB_ID_URL = "https://server.ceobecanteen.top/api/v1/canteen/user/getDatasourceComb"
COOKIE_ID_URL = "http://cdn.ceobecanteen.top/datasource-comb"
COOKIES_URL = "https://server-cdn.ceobecanteen.top/api/v1/cdn/cookie/mainList/cookieList"

View File

@ -0,0 +1,10 @@
class CeobeResponseError(Exception): ...
class CeobeSnapshotException(Exception): ...
class CeobeSnapshotSkip(CeobeSnapshotException): ...
class CeobeSnapshotFailed(CeobeSnapshotException): ...

View File

@ -0,0 +1,127 @@
from typing import Literal, TypeVar, NamedTuple
from pydantic import BaseModel
class CeobeTextPic(NamedTuple):
text: str
pics: list[bytes | str]
class CeobeTarget(BaseModel):
"""账户结构"""
avatar: str
"""数据源头像"""
datasource: str
"""数据源类型"""
db_unique_key: str
"""数据源相关唯一id"""
nickname: str
"""数据源昵称"""
platform: str
"""平台代码"""
unique_id: str
"""数据源唯一标识(用于前后端交互标识)"""
jump_url: str | None = None
"""跳转urlnull就是没办法跳转"""
class DataSourceResponse(BaseModel):
code: int
message: str
data: list[CeobeTarget]
class CeobeImage(BaseModel):
origin_url: str
"""原图"""
compress_url: str | None = None
"""压缩图为null就是没有原图对应压缩图"""
class CeobeDefaultCookie(BaseModel):
text: str
images: list[CeobeImage] | None
class CeobeRetweeted(BaseModel):
author_name: str
author_avatar: str
text: str
images: list[CeobeImage] | None = None
class CeobeItem(BaseModel):
id: str
"""单条id"""
url: str
"""跳转链接"""
type: str | None = None
"""类型"""
is_long_text: bool | None = None
"""是否长文"""
is_retweeted: bool = False
"""是否转发"""
retweeted: CeobeRetweeted | None = None
"""展示类型,公告类型的数据源有这个字段"""
display_type: int | None = None
class Config:
extra = "allow"
class CeobeSource(BaseModel):
data: str
"""数据源id"""
type: str
"""数据源类型"""
class CeobeTimestamp(BaseModel):
fetcher: int
"""蹲饼时间,毫秒"""
platform_precision: Literal["none", "day", "hour", "minute", "second", "ms"]
"""平台时间精度不足的长度补0"""
platform: int | None = None
"""平台时间戳,毫秒"""
class CeobeCookie(BaseModel):
datasource: str
"""数据源名字"""
icon: str
"""数据源头像"""
timestamp: CeobeTimestamp
"""时间戳"""
default_cookie: CeobeDefaultCookie
"""原始饼"""
item: CeobeItem
"""数据源信息,有平台的特殊字段"""
source: CeobeSource
"""数据源"""
class CeobeData(BaseModel):
cookies: list[CeobeCookie]
next_page_id: str | None = None
class CookiesResponse(BaseModel):
code: int
message: str
data: CeobeData
class CombIdResponse(BaseModel):
code: int
message: str
data: dict[Literal["datasource_comb_id"], str]
class CookieIdResponse(BaseModel):
cookie_id: str
update_cookie_id: str
ResponseModel = TypeVar("ResponseModel", bound=CookiesResponse | CombIdResponse | CookieIdResponse | DataSourceResponse)

View File

@ -0,0 +1,324 @@
from typing import ParamSpec
from functools import partial
from datetime import timedelta
from collections import defaultdict
from httpx import AsyncClient
from nonebot import logger, require
from rapidfuzz import fuzz, process
from nonebot_bison.post import Post
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.types import Target, RawPost, Category
from nonebot_bison.utils import Site, ClientManager, capture_html
from ..platform import NewMessage
from .utils import process_response
from .const import COMB_ID_URL, COOKIES_URL, COOKIE_ID_URL
from .exception import CeobeSnapshotSkip, CeobeSnapshotFailed
from .cache import CeobeCache, CeobeClient, CeobeDataSourceCache
from .models import CeobeImage, CeobeCookie, CeobeTextPic, CombIdResponse, CookiesResponse, CookieIdResponse
P = ParamSpec("P")
class CeobeCanteenClientManager(ClientManager):
_client: AsyncClient
def __init__(self):
self._client = CeobeClient(
headers={
"User-Agent": "MountainDash/Nonebot-Bison",
}
)
async def get_client(self, target: Target | None) -> AsyncClient:
return self._client
async def get_client_for_static(self) -> AsyncClient:
return self._client
async def get_query_name_client(self) -> AsyncClient:
return self._client
async def refresh_client(self):
raise NotImplementedError("refresh_client is not implemented")
class CeobeCanteenSite(Site):
name = "ceobe_canteen"
schedule_type = "interval"
# lwt の 推荐间隔
schedule_setting = {"seconds": 15}
client_mgr = CeobeCanteenClientManager
class CeobeCanteen(NewMessage):
enable_tag: bool = False
platform_name: str = "ceobecanteen"
name: str = "小刻食堂"
enabled: bool = True
is_common: bool = False
site = CeobeCanteenSite
has_target: bool = True
use_batch: bool = True
default_theme: str = "ceobecanteen"
categories: dict[Category, str] = {1: "普通", 2: "转发"}
data_source_cache = CeobeDataSourceCache()
comb_id = CeobeCache(timedelta(hours=12))
cookie_id = CeobeCache(timedelta(hours=1))
cookies = CeobeCache(timedelta(hours=1))
async def get_comb_id(self, target_uuids: list[str]):
"""获取数据源的组合id"""
payload = {"datasource_push": target_uuids}
logger.trace(payload)
client = await self.ctx.get_client()
resp = await client.post(
COMB_ID_URL,
json=payload,
)
comb_id = process_response(resp, CombIdResponse).data["datasource_comb_id"]
logger.trace(f"get comb_id: {comb_id}")
return comb_id
async def get_comb_id_of_all(self):
"""获取 "全部数据源" 的组合id获取到的comb_id会缓存12小时"""
logger.trace("no comb_id, request")
target_uuids = (await self.data_source_cache.get_all()).keys()
comb_id = await self.get_comb_id(list(target_uuids))
logger.trace(f"use comb_id: {comb_id}")
return comb_id
async def get_latest_cookie_id(self, comb_id: str):
"""根据comb_id获取最新cookie_id"""
client = await self.ctx.get_client()
resp = await client.get(f"{COOKIE_ID_URL}/{comb_id}")
cookie_id = process_response(resp, CookieIdResponse).cookie_id
logger.trace(f"get cookie_id: {cookie_id}")
return cookie_id
async def get_cookies(self, cookie_id: str, comb_id: str | None = None):
"""根据cookie_id、comb_id组合获取cookies"""
client = await self.ctx.get_client()
parmas = {
"datasource_comb_id": comb_id,
"cookie_id": cookie_id,
}
logger.trace(f"will reuquest: {parmas}")
resp = await client.get(COOKIES_URL, params=parmas)
return process_response(resp, CookiesResponse).data.cookies
async def fetch_ceobe_cookies(self) -> list[CeobeCookie]:
if not self.comb_id:
self.comb_id = await self.get_comb_id_of_all()
latest_cookie_id = await self.get_latest_cookie_id(self.comb_id)
if not latest_cookie_id:
return []
if latest_cookie_id != self.cookie_id:
self.cookie_id = latest_cookie_id
self.cookies = await self.get_cookies(latest_cookie_id, self.comb_id)
return self.cookies or []
async def batch_get_sub_list(self, targets: list[Target]) -> list[list[CeobeCookie]]:
cookies = await self.fetch_ceobe_cookies()
dispatched_cookies: defaultdict[Target, list[CeobeCookie]] = defaultdict(list)
for cookie in cookies:
if ceobe_target := await self.data_source_cache.get_by_source(cookie.source):
dispatched_cookies[Target(ceobe_target.unique_id)].append(cookie)
return [dispatched_cookies[target] for target in targets]
@classmethod
async def get_target_name(cls, _, uuid_target: Target) -> str:
ceobe_target = await cls.data_source_cache.get_by_unique_id(uuid_target)
return ceobe_target.nickname if ceobe_target else "UNKNOWN"
@classmethod
async def parse_target(cls, nickname: str) -> Target:
ceobe_target = await cls.data_source_cache.get_by_nickname(nickname)
if not ceobe_target:
all_targets_name = [target.nickname for target in (await cls.data_source_cache.get_all()).values()]
matched_targets_name = process.extract(nickname, all_targets_name, scorer=fuzz.token_sort_ratio, limit=3)
logger.debug(f"possible targets: {matched_targets_name}")
raise cls.ParseTargetException(
prompt="未能匹配到对应的小刻食堂数据源,可能的选择有: \n"
+ "\n".join([name for name, *_ in matched_targets_name])
+ f"\n\n请检查原输入是否正确: {nickname}"
)
return Target(ceobe_target.unique_id)
def get_tags(self, _: RawPost) -> None:
return
def get_category(self, post: CeobeCookie) -> Category:
if post.item.is_retweeted:
return Category(2)
return Category(1)
def get_id(self, post: CeobeCookie) -> str:
return post.item.id
def get_date(self, post: CeobeCookie) -> int:
return post.timestamp.fetcher
async def parse(self, raw_post: CeobeCookie) -> Post:
target = await self.data_source_cache.get_by_source(raw_post.source)
assert target, "target not found"
content, pics = await self.take_snapshot(raw_post)
timestamp = raw_post.timestamp.platform or raw_post.timestamp.fetcher
if timestamp:
timestamp /= 1000 # 从毫秒级转换到秒级
retweet: Post | None = None
if raw_post.item.is_retweeted and raw_post.item.retweeted:
raw_retweet_pics = raw_post.item.retweeted.images or []
retweet_pics = await self.parse_retweet_images(raw_retweet_pics, raw_post.source.type)
retweet = Post(
self,
nickname=raw_post.item.retweeted.author_name,
avatar=raw_post.item.retweeted.author_avatar,
images=list(retweet_pics),
content=raw_post.item.retweeted.text,
)
return Post(
self,
content,
url=raw_post.item.url,
nickname=raw_post.datasource,
images=list(pics),
timestamp=timestamp,
avatar=target.avatar,
description=target.platform,
repost=retweet,
)
async def snapshot_official_website(self, url: str) -> bytes:
"""截取小刻官网的截图"""
require("nonebot_plugin_htmlrender")
from nonebot_plugin_htmlrender import get_new_page
logger.debug(f"snapshot official website url: {url}")
# /html/body/div[1]/div[1]/div/div[1]/div[1]/div
snapshot_selector = "html > body > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(1) > div:nth-child(1) > div" # noqa: E501
# /html/body/div[1]/div[1]/div/div[1]/div[1]/div/div[4]/div/div/div
calculate_selector = "html > body > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(4) > div > div > div" # noqa: E501
viewport = {"width": 1024, "height": 19990}
try:
async with get_new_page(viewport=viewport) as page:
await page.goto(url, wait_until="networkidle")
element_width = await page.evaluate(
"(selector) => document.querySelector(selector).offsetWidth", calculate_selector
)
logger.debug(f"element width: {element_width}")
element_height = await page.evaluate(
"(selector) => document.querySelector(selector).offsetHeight", calculate_selector
)
logger.debug(f"element height: {element_height}")
element_height += 1000
await page.set_viewport_size({"width": 1024, "height": element_height})
element = await page.locator(snapshot_selector).element_handle()
# add padding to make the screenshot more beautiful
await element.evaluate("(element) => {element.style.padding = '20px';}", element)
pic_data = await element.screenshot(
type="png",
)
except Exception as e:
raise CeobeSnapshotFailed("渲染错误") from e
else:
return pic_data
async def snapshot_bulletin_list(self, url: str) -> bytes:
"""截取小刻公告列表的截图"""
selector = "body > div.main > div.container"
viewport = {"width": 1024, "height": 19990}
try:
pic_data = await capture_html(
url,
selector,
timeout=30000,
wait_until="networkidle",
viewport=viewport,
)
assert pic_data
except Exception:
raise CeobeSnapshotFailed("渲染错误")
else:
return pic_data
async def take_snapshot(
self,
raw_post: CeobeCookie,
) -> CeobeTextPic:
"""判断数据源类型,判断是否需要截图"""
match raw_post.source.type:
case "arknights-website:official-website":
async def owss(url: str) -> CeobeTextPic:
return CeobeTextPic(text="", pics=[await self.snapshot_official_website(url)])
snapshot_func = partial(owss, raw_post.item.url)
case "arknights-game:bulletin-list" if raw_post.item.display_type != 2:
async def blss(url: str) -> CeobeTextPic:
return CeobeTextPic(text="", pics=[await self.snapshot_bulletin_list(url)])
snapshot_func = partial(blss, raw_post.item.url)
case _:
async def npss() -> CeobeTextPic:
raise CeobeSnapshotSkip("无需截图的数据源")
snapshot_func = partial(npss)
raw_pics = raw_post.default_cookie.images or []
try:
if not plugin_config.bison_use_browser:
raise CeobeSnapshotSkip("未启用浏览器")
res = await snapshot_func()
except CeobeSnapshotSkip as e:
logger.info(f"skip snapshot: {e}")
pics = await self.parse_retweet_images(raw_pics, raw_post.source.type)
res = CeobeTextPic(text=raw_post.default_cookie.text, pics=list(pics))
except CeobeSnapshotFailed:
logger.exception("snapshot failed")
pics = await self.parse_retweet_images(raw_pics, raw_post.source.type)
res = CeobeTextPic(text=raw_post.default_cookie.text, pics=list(pics))
return res
async def parse_retweet_images(self, images: list[CeobeImage], source_type: str) -> list[bytes] | list[str]:
if source_type.startswith("weibo"):
retweet_pics = await self.download_weibo_image([image.origin_url for image in images])
else:
retweet_pics = [image.origin_url for image in images]
return retweet_pics
async def download_weibo_image(self, image_urls: list[str]) -> list[bytes]:
headers = {"referer": "https://weibo.cn/"}
pics = []
async with CeobeClient(headers=headers) as client:
for url in image_urls:
resp = await client.get(url)
resp.raise_for_status()
pics.append(resp.content)
return pics

View File

@ -0,0 +1,20 @@
from httpx import Response
from nonebot import logger
from nonebot.compat import type_validate_python
from .exception import CeobeResponseError
from .models import ResponseModel, CookieIdResponse
def process_response(response: Response, parse_model: type[ResponseModel]) -> ResponseModel:
response.raise_for_status()
logger.trace(f"小刻食堂请求结果: {response.json().get('message')} {parse_model=}")
try:
data = type_validate_python(parse_model, response.json())
except Exception as e:
raise CeobeResponseError(f"解析小刻食堂响应失败: {e}")
if not isinstance(data, CookieIdResponse) and data.code != 0:
raise CeobeResponseError(f"获取饼数据失败: {data.message}")
return data

View File

@ -31,8 +31,8 @@ class Post(AbstractPost):
"""标题""" """标题"""
images: list[str | bytes | Path | BytesIO] | None = None images: list[str | bytes | Path | BytesIO] | None = None
"""图片列表""" """图片列表"""
timestamp: int | None = None timestamp: float | None = None
"""发布/获取时间戳""" """发布/获取时间戳, 秒"""
url: str | None = None url: str | None = None
"""来源链接""" """来源链接"""
avatar: str | bytes | Path | BytesIO | None = None avatar: str | bytes | Path | BytesIO | None = None

View File

@ -1,9 +1,12 @@
from io import BytesIO
from pathlib import Path from pathlib import Path
from dataclasses import dataclass from dataclasses import dataclass
from typing import TYPE_CHECKING, Literal from typing import TYPE_CHECKING, Literal
from nonebot_plugin_saa import Text, Image, MessageSegmentFactory from nonebot_plugin_saa import Text, Image, MessageSegmentFactory
from nonebot_bison.utils import text_fletten
from nonebot_bison.theme.utils import web_embed_image
from nonebot_bison.theme import Theme, ThemeRenderError, ThemeRenderUnsupportError from nonebot_bison.theme import Theme, ThemeRenderError, ThemeRenderUnsupportError
if TYPE_CHECKING: if TYPE_CHECKING:
@ -34,16 +37,21 @@ class ArknightsTheme(Theme):
if not post.title: if not post.title:
raise ThemeRenderUnsupportError("标题为空") raise ThemeRenderUnsupportError("标题为空")
if post.images and len(post.images) > 1:
raise ThemeRenderUnsupportError("图片数量大于1")
banner = post.images[0] if post.images else None banner = post.images[0] if post.images else None
if banner is not None and not isinstance(banner, str | Path): match banner:
raise ThemeRenderUnsupportError(f"图片类型错误, 期望 str 或 Path, 实际为 {type(banner)}") case bytes() | BytesIO():
banner = web_embed_image(banner)
case str() | Path() | None:
pass
case _:
raise ThemeRenderUnsupportError(
f"图片类型错误, 期望 str | Path | bytes | BytesIO | None, 实际为 {type(banner)}"
)
ark_data = ArkData( ark_data = ArkData(
announce_title=post.title, announce_title=text_fletten(post.title),
content=post.content, content=post.content,
banner_image_url=banner, banner_image_url=banner,
) )
@ -64,6 +72,10 @@ class ArknightsTheme(Theme):
raise ThemeRenderError(f"渲染文本失败: {e}") raise ThemeRenderError(f"渲染文本失败: {e}")
msgs: list[MessageSegmentFactory] = [] msgs: list[MessageSegmentFactory] = []
msgs.append(Image(announce_pic)) msgs.append(Image(announce_pic))
if post.url: if post.url:
msgs.append(Text(f"前往:{post.url}")) msgs.append(Text(f"前往:{post.url}"))
return [Image(announce_pic)] if post.images:
msgs.extend(Image(img) for img in post.images[1:])
return msgs

View File

@ -3,8 +3,12 @@
## LOGO图片 ## LOGO图片
- `templates/ceobecanteen_logo.png` - `templates/ceobecanteen_logo.png`
- `templates/bison_logo.png`
### 版权声明 ### 版权声明
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />logo图片采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。 <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />所声明的 LOGO 图片采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。
本项目<img src="templates/ceobecanteen_logo.png" style="width:100px">使用已经过 [Ceobe Canteen](https://github.com/Enraged-Dun-Cookie-Development-Team) 授权许可使用。
本项目使用的 小刻食堂 LOGO <img src="templates/ceobecanteen_logo.png" alt="ceobecanteen-logo" style="width:100px">已经过 [小刻食堂](https://github.com/Enraged-Dun-Cookie-Development-Team) 授权许可使用。
本项目使用的 Nonebot-Bison LOGO <img src="templates/bison_logo.png" alt="nonebot-bison-logo" style="width:100px">由画师 不画涩图の企鹅 倾情贡献,非常感谢!

View File

@ -4,12 +4,15 @@ from datetime import datetime
from typing import TYPE_CHECKING, Literal from typing import TYPE_CHECKING, Literal
import jinja2 import jinja2
from yarl import URL
from httpx import AsyncClient
from pydantic import BaseModel from pydantic import BaseModel
from PIL import Image as PILImage
from nonebot_plugin_saa import Text, Image, MessageSegmentFactory from nonebot_plugin_saa import Text, Image, MessageSegmentFactory
from nonebot_bison.compat import model_validator from nonebot_bison.compat import model_validator
from nonebot_bison.theme.utils import convert_to_qr from nonebot_bison.utils import pic_merge, is_pics_mergable
from nonebot_bison.utils.image import pic_merge, is_pics_mergable from nonebot_bison.theme.utils import convert_to_qr, web_embed_image
from nonebot_bison.theme import Theme, ThemeRenderError, ThemeRenderUnsupportError from nonebot_bison.theme import Theme, ThemeRenderError, ThemeRenderUnsupportError
if TYPE_CHECKING: if TYPE_CHECKING:
@ -35,13 +38,26 @@ class CeoboContent(BaseModel):
text: 文字内容 text: 文字内容
""" """
image: str | None = None
text: str
class CeoboRetweet(BaseModel):
"""卡片的转发部分
author: 原作者
image: 图片链接
content: 文字内容
"""
image: str | None image: str | None
text: str | None content: str | None
author: str
@model_validator(mode="before") @model_validator(mode="before")
def check(cls, values): def check(cls, values):
if values["image"] is None and values["text"] is None: if values["image"] is None and values["content"] is None:
raise ValueError("image and text cannot be both None") raise ValueError("image and content cannot be both None")
return values return values
@ -49,6 +65,7 @@ class CeobeCard(BaseModel):
info: CeobeInfo info: CeobeInfo
content: CeoboContent content: CeoboContent
qr: str | None qr: str | None
retweet: CeoboRetweet | None
class CeobeCanteenTheme(Theme): class CeobeCanteenTheme(Theme):
@ -63,8 +80,8 @@ class CeobeCanteenTheme(Theme):
template_path: Path = Path(__file__).parent / "templates" template_path: Path = Path(__file__).parent / "templates"
template_name: str = "ceobe_canteen.html.jinja" template_name: str = "ceobe_canteen.html.jinja"
def parse(self, post: "Post") -> CeobeCard: async def parse(self, post: "Post") -> tuple[CeobeCard, list[str | bytes | Path | BytesIO]]:
"""解析 Post 为 CeobeCard""" """解析 Post 为 CeobeCard与处理好的图片列表"""
if not post.nickname: if not post.nickname:
raise ThemeRenderUnsupportError("post.nickname is None") raise ThemeRenderUnsupportError("post.nickname is None")
if not post.timestamp: if not post.timestamp:
@ -73,15 +90,96 @@ class CeobeCanteenTheme(Theme):
datasource=post.nickname, time=datetime.fromtimestamp(post.timestamp).strftime("%Y-%m-%d %H:%M:%S") datasource=post.nickname, time=datetime.fromtimestamp(post.timestamp).strftime("%Y-%m-%d %H:%M:%S")
) )
head_pic = post.images[0] if post.images else None http_client = await post.platform.ctx.get_client_for_static()
if head_pic is not None and not isinstance(head_pic, str): images: list[str | bytes | Path | BytesIO] = []
raise ThemeRenderUnsupportError("post.images[0] is not str") if post.images:
images = await self.merge_pics(post.images, http_client)
content = CeoboContent(image=head_pic, text=post.content) content = CeoboContent(text=post.content)
return CeobeCard(info=info, content=content, qr=convert_to_qr(post.url or "No URL"))
retweet: CeoboRetweet | None = None
if post.repost:
repost_head_pic: str | None = None
if post.repost.images:
repost_images = await self.merge_pics(post.repost.images, http_client)
repost_head_pic = self.extract_head_pic(repost_images)
images.extend(repost_images)
repost_nickname = f"@{post.repost.nickname}:" if post.repost.nickname else ""
retweet = CeoboRetweet(image=repost_head_pic, content=post.repost.content, author=repost_nickname)
return (
CeobeCard(
info=info,
content=content,
qr=web_embed_image(convert_to_qr(post.url or "No URL", back_color=(240, 236, 233))),
retweet=retweet,
),
images,
)
@staticmethod
async def merge_pics(
images: list[str | bytes | Path | BytesIO],
client: AsyncClient,
) -> list[str | bytes | Path | BytesIO]:
if is_pics_mergable(images):
pics = await pic_merge(images, client)
else:
pics = images
return list(pics)
@staticmethod
def extract_head_pic(pics: list[str | bytes | Path | BytesIO]) -> str:
head_pic = web_embed_image(pics[0]) if not isinstance(pics[0], str) else pics[0]
return head_pic
@staticmethod
def card_link(head_pic: PILImage.Image, card_body: PILImage.Image) -> PILImage.Image:
"""将头像与卡片合并"""
def resize_image(img: PILImage.Image, size: tuple[int, int]) -> PILImage.Image:
return img.resize(size)
# 统一图片宽度
head_pic_w, head_pic_h = head_pic.size
card_body_w, card_body_h = card_body.size
if head_pic_w > card_body_w:
head_pic = resize_image(head_pic, (card_body_w, int(head_pic_h * card_body_w / head_pic_w)))
else:
card_body = resize_image(card_body, (head_pic_w, int(card_body_h * head_pic_w / card_body_w)))
# 合并图片
card = PILImage.new("RGBA", (head_pic.width, head_pic.height + card_body.height))
card.paste(head_pic, (0, 0))
card.paste(card_body, (0, head_pic.height))
return card
async def render(self, post: "Post") -> list[MessageSegmentFactory]: async def render(self, post: "Post") -> list[MessageSegmentFactory]:
ceobe_card = self.parse(post) ceobe_card, merged_images = await self.parse(post)
need_card_link: bool = True
head_pic = None
# 如果没有 post.images则全部都是转发里的图片不需要头图
if post.images:
match merged_images[0]:
case bytes():
head_pic = merged_images[0]
merged_images = merged_images[1:]
case BytesIO():
head_pic = merged_images[0].getvalue()
merged_images = merged_images[1:]
case str(s) if URL(s).scheme in ("http", "https"):
ceobe_card.content.image = merged_images[0]
need_card_link = False
case Path():
ceobe_card.content.image = merged_images[0].as_uri()
need_card_link = False
case _:
raise ThemeRenderError(f"Unknown image type: {type(merged_images[0])}")
from nonebot_plugin_htmlrender import get_new_page from nonebot_plugin_htmlrender import get_new_page
template_env = jinja2.Environment( template_env = jinja2.Environment(
@ -91,7 +189,8 @@ class CeobeCanteenTheme(Theme):
template = template_env.get_template(self.template_name) template = template_env.get_template(self.template_name)
html = await template.render_async(card=ceobe_card) html = await template.render_async(card=ceobe_card)
pages = { pages = {
"viewport": {"width": 1000, "height": 3000}, "device_scale_factor": 2,
"viewport": {"width": 512, "height": 455},
"base_url": self.template_path.as_uri(), "base_url": self.template_path.as_uri(),
} }
try: try:
@ -99,12 +198,24 @@ class CeobeCanteenTheme(Theme):
await page.goto(self.template_path.as_uri()) await page.goto(self.template_path.as_uri())
await page.set_content(html) await page.set_content(html)
await page.wait_for_timeout(1) await page.wait_for_timeout(1)
img_raw = await page.locator("#ceobecanteen-card").screenshot( card_body = await page.locator("#ceobecanteen-card").screenshot(
type="png", type="jpeg",
quality=90,
) )
except Exception as e: except Exception as e:
raise ThemeRenderError(f"Render error: {e}") from e raise ThemeRenderError(f"Render error: {e}") from e
msgs: list[MessageSegmentFactory] = [Image(img_raw)]
msgs: list[MessageSegmentFactory] = []
if need_card_link and head_pic:
card_pil = self.card_link(
head_pic=PILImage.open(BytesIO(head_pic)),
card_body=PILImage.open(BytesIO(card_body)),
)
card_data = BytesIO()
card_pil.save(card_data, format="PNG")
msgs.append(Image(card_data.getvalue()))
else:
msgs.append(Image(card_body))
text = f"来源: {post.platform.name} {post.nickname or ''}\n" text = f"来源: {post.platform.name} {post.nickname or ''}\n"
if post.url: if post.url:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 KiB

View File

@ -11,6 +11,19 @@
{% endif %} {% endif %}
{% if card.content.text %} {% if card.content.text %}
<div class="main-content">{{ card.content.text }}</div> <div class="main-content">{{ card.content.text }}</div>
{% if card.retweet %}
<div class="retweet">
{% if card.retweet.author %}
<div class="origin-author">{{ card.retweet.author }}</div>
{% endif %}
{% if card.retweet.content %}
<div class="retweet-content">{{ card.retweet.content }}</div>
{% endif %}
{% if card.retweet.image %}
<img class='retweet-image' src="{{ card.retweet.image }}">
{% endif %}
</div>
{% endif %}
{% endif %} {% endif %}
<div class="footer"> <div class="footer">
<div class="datasource"> <div class="datasource">
@ -21,7 +34,7 @@
<img class='qr' src="{{ card.qr }}"> <img class='qr' src="{{ card.qr }}">
</div> </div>
<div class="source"> <div class="source">
<img class='bison-logo' src="bison_logo.jpg"> <img class='bison-logo' src="bison_logo.png">
<div class="source-text"> <div class="source-text">
<div class="slogan">小刻吃到饼啦!</div> <div class="slogan">小刻吃到饼啦!</div>
<div class="linkage">bison&amp;小刻食堂联动</div> <div class="linkage">bison&amp;小刻食堂联动</div>
@ -46,6 +59,16 @@
padding: 30px; padding: 30px;
white-space: pre-line; white-space: pre-line;
} }
.retweet {
margin: -20px 30px 20px;
background-color: rgb(226, 223, 219);
border: solid 1px rgb(212, 210, 207);
border-radius: 3px;
padding: 5px;
}
.retweet .retweet-image {
width: 100%;
}
.footer { .footer {
margin: 0 2%; margin: 0 2%;
height: 80px; height: 80px;

View File

@ -1,9 +1,13 @@
from io import BytesIO
from pathlib import Path
from base64 import b64encode
from qrcode import constants from qrcode import constants
from qrcode.main import QRCode from qrcode.main import QRCode
from qrcode.image.svg import SvgFragmentImage from qrcode.image.pil import PilImage
def convert_to_qr(data: str) -> str: def convert_to_qr(data: str, **kwarg) -> bytes:
"""Convert data to QR code """Convert data to QR code
Args: Args:
data (str): data to be converted data (str): data to be converted
@ -15,8 +19,24 @@ def convert_to_qr(data: str) -> str:
error_correction=constants.ERROR_CORRECT_L, error_correction=constants.ERROR_CORRECT_L,
box_size=10, box_size=10,
border=2, border=2,
image_factory=SvgFragmentImage, image_factory=PilImage,
) )
qr.add_data(data) qr.add_data(data)
qr.make(fit=True) qr.make(fit=True)
return qr.make_image().to_string().decode("utf-8") f = BytesIO()
qr.make_image(**kwarg).save(f)
return f.getvalue()
def web_embed_image(pic_data: bytes | Path | BytesIO, *, ext: str = "png"):
"""将图片数据转换为Base64编码的Data URI"""
match pic_data:
case bytes():
pic_bytes = pic_data
case Path():
pic_bytes = Path(pic_data).read_bytes()
case BytesIO():
pic_bytes = pic_data.getvalue()
case _:
raise TypeError("pic_data must be bytes, Path or BytesIO")
return f"data:image/{ext};base64,{b64encode(pic_bytes).decode()}"

View File

@ -12,6 +12,7 @@ from .site import Site as Site
from ..plugin_config import plugin_config from ..plugin_config import plugin_config
from .image import pic_merge as pic_merge from .image import pic_merge as pic_merge
from .http import http_client as http_client from .http import http_client as http_client
from .image import capture_html as capture_html
from .site import ClientManager as ClientManager from .site import ClientManager as ClientManager
from .image import text_to_image as text_to_image from .image import text_to_image as text_to_image
from .site import anonymous_site as anonymous_site from .site import anonymous_site as anonymous_site
@ -108,3 +109,8 @@ def decode_unicode_escapes(s: str):
regex = re.compile(r"\\[rnt]|\\u[0-9a-fA-F]{4}") regex = re.compile(r"\\[rnt]|\\u[0-9a-fA-F]{4}")
return regex.sub(decode_match, s) return regex.sub(decode_match, s)
def text_fletten(text: str, *, banned: str = "\n\r\t", replace: str = " ") -> str:
"""将文本中的格式化字符去除"""
return "".join(c if c not in banned else replace for c in text)

View File

@ -1,7 +1,8 @@
from io import BytesIO from io import BytesIO
from typing import TypeGuard
from functools import partial from functools import partial
from typing import Literal, TypeGuard
from yarl import URL
from PIL import Image from PIL import Image
from httpx import AsyncClient from httpx import AsyncClient
from nonebot import logger, require from nonebot import logger, require
@ -96,7 +97,11 @@ async def pic_merge(pics: list[str | bytes], http_client: AsyncClient) -> list[s
def is_pics_mergable(imgs: list) -> TypeGuard[list[str | bytes]]: def is_pics_mergable(imgs: list) -> TypeGuard[list[str | bytes]]:
return all(isinstance(img, str | bytes) for img in imgs) if any(not isinstance(img, str | bytes) for img in imgs):
return False
url = [URL(img) for img in imgs if isinstance(img, str)]
return all(u.scheme in ("http", "https") for u in url)
async def text_to_image(saa_text: SaaText) -> SaaImage: async def text_to_image(saa_text: SaaText) -> SaaImage:
@ -108,3 +113,32 @@ async def text_to_image(saa_text: SaaText) -> SaaImage:
render_data = await text_to_pic(str(saa_text)) render_data = await text_to_pic(str(saa_text))
return SaaImage(render_data) return SaaImage(render_data)
async def capture_html(
url: str,
selector: str,
timeout: float = 0,
type: Literal["jpeg", "png"] = "png",
quality: int | None = None,
wait_until: Literal["commit", "domcontentloaded", "load", "networkidle"] | None = None,
viewport: dict = {"width": 1024, "height": 990},
device_scale_factor: int = 2,
**page_kwargs,
) -> bytes | None:
"""
将给定的url网页的指定CSS选择器部分渲染成图片
timeout: 超时时间单位毫秒
"""
require("nonebot_plugin_htmlrender")
from nonebot_plugin_htmlrender import get_new_page
assert url
async with get_new_page(device_scale_factor=device_scale_factor, viewport=viewport, **page_kwargs) as page:
await page.goto(url, timeout=timeout, wait_until=wait_until)
pic_data = await page.locator(selector).screenshot(
type=type,
quality=quality,
)
return pic_data

700
poetry.lock generated
View File

@ -21,13 +21,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "aiofiles" name = "aiofiles"
version = "23.2.1" version = "24.1.0"
description = "File support for asyncio." description = "File support for asyncio."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
{file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
] ]
[package.source] [package.source]
@ -183,13 +183,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "alembic" name = "alembic"
version = "1.13.1" version = "1.13.2"
description = "A database migration tool for SQLAlchemy." description = "A database migration tool for SQLAlchemy."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"},
{file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"},
] ]
[package.dependencies] [package.dependencies]
@ -688,13 +688,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "certifi" name = "certifi"
version = "2024.6.2" version = "2024.7.4"
description = "Python package for providing Mozilla's CA Bundle." description = "Python package for providing Mozilla's CA Bundle."
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
files = [ files = [
{file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"},
{file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
] ]
[package.source] [package.source]
@ -970,63 +970,63 @@ reference = "offical-source"
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.5.3" version = "7.6.0"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"},
{file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"},
{file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"},
{file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"},
{file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"},
{file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"},
{file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"},
{file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"},
{file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"},
{file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"},
{file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"},
{file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"},
{file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"},
{file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"},
{file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"},
{file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"},
{file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"},
{file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"},
{file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"},
{file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"},
{file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"},
{file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"},
{file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"},
{file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"},
{file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"},
{file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"},
{file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"},
{file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"},
{file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"},
{file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"},
{file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"},
{file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"},
{file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"},
{file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"},
{file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"},
{file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"},
{file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"},
{file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"},
{file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"},
{file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"},
{file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"},
{file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"},
{file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"},
{file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"},
{file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"},
{file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"},
{file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"},
{file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"},
{file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"},
{file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"},
{file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"},
{file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"},
] ]
[package.dependencies] [package.dependencies]
@ -1099,13 +1099,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "email-validator" name = "email-validator"
version = "2.1.1" version = "2.2.0"
description = "A robust email address syntax and deliverability validation library." description = "A robust email address syntax and deliverability validation library."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"},
{file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"},
] ]
[package.dependencies] [package.dependencies]
@ -1175,18 +1175,18 @@ url = "https://pypi.org/simple"
reference = "offical-source" reference = "offical-source"
[[package]] [[package]]
name = "expiringdict" name = "expiringdictx"
version = "1.2.2" version = "1.0.1"
description = "Dictionary with auto-expiring values for caching purposes" description = "提供一个带有过期时间的字典数据结构,适用于缓存和临时存储。"
optional = false optional = false
python-versions = "*" python-versions = ">=3.10,<4.0"
files = [ files = [
{file = "expiringdict-1.2.2-py3-none-any.whl", hash = "sha256:09a5d20bc361163e6432a874edd3179676e935eb81b925eccef48d409a8a45e8"}, {file = "expiringdictx-1.0.1-py3-none-any.whl", hash = "sha256:0b8c66f7781a066bafa842fc1af49594207d5c78dbfd09c7991c03208a37ae49"},
{file = "expiringdict-1.2.2.tar.gz", hash = "sha256:300fb92a7e98f15b05cf9a856c1415b3bc4f2e132be07daa326da6414c23ee09"}, {file = "expiringdictx-1.0.1.tar.gz", hash = "sha256:4c077cb69774594f85bd181bfec66398971c5df50c737abb2f6c9524b7ac519f"},
] ]
[package.extras] [package.dependencies]
tests = ["coverage", "coveralls", "dill", "mock", "nose"] lru-dict = ">=1.3.0,<2.0.0"
[package.source] [package.source]
type = "legacy" type = "legacy"
@ -1268,18 +1268,18 @@ reference = "offical-source"
[[package]] [[package]]
name = "filelock" name = "filelock"
version = "3.14.0" version = "3.15.4"
description = "A platform independent file lock." description = "A platform independent file lock."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"},
{file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"},
] ]
[package.extras] [package.extras]
docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"]
typing = ["typing-extensions (>=4.8)"] typing = ["typing-extensions (>=4.8)"]
[package.source] [package.source]
@ -1522,6 +1522,30 @@ type = "legacy"
url = "https://pypi.org/simple" url = "https://pypi.org/simple"
reference = "offical-source" reference = "offical-source"
[[package]]
name = "hishel"
version = "0.0.20"
description = "Persistent cache implementation for httpx and httpcore"
optional = false
python-versions = ">=3.8"
files = [
{file = "hishel-0.0.20-py3-none-any.whl", hash = "sha256:a08caeb393602af7844d559fc78448c6825336368fb47136e014c4367af6b95e"},
{file = "hishel-0.0.20.tar.gz", hash = "sha256:74f7cfcf0a7c9ae1cf1dd5a876fc3024de281693b476c264aa41a6a8a7277265"},
]
[package.dependencies]
httpx = ">=0.22.0"
[package.extras]
redis = ["redis (==5.0.1)"]
sqlite = ["anysqlite (>=0.0.5)"]
yaml = ["pyyaml (==6.0.1)"]
[package.source]
type = "legacy"
url = "https://pypi.org/simple"
reference = "offical-source"
[[package]] [[package]]
name = "hpack" name = "hpack"
version = "4.0.0" version = "4.0.0"
@ -1665,13 +1689,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "identify" name = "identify"
version = "2.5.36" version = "2.6.0"
description = "File identification library for Python" description = "File identification library for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"},
{file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"},
] ]
[package.extras] [package.extras]
@ -1737,13 +1761,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "ipython" name = "ipython"
version = "8.25.0" version = "8.26.0"
description = "IPython: Productive Interactive Computing" description = "IPython: Productive Interactive Computing"
optional = false optional = false
python-versions = ">=3.10" python-versions = ">=3.10"
files = [ files = [
{file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"}, {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"},
{file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"}, {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"},
] ]
[package.dependencies] [package.dependencies]
@ -1770,7 +1794,7 @@ nbformat = ["nbformat"]
notebook = ["ipywidgets", "notebook"] notebook = ["ipywidgets", "notebook"]
parallel = ["ipyparallel"] parallel = ["ipyparallel"]
qtconsole = ["qtconsole"] qtconsole = ["qtconsole"]
test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"]
test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"]
[package.source] [package.source]
@ -1866,6 +1890,104 @@ type = "legacy"
url = "https://pypi.org/simple" url = "https://pypi.org/simple"
reference = "offical-source" reference = "offical-source"
[[package]]
name = "lru-dict"
version = "1.3.0"
description = "An Dict like LRU container."
optional = false
python-versions = ">=3.8"
files = [
{file = "lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b"},
{file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4073333894db9840f066226d50e6f914a2240711c87d60885d8c940b69a6673f"},
{file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0ad6361e4dd63b47b2fc8eab344198f37387e1da3dcfacfee19bafac3ec9f1eb"},
{file = "lru_dict-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c637ab54b8cd9802fe19b260261e38820d748adf7606e34045d3c799b6dde813"},
{file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce5f95489ca1fc158cc9fe0f4866db9cec82c2be0470926a9080570392beaf"},
{file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2bf2e24cf5f19c3ff69bf639306e83dced273e6fa775b04e190d7f5cd16f794"},
{file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e90059f7701bef3c4da073d6e0434a9c7dc551d5adce30e6b99ef86b186f4b4a"},
{file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ecb7ae557239c64077e9b26a142eb88e63cddb104111a5122de7bebbbd00098"},
{file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6af36166d22dba851e06a13e35bbf33845d3dd88872e6aebbc8e3e7db70f4682"},
{file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ee38d420c77eed548df47b7d74b5169a98e71c9e975596e31ab808e76d11f09"},
{file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0e1845024c31e6ff246c9eb5e6f6f1a8bb564c06f8a7d6d031220044c081090b"},
{file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ca5474b1649555d014be1104e5558a92497509021a5ba5ea6e9b492303eb66b"},
{file = "lru_dict-1.3.0-cp310-cp310-win32.whl", hash = "sha256:ebb03a9bd50c2ed86d4f72a54e0aae156d35a14075485b2127c4b01a3f4a63fa"},
{file = "lru_dict-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:04cda617f4e4c27009005d0a8185ef02829b14b776d2791f5c994cc9d668bc24"},
{file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20c595764695d20bdc3ab9b582e0cc99814da183544afb83783a36d6741a0dac"},
{file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d9b30a8f50c3fa72a494eca6be5810a1b5c89e4f0fda89374f0d1c5ad8d37d51"},
{file = "lru_dict-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9710737584650a4251b9a566cbb1a86f83437adb209c9ba43a4e756d12faf0d7"},
{file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84c321ae34f2f40aae80e18b6fa08b31c90095792ab64bb99d2e385143effaa"},
{file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eed24272b4121b7c22f234daed99899817d81d671b3ed030c876ac88bc9dc890"},
{file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd13af06dab7c6ee92284fd02ed9a5613a07d5c1b41948dc8886e7207f86dfd"},
{file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1efc59bfba6aac33684d87b9e02813b0e2445b2f1c444dae2a0b396ad0ed60c"},
{file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfaf75ac574447afcf8ad998789071af11d2bcf6f947643231f692948839bd98"},
{file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c95f8751e2abd6f778da0399c8e0239321d560dbc58cb063827123137d213242"},
{file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:abd0c284b26b5c4ee806ca4f33ab5e16b4bf4d5ec9e093e75a6f6287acdde78e"},
{file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a47740652b25900ac5ce52667b2eade28d8b5fdca0ccd3323459df710e8210a"},
{file = "lru_dict-1.3.0-cp311-cp311-win32.whl", hash = "sha256:a690c23fc353681ed8042d9fe8f48f0fb79a57b9a45daea2f0be1eef8a1a4aa4"},
{file = "lru_dict-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:efd3f4e0385d18f20f7ea6b08af2574c1bfaa5cb590102ef1bee781bdfba84bc"},
{file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d"},
{file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549"},
{file = "lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f"},
{file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73593791047e36b37fdc0b67b76aeed439fcea80959c7d46201240f9ec3b2563"},
{file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1958cb70b9542773d6241974646e5410e41ef32e5c9e437d44040d59bd80daf2"},
{file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1cd3ed2cee78a47f11f3b70be053903bda197a873fd146e25c60c8e5a32cd6"},
{file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eb230d48eaebd6977a92ddaa6d788f14cf4f4bcf5bbffa4ddfd60d051aa9d4"},
{file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5ad659cbc349d0c9ba8e536b5f40f96a70c360f43323c29f4257f340d891531c"},
{file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba490b8972531d153ac0d4e421f60d793d71a2f4adbe2f7740b3c55dce0a12f1"},
{file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:c0131351b8a7226c69f1eba5814cbc9d1d8daaf0fdec1ae3f30508e3de5262d4"},
{file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0e88dba16695f17f41701269fa046197a3fd7b34a8dba744c8749303ddaa18df"},
{file = "lru_dict-1.3.0-cp312-cp312-win32.whl", hash = "sha256:6ffaf595e625b388babc8e7d79b40f26c7485f61f16efe76764e32dce9ea17fc"},
{file = "lru_dict-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf9da32ef2582434842ab6ba6e67290debfae72771255a8e8ab16f3e006de0aa"},
{file = "lru_dict-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c265f16c936a8ff3bb4b8a4bda0be94c15ec28b63e99fdb1439c1ffe4cd437db"},
{file = "lru_dict-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:784ca9d3b0730b3ec199c0a58f66264c63dd5d438119c739c349a6a9be8e5f6e"},
{file = "lru_dict-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e13b2f58f647178470adaa14603bb64cc02eeed32601772ccea30e198252883c"},
{file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ffbce5c2e80f57937679553c8f27e61ec327c962bf7ea0b15f1d74277fd5363"},
{file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7969cb034b3ccc707aff877c73c225c32d7e2a7981baa8f92f5dd4d468fe8c33"},
{file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca9ab676609cce85dd65d91c275e47da676d13d77faa72de286fbea30fbaa596"},
{file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27c078b5d75989952acbf9b77e14c3dadc468a4aafe85174d548afbc5efc38b"},
{file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6123aefe97762ad74215d05320a7f389f196f0594c8813534284d4eafeca1a96"},
{file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd869cadba9a63e1e7fe2dced4a5747d735135b86016b0a63e8c9e324ab629ac"},
{file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:40a8daddc29c7edb09dfe44292cf111f1e93a8344349778721d430d336b50505"},
{file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a03170e4152836987a88dcebde61aaeb73ab7099a00bb86509d45b3fe424230"},
{file = "lru_dict-1.3.0-cp38-cp38-win32.whl", hash = "sha256:3b4f121afe10f5a82b8e317626eb1e1c325b3f104af56c9756064cd833b1950b"},
{file = "lru_dict-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:1470f5828c7410e16c24b5150eb649647986e78924816e6fb0264049dea14a2b"},
{file = "lru_dict-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3c9f746a9917e784fffcedeac4c8c47a3dbd90cbe13b69e9140182ad97ce4b7"},
{file = "lru_dict-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2789296819525a1f3204072dfcf3df6db8bcf69a8fc740ffd3de43a684ea7002"},
{file = "lru_dict-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:170b66d29945391460351588a7bd8210a95407ae82efe0b855e945398a1d24ea"},
{file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774ca88501a9effe8797c3db5a6685cf20978c9cb0fe836b6813cfe1ca60d8c9"},
{file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df2e119c6ae412d2fd641a55f8a1e2e51f45a3de3449c18b1b86c319ab79e0c4"},
{file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28aa1ea42a7e48174bf513dc2416fea7511a547961e678dc6f5670ca987c18cb"},
{file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9537e1cee6fa582cb68f2fb9ce82d51faf2ccc0a638b275d033fdcb1478eb80b"},
{file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:64545fca797fe2c68c5168efb5f976c6e1459e058cab02445207a079180a3557"},
{file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a193a14c66cfc0c259d05dddc5e566a4b09e8f1765e941503d065008feebea9d"},
{file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:3cb1de0ce4137b060abaafed8474cc0ebd12cedd88aaa7f7b3ebb1ddfba86ae0"},
{file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8551ccab1349d4bebedab333dfc8693c74ff728f4b565fe15a6bf7d296bd7ea9"},
{file = "lru_dict-1.3.0-cp39-cp39-win32.whl", hash = "sha256:6cb0be5e79c3f34d69b90d8559f0221e374b974b809a22377122c4b1a610ff67"},
{file = "lru_dict-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9f725f2a0bdf1c18735372d5807af4ea3b77888208590394d4660e3d07971f21"},
{file = "lru_dict-1.3.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f8f7824db5a64581180ab9d09842e6dd9fcdc46aac9cb592a0807cd37ea55680"},
{file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acd04b7e7b0c0c192d738df9c317093335e7282c64c9d1bb6b7ebb54674b4e24"},
{file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c20f236f27551e3f0adbf1a987673fb1e9c38d6d284502cd38f5a3845ef681"},
{file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca3703ff03b03a1848c563bc2663d0ad813c1cd42c4d9cf75b623716d4415d9a"},
{file = "lru_dict-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a9fb71ba262c6058a0017ce83d343370d0a0dbe2ae62c2eef38241ec13219330"},
{file = "lru_dict-1.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f5b88a7c39e307739a3701194993455968fcffe437d1facab93546b1b8a334c1"},
{file = "lru_dict-1.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2682bfca24656fb7a643621520d57b7fe684ed5fa7be008704c1235d38e16a32"},
{file = "lru_dict-1.3.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96fc87ddf569181827458ec5ad8fa446c4690cffacda66667de780f9fcefd44d"},
{file = "lru_dict-1.3.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcec98e2c7da7631f0811730303abc4bdfe70d013f7a11e174a2ccd5612a7c59"},
{file = "lru_dict-1.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6bba2863060caeaedd8386b0c8ee9a7ce4d57a7cb80ceeddf440b4eff2d013ba"},
{file = "lru_dict-1.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c497fb60279f1e1d7dfbe150b1b069eaa43f7e172dab03f206282f4994676c5"},
{file = "lru_dict-1.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9509d817a47597988615c1a322580c10100acad10c98dfcf3abb41e0e5877f"},
{file = "lru_dict-1.3.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0213ab4e3d9a8d386c18e485ad7b14b615cb6f05df6ef44fb2a0746c6ea9278b"},
{file = "lru_dict-1.3.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b50fbd69cd3287196796ab4d50e4cc741eb5b5a01f89d8e930df08da3010c385"},
{file = "lru_dict-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5247d1f011f92666010942434020ddc5a60951fefd5d12a594f0e5d9f43e3b3b"},
]
[package.extras]
test = ["pytest"]
[package.source]
type = "legacy"
url = "https://pypi.org/simple"
reference = "offical-source"
[[package]] [[package]]
name = "lxml" name = "lxml"
version = "5.2.2" version = "5.2.2"
@ -2593,19 +2715,19 @@ reference = "offical-source"
[[package]] [[package]]
name = "nonebot-plugin-localstore" name = "nonebot-plugin-localstore"
version = "0.6.0" version = "0.7.0"
description = "Local Storage Support for NoneBot2" description = "Local Storage Support for NoneBot2"
optional = false optional = false
python-versions = ">=3.8,<4.0" python-versions = ">=3.9,<4.0"
files = [ files = [
{file = "nonebot_plugin_localstore-0.6.0-py3-none-any.whl", hash = "sha256:59f0126d85680601166a9a62cca886a33e1b0a8fef7cd67fff52747bd47f42d3"}, {file = "nonebot_plugin_localstore-0.7.0-py3-none-any.whl", hash = "sha256:5cb8a18d87c88259ff3ae4d741390e44076d48c8cc9c33aea66f7a6a29fe70af"},
{file = "nonebot_plugin_localstore-0.6.0.tar.gz", hash = "sha256:7eb4039cb2e76c54b860b2b98f2b90cd25284919603e81dedec367f215662fcd"}, {file = "nonebot_plugin_localstore-0.7.0.tar.gz", hash = "sha256:f04d99daba13d8e7cc6cf72c43fab28cbde30e0c2a71b328e815d9c96403e2e3"},
] ]
[package.dependencies] [package.dependencies]
nonebot2 = ">=2.2.0,<3.0.0" nonebot2 = ">=2.2.0,<3.0.0"
pydantic = ">=1.10.0,<2.5.0 || >2.5.0,<2.5.1 || >2.5.1,<3.0.0" pydantic = ">=1.10.0,<2.5.0 || >2.5.0,<2.5.1 || >2.5.1,<3.0.0"
typing-extensions = ">=4.0.0" typing-extensions = ">=4.0.0,<5.0.0"
[package.source] [package.source]
type = "legacy" type = "legacy"
@ -2756,57 +2878,62 @@ reference = "offical-source"
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.10.3" version = "3.10.6"
description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"},
{file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"},
{file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"},
{file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"},
{file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"},
{file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"},
{file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"},
{file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"},
{file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"},
{file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"},
{file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"},
{file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"},
{file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"},
{file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"},
{file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"},
{file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"},
{file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"},
{file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"},
{file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"},
{file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"},
{file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"},
{file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"},
{file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"},
{file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"},
{file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"},
{file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"},
{file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"},
{file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"},
{file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"},
{file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"},
{file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"},
] ]
[package.source] [package.source]
@ -2816,13 +2943,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "packaging" name = "packaging"
version = "24.0" version = "24.1"
description = "Core utilities for Python packages" description = "Core utilities for Python packages"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
] ]
[package.source] [package.source]
@ -3010,18 +3137,18 @@ reference = "offical-source"
[[package]] [[package]]
name = "playwright" name = "playwright"
version = "1.44.0" version = "1.45.0"
description = "A high-level API to automate web browsers" description = "A high-level API to automate web browsers"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "playwright-1.44.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c2317a80896796fdeb03d60f06cc229e775ff2e19b80c64b1bb9b29c8a59d992"}, {file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"},
{file = "playwright-1.44.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54d44fb634d870839301c2326e1e12a178a1be0de76d0caaec230ab075c2e077"}, {file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"},
{file = "playwright-1.44.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:64b67194e73b47ae72acf25f1a9cfacfef38ca2b52e4bb8b0abd385c5deeaadf"}, {file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"},
{file = "playwright-1.44.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:29161b1fae71f7c402df5b15f0bd3deaeecd8b3d1ecd9ff01271700c66210e7b"}, {file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"},
{file = "playwright-1.44.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8c8a3bfea17576d3f94a2363eee195cbda8dbba86975588c7eaac7792b25eee"}, {file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"},
{file = "playwright-1.44.0-py3-none-win32.whl", hash = "sha256:235e37832deaa9af8a629d09955396259ab757533cc1922f9b0308b4ee0d9cdf"}, {file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"},
{file = "playwright-1.44.0-py3-none-win_amd64.whl", hash = "sha256:5b8a4a1d4d50f4ff99b47965576322a8c4e34631854b862a25c1feb824be22a8"}, {file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"},
] ]
[package.dependencies] [package.dependencies]
@ -3094,13 +3221,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "prompt-toolkit" name = "prompt-toolkit"
version = "3.0.46" version = "3.0.47"
description = "Library for building powerful interactive command lines in Python" description = "Library for building powerful interactive command lines in Python"
optional = false optional = false
python-versions = ">=3.7.0" python-versions = ">=3.7.0"
files = [ files = [
{file = "prompt_toolkit-3.0.46-py3-none-any.whl", hash = "sha256:45abe60a8300f3c618b23c16c4bb98c6fc80af8ce8b17c7ae92db48db3ee63c1"}, {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"},
{file = "prompt_toolkit-3.0.46.tar.gz", hash = "sha256:869c50d682152336e23c4db7f74667639b5047494202ffe7670817053fd57795"}, {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"},
] ]
[package.dependencies] [package.dependencies]
@ -3113,27 +3240,28 @@ reference = "offical-source"
[[package]] [[package]]
name = "psutil" name = "psutil"
version = "5.9.8" version = "6.0.0"
description = "Cross-platform lib for process and system monitoring in Python." description = "Cross-platform lib for process and system monitoring in Python."
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
files = [ files = [
{file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"},
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"},
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"},
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"},
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"},
{file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"},
{file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"},
{file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"},
{file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"},
{file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"},
{file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"},
{file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"},
{file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"},
{file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"},
{file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"},
{file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"},
{file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"},
] ]
[package.extras] [package.extras]
@ -3910,6 +4038,116 @@ type = "legacy"
url = "https://pypi.org/simple" url = "https://pypi.org/simple"
reference = "offical-source" reference = "offical-source"
[[package]]
name = "rapidfuzz"
version = "3.9.4"
description = "rapid fuzzy string matching"
optional = false
python-versions = ">=3.8"
files = [
{file = "rapidfuzz-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b9793c19bdf38656c8eaefbcf4549d798572dadd70581379e666035c9df781"},
{file = "rapidfuzz-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:015b5080b999404fe06ec2cb4f40b0be62f0710c926ab41e82dfbc28e80675b4"},
{file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc5ceca9c1e1663f3e6c23fb89a311f69b7615a40ddd7645e3435bf3082688a"},
{file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1424e238bc3f20e1759db1e0afb48a988a9ece183724bef91ea2a291c0b92a95"},
{file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed01378f605aa1f449bee82cd9c83772883120d6483e90aa6c5a4ce95dc5c3aa"},
{file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb26d412271e5a76cdee1c2d6bf9881310665d3fe43b882d0ed24edfcb891a84"},
{file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f37e9e1f17be193c41a31c864ad4cd3ebd2b40780db11cd5c04abf2bcf4201b"},
{file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d070ec5cf96b927c4dc5133c598c7ff6db3b833b363b2919b13417f1002560bc"},
{file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:10e61bb7bc807968cef09a0e32ce253711a2d450a4dce7841d21d45330ffdb24"},
{file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:31a2fc60bb2c7face4140010a7aeeafed18b4f9cdfa495cc644a68a8c60d1ff7"},
{file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fbebf1791a71a2e89f5c12b78abddc018354d5859e305ec3372fdae14f80a826"},
{file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aee9fc9e3bb488d040afc590c0a7904597bf4ccd50d1491c3f4a5e7e67e6cd2c"},
{file = "rapidfuzz-3.9.4-cp310-cp310-win32.whl", hash = "sha256:005a02688a51c7d2451a2d41c79d737aa326ff54167211b78a383fc2aace2c2c"},
{file = "rapidfuzz-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:3a2e75e41ee3274754d3b2163cc6c82cd95b892a85ab031f57112e09da36455f"},
{file = "rapidfuzz-3.9.4-cp310-cp310-win_arm64.whl", hash = "sha256:2c99d355f37f2b289e978e761f2f8efeedc2b14f4751d9ff7ee344a9a5ca98d9"},
{file = "rapidfuzz-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:07141aa6099e39d48637ce72a25b893fc1e433c50b3e837c75d8edf99e0c63e1"},
{file = "rapidfuzz-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db1664eaff5d7d0f2542dd9c25d272478deaf2c8412e4ad93770e2e2d828e175"},
{file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc01a223f6605737bec3202e94dcb1a449b6c76d46082cfc4aa980f2a60fd40e"},
{file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1869c42e73e2a8910b479be204fa736418741b63ea2325f9cc583c30f2ded41a"},
{file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62ea7007941fb2795fff305ac858f3521ec694c829d5126e8f52a3e92ae75526"},
{file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:698e992436bf7f0afc750690c301215a36ff952a6dcd62882ec13b9a1ebf7a39"},
{file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b76f611935f15a209d3730c360c56b6df8911a9e81e6a38022efbfb96e433bab"},
{file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129627d730db2e11f76169344a032f4e3883d34f20829419916df31d6d1338b1"},
{file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90a82143c14e9a14b723a118c9ef8d1bbc0c5a16b1ac622a1e6c916caff44dd8"},
{file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ded58612fe3b0e0d06e935eaeaf5a9fd27da8ba9ed3e2596307f40351923bf72"},
{file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f16f5d1c4f02fab18366f2d703391fcdbd87c944ea10736ca1dc3d70d8bd2d8b"},
{file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26aa7eece23e0df55fb75fbc2a8fb678322e07c77d1fd0e9540496e6e2b5f03e"},
{file = "rapidfuzz-3.9.4-cp311-cp311-win32.whl", hash = "sha256:f187a9c3b940ce1ee324710626daf72c05599946bd6748abe9e289f1daa9a077"},
{file = "rapidfuzz-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8e9130fe5d7c9182990b366ad78fd632f744097e753e08ace573877d67c32f8"},
{file = "rapidfuzz-3.9.4-cp311-cp311-win_arm64.whl", hash = "sha256:40419e98b10cd6a00ce26e4837a67362f658fc3cd7a71bd8bd25c99f7ee8fea5"},
{file = "rapidfuzz-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b5d5072b548db1b313a07d62d88fe0b037bd2783c16607c647e01b070f6cf9e5"},
{file = "rapidfuzz-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf5bcf22e1f0fd273354462631d443ef78d677f7d2fc292de2aec72ae1473e66"},
{file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c8fc973adde8ed52810f590410e03fb6f0b541bbaeb04c38d77e63442b2df4c"},
{file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2464bb120f135293e9a712e342c43695d3d83168907df05f8c4ead1612310c7"},
{file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d9d58689aca22057cf1a5851677b8a3ccc9b535ca008c7ed06dc6e1899f7844"},
{file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167e745f98baa0f3034c13583e6302fb69249a01239f1483d68c27abb841e0a1"},
{file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0bf0663b4b6da1507869722420ea9356b6195aa907228d6201303e69837af9"},
{file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd6ac61b74fdb9e23f04d5f068e6cf554f47e77228ca28aa2347a6ca8903972f"},
{file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:60ff67c690acecf381759c16cb06c878328fe2361ddf77b25d0e434ea48a29da"},
{file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cb934363380c60f3a57d14af94325125cd8cded9822611a9f78220444034e36e"},
{file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe833493fb5cc5682c823ea3e2f7066b07612ee8f61ecdf03e1268f262106cdd"},
{file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2797fb847d89e04040d281cb1902cbeffbc4b5131a5c53fc0db490fd76b2a547"},
{file = "rapidfuzz-3.9.4-cp312-cp312-win32.whl", hash = "sha256:52e3d89377744dae68ed7c84ad0ddd3f5e891c82d48d26423b9e066fc835cc7c"},
{file = "rapidfuzz-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:c76da20481c906e08400ee9be230f9e611d5931a33707d9df40337c2655c84b5"},
{file = "rapidfuzz-3.9.4-cp312-cp312-win_arm64.whl", hash = "sha256:f2d2846f3980445864c7e8b8818a29707fcaff2f0261159ef6b7bd27ba139296"},
{file = "rapidfuzz-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355fc4a268ffa07bab88d9adee173783ec8d20136059e028d2a9135c623c44e6"},
{file = "rapidfuzz-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d81a78f90269190b568a8353d4ea86015289c36d7e525cd4d43176c88eff429"},
{file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e618625ffc4660b26dc8e56225f8b966d5842fa190e70c60db6cd393e25b86e"},
{file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b712336ad6f2bacdbc9f1452556e8942269ef71f60a9e6883ef1726b52d9228a"},
{file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc1ee19fdad05770c897e793836c002344524301501d71ef2e832847425707"},
{file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1950f8597890c0c707cb7e0416c62a1cf03dcdb0384bc0b2dbda7e05efe738ec"},
{file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a6c35f272ec9c430568dc8c1c30cb873f6bc96be2c79795e0bce6db4e0e101d"},
{file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1df0f9e9239132a231c86ae4f545ec2b55409fa44470692fcfb36b1bd00157ad"},
{file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d2c51955329bfccf99ae26f63d5928bf5be9fcfcd9f458f6847fd4b7e2b8986c"},
{file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:3c522f462d9fc504f2ea8d82e44aa580e60566acc754422c829ad75c752fbf8d"},
{file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d8a52fc50ded60d81117d7647f262c529659fb21d23e14ebfd0b35efa4f1b83d"},
{file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:04dbdfb0f0bfd3f99cf1e9e24fadc6ded2736d7933f32f1151b0f2abb38f9a25"},
{file = "rapidfuzz-3.9.4-cp38-cp38-win32.whl", hash = "sha256:4968c8bd1df84b42f382549e6226710ad3476f976389839168db3e68fd373298"},
{file = "rapidfuzz-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3fe4545f89f8d6c27b6bbbabfe40839624873c08bd6700f63ac36970a179f8f5"},
{file = "rapidfuzz-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f256c8fb8f3125574c8c0c919ab0a1f75d7cba4d053dda2e762dcc36357969d"},
{file = "rapidfuzz-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fdc09cf6e9d8eac3ce48a4615b3a3ee332ea84ac9657dbbefef913b13e632f"},
{file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d395d46b80063d3b5d13c0af43d2c2cedf3ab48c6a0c2aeec715aa5455b0c632"},
{file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa714fb96ce9e70c37e64c83b62fe8307030081a0bfae74a76fac7ba0f91715"},
{file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc1a0f29f9119be7a8d3c720f1d2068317ae532e39e4f7f948607c3a6de8396"},
{file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6022674aa1747d6300f699cd7c54d7dae89bfe1f84556de699c4ac5df0838082"},
{file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb72e5f9762fd469701a7e12e94b924af9004954f8c739f925cb19c00862e38"},
{file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad04ae301129f0eb5b350a333accd375ce155a0c1cec85ab0ec01f770214e2e4"},
{file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f46a22506f17c0433e349f2d1dc11907c393d9b3601b91d4e334fa9a439a6a4d"},
{file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:01b42a8728c36011718da409aa86b84984396bf0ca3bfb6e62624f2014f6022c"},
{file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e590d5d5443cf56f83a51d3c4867bd1f6be8ef8cfcc44279522bcef3845b2a51"},
{file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c72078b5fdce34ba5753f9299ae304e282420e6455e043ad08e4488ca13a2b0"},
{file = "rapidfuzz-3.9.4-cp39-cp39-win32.whl", hash = "sha256:f75639277304e9b75e6a7b3c07042d2264e16740a11e449645689ed28e9c2124"},
{file = "rapidfuzz-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e81e27e8c32a1e1278a4bb1ce31401bfaa8c2cc697a053b985a6f8d013df83ec"},
{file = "rapidfuzz-3.9.4-cp39-cp39-win_arm64.whl", hash = "sha256:15bc397ee9a3ed1210b629b9f5f1da809244adc51ce620c504138c6e7095b7bd"},
{file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:20488ade4e1ddba3cfad04f400da7a9c1b91eff5b7bd3d1c50b385d78b587f4f"},
{file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e61b03509b1a6eb31bc5582694f6df837d340535da7eba7bedb8ae42a2fcd0b9"},
{file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098d231d4e51644d421a641f4a5f2f151f856f53c252b03516e01389b2bfef99"},
{file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17ab8b7d10fde8dd763ad428aa961c0f30a1b44426e675186af8903b5d134fb0"},
{file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e272df61bee0a056a3daf99f9b1bd82cf73ace7d668894788139c868fdf37d6f"},
{file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6481e099ff8c4edda85b8b9b5174c200540fd23c8f38120016c765a86fa01f5"},
{file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ad61676e9bdae677d577fe80ec1c2cea1d150c86be647e652551dcfe505b1113"},
{file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:af65020c0dd48d0d8ae405e7e69b9d8ae306eb9b6249ca8bf511a13f465fad85"},
{file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d38b4e026fcd580e0bda6c0ae941e0e9a52c6bc66cdce0b8b0da61e1959f5f8"},
{file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f74ed072c2b9dc6743fb19994319d443a4330b0e64aeba0aa9105406c7c5b9c2"},
{file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee5f6b8321f90615c184bd8a4c676e9becda69b8e4e451a90923db719d6857c"},
{file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a555e3c841d6efa350f862204bb0a3fea0c006b8acc9b152b374fa36518a1c6"},
{file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0772150d37bf018110351c01d032bf9ab25127b966a29830faa8ad69b7e2f651"},
{file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:addcdd3c3deef1bd54075bd7aba0a6ea9f1d01764a08620074b7a7b1e5447cb9"},
{file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe86b82b776554add8f900b6af202b74eb5efe8f25acdb8680a5c977608727f"},
{file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0fc91ac59f4414d8542454dfd6287a154b8e6f1256718c898f695bdbb993467"},
{file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a944e546a296a5fdcaabb537b01459f1b14d66f74e584cb2a91448bffadc3c1"},
{file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fb96ba96d58c668a17a06b5b5e8340fedc26188e87b0d229d38104556f30cd8"},
{file = "rapidfuzz-3.9.4.tar.gz", hash = "sha256:366bf8947b84e37f2f4cf31aaf5f37c39f620d8c0eddb8b633e6ba0129ca4a0a"},
]
[package.extras]
full = ["numpy"]
[package.source]
type = "legacy"
url = "https://pypi.org/simple"
reference = "offical-source"
[[package]] [[package]]
name = "requests" name = "requests"
version = "2.32.3" version = "2.32.3"
@ -4113,65 +4351,65 @@ reference = "offical-source"
[[package]] [[package]]
name = "sqlalchemy" name = "sqlalchemy"
version = "2.0.30" version = "2.0.31"
description = "Database Abstraction Library" description = "Database Abstraction Library"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"},
{file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"},
{file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"},
{file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"},
{file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"},
{file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"},
{file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"},
{file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"},
{file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"},
] ]
[package.dependencies] [package.dependencies]
aiosqlite = {version = "*", optional = true, markers = "extra == \"aiosqlite\""} aiosqlite = {version = "*", optional = true, markers = "extra == \"aiosqlite\""}
greenlet = {version = "!=0.4.17", optional = true, markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\" or extra == \"aiosqlite\""} greenlet = {version = "!=0.4.17", optional = true, markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") or extra == \"aiosqlite\""}
typing-extensions = {version = ">=4.6.0", optional = true, markers = "extra == \"aiosqlite\""} typing-extensions = {version = ">=4.6.0", optional = true, markers = "extra == \"aiosqlite\""}
[package.extras] [package.extras]
@ -4321,13 +4559,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "tomlkit" name = "tomlkit"
version = "0.12.5" version = "0.13.0"
description = "Style preserving TOML library" description = "Style preserving TOML library"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"},
{file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"},
] ]
[package.source] [package.source]
@ -4541,13 +4779,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "2.2.1" version = "2.2.2"
description = "HTTP library with thread-safe connection pooling, file post, and more." description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
{file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
] ]
[package.extras] [package.extras]
@ -4643,13 +4881,13 @@ reference = "offical-source"
[[package]] [[package]]
name = "virtualenv" name = "virtualenv"
version = "20.26.2" version = "20.26.3"
description = "Virtual Python Environment builder" description = "Virtual Python Environment builder"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"},
{file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"},
] ]
[package.dependencies] [package.dependencies]
@ -5014,4 +5252,4 @@ yaml = []
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.10,<4.0.0" python-versions = ">=3.10,<4.0.0"
content-hash = "beac69393abcc2ef55d851f8ef5d8e2928f6c30d8ec1924ebbb9f15d95471b21" content-hash = "f803840e2fcf6c5731e3bf842cf898125c464ce52ac4fbbb960258c026407110"

View File

@ -23,7 +23,6 @@ classifiers = [
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.10,<4.0.0" python = ">=3.10,<4.0.0"
beautifulsoup4 = ">=4.12.3" beautifulsoup4 = ">=4.12.3"
expiringdict = "^1.2.2"
feedparser = "^6.0.11" feedparser = "^6.0.11"
httpx = ">=0.27.0" httpx = ">=0.27.0"
nonebot2 = { extras = ["fastapi"], version = "^2.3.2" } nonebot2 = { extras = ["fastapi"], version = "^2.3.2" }
@ -40,6 +39,9 @@ qrcode = "^7.4.2"
pydantic = ">=1.10.17,<3.0.0,!=2.5.0,!=2.5.1" pydantic = ">=1.10.17,<3.0.0,!=2.5.0,!=2.5.1"
lxml = ">=5.2.2" lxml = ">=5.2.2"
yarl = ">=1.9.4" yarl = ">=1.9.4"
hishel = "^0.0.20"
expiringdictx = "^1.0.1"
rapidfuzz = "^3.9.3"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
black = ">=23.12.1,<25.0" black = ">=23.12.1,<25.0"

View File

@ -1,5 +1,6 @@
import sys import sys
from pathlib import Path from pathlib import Path
from shutil import rmtree
import pytest import pytest
import nonebot import nonebot
@ -67,6 +68,11 @@ async def app(tmp_path: Path, request: pytest.FixtureRequest, mocker: MockerFixt
# 关闭渲染图片时打开的浏览器 # 关闭渲染图片时打开的浏览器
await shutdown_browser() await shutdown_browser()
# 清除缓存文件
cache_dir = Path.cwd() / ".cache" / "hishel"
if cache_dir.exists():
rmtree(cache_dir)
cache_dir.mkdir()
@pytest.fixture() @pytest.fixture()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,181 @@
[
{
"datasource": "明日方舟公告-IOS",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/a54d411b-2eb0-4ca8-aa1d-02c68b2f152f",
"timestamp": {
"platform": 1708531200000,
"platform_precision": "day",
"fetcher": 1708588811293
},
"default_cookie": {
"text": "【联合行动】\n定向寻访开启",
"images": [
{
"origin_url": "https://web.hycdn.cn/announce/images/20240221/4542667b6a3b799d52759d2f5744aa1a.jpg",
"compress_url": null
}
]
},
"item": {
"id": "8378",
"url": "https://cdn.ceobecanteen.top/game/bulletin/8378_1708588811341",
"category": "活动公告",
"display_type": 2,
"target_type": "game|recruit|param1=norm|unknown",
"target_link": "uniwebview://move?target=recruit&param1=NORM_47_0_3"
},
"source": {
"type": "arknights-game:bulletin-list",
"data": "IOS"
}
},
{
"datasource": "明日方舟公告-B服",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/92773ca6-5c6f-41a6-9004-a2d8328c159f",
"timestamp": {
"platform": 1708012800000,
"platform_precision": "day",
"fetcher": 1708074005605
},
"default_cookie": {
"text": "#04「引航者试炼」限时活动即将开启\n[图片]一、#04「引航者试炼」限时活动开启\n关卡开放时间02月22日 16:00 - 03月07日 03:59\n解锁条件通关主线1-10\n活动说明活动期间将开放「引航者试炼」限时活动玩家可通过活动关卡作战、完成“试炼任务”积累试炼经验提升【试炼之路】等级获取相应活动奖励\n\n【试炼之路】开放时间02月22日 16:00 - 03月10日 03:59\n【试炼之路】主要奖励时装【0011制造系列 - “贺新禧” -清流】、寻访凭证、模组养成材料、高级养成素材、作战记录、龙门币、家具零件等\n\n\n[图片]二、【联合行动】特选干员定向寻访开启\n活动时间02月22日 16:00 - 03月07日 03:59\n活动说明活动期间【联合行动】特选干员定向寻访开启该寻访卡池列表中六星干员与五星干员仅出现以下干员\n★★★★★★6★出率2%):玛恩纳 / 仇白 / 琳琅诗怀雅 / 山 \n★★★★★5★出率8%):火哨 / 绮良 / 熔泉 / 蜜蜡 / 絮雨 / 安哲拉\n注意本次活动【联合行动】寻访为【标准寻访】\n\n\n[图片]三、组合包限时上架\n售卖时间02月28日 11:00 - 03月29日 03:59\n活动说明活动期间采购中心将限时售卖以下组合包\n\n\n[冬隐归路组合包]\n组合包内容时装【忒斯特收藏系列 - “初晴” -陈】、音乐可交互家具【“冰痕” 】、可交互家具【近卫局广告机】、头像“白兔子”*1、高级资深干员特训装置*1、资深干员特训装置*1、十连寻访凭证*1\n高级资深干员特训装置使用该特训装置后可选择一名已晋升至精英阶段2的6星干员直接升至精英阶段2等级90。干员升级后不会返还已投入的养成资源\n资深干员特训装置使用该特训装置后可选择一名已晋升至精英阶段2的5星干员直接升至精英阶段2等级80。干员升级后不会返还已投入的养成资源\n\n\n[图片][黎明前奏组合包]\n组合包内容时装【忒斯特收藏系列 - “午夜邮差” -能天使】、主题家具【龙门风情茶室】、头像“徘徊歧路”*1、十连寻访凭证*1、龙门币*200000、高级作战记录*60、技巧概要·卷3*30\n注意此前已购买过[黎明前奏组合包]的玩家无法再次购买该礼包\n\n\n[图片]四、【时代】系列,限时复刻上架\n活动时间02月29日 16:00 - 03月14日 03:59\n活动说明活动期间以下干员复刻时装将在时装商店上架并进行限时贩售\n◆【时代】系列 - “拾翼” - 见行者\n\n\n[图片]五、剿灭作战关卡【新旅店大道】追加\n开启时间03月04日 04:00 ~ 04月29日 03:59\n开启条件所有通关主线2-8的玩家\n关卡说明新增剿灭委托关卡【新旅店大道】将替换现有剿灭委托关卡【千嶂边城】现剿灭委托关卡【千嶂边城】将在关闭后收录进假定作战目标\n\n\n\n更多活动内容请持续关注《明日方舟》游戏内公告及官方公告。\n\n\n【明日方舟】运营组\n2024年02月16日",
"images": [
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/e52fcb18976c4373a60cfa2316c28ccf.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/8d135717510cb847034eb88ffb95bf97.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/60e94ad12ce32408b5bbbbe9ad20c168.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/eaa6f41fe718f4556a1eb3fe8ef90040.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/9917b74ab2b5f42bc4a185c60f95365c.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/e422fc4ad9d3daa5cdabcc5d09142e1f.jpg",
"compress_url": null
}
]
},
"item": {
"id": "4959",
"url": "https://cdn.ceobecanteen.top/game/bulletin/4959_1708074005815",
"category": "活动公告",
"display_type": 1
},
"source": {
"type": "arknights-game:bulletin-list",
"data": "Bilibili"
}
},
{
"datasource": "明日方舟-官网",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/0e9fbb0a-0504-4bf7-ae06-daf1dbd00820",
"timestamp": {
"platform": 1708012800000,
"platform_precision": "day",
"fetcher": 1708012800000
},
"default_cookie": {
"text": "[活动预告]#04「引航者试炼」限时活动即将开启\n[图片]一、#04「引航者试炼」限时活动开启\n关卡开放时间02月22日 16:00 - 03月07日 03:59\n解锁条件通关主线1-10\n活动说明活动期间将开放「引航者试炼」限时活动玩家可通过活动关卡作战、完成“试炼任务”积累试炼经验提升【试炼之路】等级获取相应活动奖励\n\n【试炼之路】开放时间02月22日 16:00 - 03月10日 03:59\n【试炼之路】主要奖励时装【0011制造系列 - “贺新禧” -清流】、寻访凭证、模组养成材料、高级养成素材、作战记录、龙门币、家具零件等\n\n\n[图片]二、【联合行动】特选干员定向寻访开启\n活动时间02月22日 16:00 - 03月07日 03:59\n活动说明活动期间【联合行动】特选干员定向寻访开启该寻访卡池列表中六星干员与五星干员仅出现以下干员\n★★★★★★6★出率2%):玛恩纳 / 仇白 / 琳琅诗怀雅 / 山 \n★★★★★5★出率8%):火哨 / 绮良 / 熔泉 / 蜜蜡 / 絮雨 / 安哲拉\n注意本次活动【联合行动】寻访为【标准寻访】\n\n\n[图片]三、组合包限时上架\n售卖时间02月28日 11:00 - 03月29日 03:59\n活动说明活动期间采购中心将限时售卖以下组合包\n\n\n[冬隐归路组合包]\n组合包内容时装【忒斯特收藏系列 - “初晴” -陈】、音乐可交互家具【“冰痕” 】、可交互家具【近卫局广告机】、头像“白兔子”*1、高级资深干员特训装置*1、资深干员特训装置*1、十连寻访凭证*1\n高级资深干员特训装置使用该特训装置后可选择一名已晋升至精英阶段2的6星干员直接升至精英阶段2等级90。干员升级后不会返还已投入的养成资源\n资深干员特训装置使用该特训装置后可选择一名已晋升至精英阶段2的5星干员直接升至精英阶段2等级80。干员升级后不会返还已投入的养成资源\n\n\n[图片][黎明前奏组合包]\n组合包内容时装【忒斯特收藏系列 - “午夜邮差” -能天使】、主题家具【龙门风情茶室】、头像“徘徊歧路”*1、十连寻访凭证*1、龙门币*200000、高级作战记录*60、技巧概要·卷3*30\n注意此前已购买过[黎明前奏组合包]的玩家无法再次购买该礼包\n\n\n[图片]四、【时代】系列,限时复刻上架\n活动时间02月29日 16:00 - 03月14日 03:59\n活动说明活动期间以下干员复刻时装将在时装商店上架并进行限时贩售\n◆【时代】系列 - “拾翼” - 见行者\n\n\n[图片]五、剿灭作战关卡【新旅店大道】追加\n开启时间03月04日 04:00 ~ 04月29日 03:59\n开启条件所有通关主线2-8的玩家\n关卡说明新增剿灭委托关卡【新旅店大道】将替换现有剿灭委托关卡【千嶂边城】现剿灭委托关卡【千嶂边城】将在关闭后收录进假定作战目标\n\n\n\n更多活动内容请持续关注《明日方舟》游戏内公告及官方公告。\n\n\n\n【明日方舟】运营组\n2024年02月16日",
"images": [
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/e52fcb18976c4373a60cfa2316c28ccf.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/8d135717510cb847034eb88ffb95bf97.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/60e94ad12ce32408b5bbbbe9ad20c168.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/eaa6f41fe718f4556a1eb3fe8ef90040.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/9917b74ab2b5f42bc4a185c60f95365c.jpg",
"compress_url": null
},
{
"origin_url": "https://web.hycdn.cn/announce/images/20240216/e422fc4ad9d3daa5cdabcc5d09142e1f.jpg",
"compress_url": null
}
]
},
"item": {
"id": "news/2024021210",
"url": "https://ak.hypergryph.com/news/2024021210.html",
"category": "活动",
"is_top": true
},
"source": {
"type": "arknights-website:official-website",
"data": "-"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698141633000,
"platform_precision": "second",
"fetcher": 1698141802505
},
"default_cookie": {
"text": "【采购凭证区-新增干员】\n//折光\n“左手或右手的名片请问您要哪一张......宝石鉴定师,折光,很高兴认识您。别担心,选到另一张的话,您这里也没有值得我下手的对象。”\n\n__________________\n两名贵族侍从在宝石鉴定所的工作台前窃窃私语。唱片在留声机上旋转着乐声恰到好处地盖过了他们的谈话声也盖过了砂盘打磨宝石的单调噪音。\n如果是在几个月以前他们会就各自带来的古董珠宝高谈阔论——纹饰的象征数百年历史留下的痕迹自己效忠的贵族那悠久高贵的血脉——而非如此小心谨慎地说起该如何伪装一枚宝石才能保证不被那位大盗“折光”盯上。他们声称见过大盗本人带着宝石一起从高塔上坠下又消失不见而后义愤填膺怎能让莱塔尼亚格调优雅的精粹轻易消失怎能容忍一个疯子将历史抛进夜幕\n工作台后的宝石鉴定师始终专注地做着自己手上的工作对他们的议论充耳不闻。两名侍从对他的懂事十分满意在谈话告一段落后不吝用自己的华丽辞藻赞誉鉴定师手中的宝石。\n“这宝石如此灿烂辉煌是哪位尊敬的大人托你打造”\n宝石鉴定师终于抬起头表情困惑无比。\n“不这只是一块玻璃碎片我自己随便磨着玩的。两位聊完了的话请说说来这家小小的鉴定所是有何吩咐吧。”",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/f69f2d2570c828955130b1d77c2dc047161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/8d9c849b7a4fed9c8979014a507e26fa161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/67c2bc7661c4db3d5bbe812c69978134161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/6c0a5a7a50ac84454ffd4d72a6f77f7b161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b77f74f545dba41e473bb5e544f7ed80161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/14d5dae139477c4e8a8f54272ff26407161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/518b982b56d934b6e4ffb91a6ec71f35161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "856000867726262307",
"url": "https://t.bilibili.com/856000867726262307",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
}
]

View File

@ -0,0 +1,7 @@
{
"code": "00000",
"message": "Operate Success",
"data": {
"datasource_comb_id": "2"
}
}

View File

@ -0,0 +1,7 @@
{
"code": "00000",
"message": "Operate Success",
"data": {
"datasource_comb_id": "4"
}
}

View File

@ -0,0 +1,4 @@
{
"cookie_id": "6537ad363b4a4fd2d7919ac2",
"update_cookie_id": "6537ad363b4a4fd2d7919ac2"
}

View File

@ -0,0 +1,4 @@
{
"cookie_id": "6537ad363b4a4fd2d7919ac3",
"update_cookie_id": "6537ad363b4a4fd2d7919ac2"
}

View File

@ -0,0 +1,380 @@
{
"code": "00000",
"message": "Operate Success",
"data": {
"cookies": [
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698141633000,
"platform_precision": "second",
"fetcher": 1698141802505
},
"default_cookie": {
"text": "【采购凭证区-新增干员】\n//折光\n“左手或右手的名片请问您要哪一张......宝石鉴定师,折光,很高兴认识您。别担心,选到另一张的话,您这里也没有值得我下手的对象。”\n\n__________________\n两名贵族侍从在宝石鉴定所的工作台前窃窃私语。唱片在留声机上旋转着乐声恰到好处地盖过了他们的谈话声也盖过了砂盘打磨宝石的单调噪音。\n如果是在几个月以前他们会就各自带来的古董珠宝高谈阔论——纹饰的象征数百年历史留下的痕迹自己效忠的贵族那悠久高贵的血脉——而非如此小心谨慎地说起该如何伪装一枚宝石才能保证不被那位大盗“折光”盯上。他们声称见过大盗本人带着宝石一起从高塔上坠下又消失不见而后义愤填膺怎能让莱塔尼亚格调优雅的精粹轻易消失怎能容忍一个疯子将历史抛进夜幕\n工作台后的宝石鉴定师始终专注地做着自己手上的工作对他们的议论充耳不闻。两名侍从对他的懂事十分满意在谈话告一段落后不吝用自己的华丽辞藻赞誉鉴定师手中的宝石。\n“这宝石如此灿烂辉煌是哪位尊敬的大人托你打造”\n宝石鉴定师终于抬起头表情困惑无比。\n“不这只是一块玻璃碎片我自己随便磨着玩的。两位聊完了的话请说说来这家小小的鉴定所是有何吩咐吧。”",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/f69f2d2570c828955130b1d77c2dc047161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/8d9c849b7a4fed9c8979014a507e26fa161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/67c2bc7661c4db3d5bbe812c69978134161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/6c0a5a7a50ac84454ffd4d72a6f77f7b161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b77f74f545dba41e473bb5e544f7ed80161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/14d5dae139477c4e8a8f54272ff26407161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/518b982b56d934b6e4ffb91a6ec71f35161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "856000867726262307",
"url": "https://t.bilibili.com/856000867726262307",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698134603000,
"platform_precision": "second",
"fetcher": 1698134630170
},
"default_cookie": {
"text": "【活动奖励家具预告】\n//“扬升”\n“踏上扬升之阶我心意已决。”",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/e33791e1c150aa729ca02878b031c01e161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/d625e658b390073980d11309897c1d76161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855970674108268553",
"url": "https://t.bilibili.com/855970674108268553",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698131537000,
"platform_precision": "second",
"fetcher": 1698132050175
},
"default_cookie": {
"text": "【采购凭证区-新增干员】\n//跃跃\n“跃跃或者随你怎么叫都行能站在你面前还不够证明我的本事吗今后我就替你做事啦好好期待吧你可别让我腻了哦。”\n\n__________________\n“据统计自跃跃来到罗德岛后本舰报告违反管理条例的事件数量环比上升了七个百分点。”\n从外表上看跃跃是一位活泼热情的少女任何人都会情不自禁地被她的欢快所感染卸下心防答应她一两个诚恳的请求。一旦到了这一步恭喜你已经落入她的圈套了。\n不相信那你就等着看吧接下来你将会亲眼见证自己的生活是如何失控的在假期莫名其妙地走回了工作室终端一直响个不停各种麻烦事突然找上了你背包里忽然钻出了磐蟹。在你手忙脚乱应付的时候不知不觉就将薄荷糖放进了碳酸饮料中......\n更恐怖的是跃跃擅长扮演无辜的旁观者。许多时候受害者深陷其中丝毫没意识到已经被她玩弄于股掌。\n不、不......不能再让这种事发生了!\n终于......好消息是,我已经找到了如何应对跃跃的办法。只要在见面时给她一盒糖果,她就不会再影响你。如果还是行不通的话,就请她吃一顿大餐吧。以上方法我都亲身验证过,绝对有效......总感觉有哪里不对?",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/4d6eabaab21ed5fa0d674b229da78a03161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/6ae42edd4db9ea8dd4cc3b33541ac847161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/9d1519a642dd2787371b6d798c2ac0b4161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/c1dfbe157323806e6efe64a3013ddd0e161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/300619c777d32d522d383cb5d47743d0161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/f596b22577f27c61bd9df8a3489d5d4b161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/e9413a3820591ce41339901a804cb750161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855957505749024787",
"url": "https://t.bilibili.com/855957505749024787",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698116415000,
"platform_precision": "second",
"fetcher": 1698116927814
},
"default_cookie": {
"text": "《明日方舟》特别映像 [萨尔贡:万王之王]\n欢迎你们追寻传说而来的客人\n今天的主角是被尊为“沙阿”的过去与未来之王——\n路加萨尔古斯",
"images": [
{
"origin_url": "http://i0.hdslb.com/bfs/archive/b4da4ed5f5911f9cb4914973ef64ddd6b816fbe8.jpg",
"compress_url": null
}
]
},
"item": {
"id": "855892557268254720",
"url": "https://www.bilibili.com/video/BV1Zw411B7K2",
"type": "DYNAMIC_TYPE_AV",
"is_top": false,
"is_retweeted": false,
"aid": "322515082",
"bvid": "BV1Zw411B7K2"
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698113396000,
"platform_precision": "second",
"fetcher": 1698113460137
},
"default_cookie": {
"text": "《明日方舟》特别映像 [谢拉格:驶向未来]\n在遥远的高山上有一个国家\n它的名字叫谢拉格",
"images": [
{
"origin_url": "http://i2.hdslb.com/bfs/archive/2666220c595dcc3a2d165bb8499fdcb2b9323178.jpg",
"compress_url": null
}
]
},
"item": {
"id": "855879590736822277",
"url": "https://www.bilibili.com/video/BV1oQ4y1p7oi",
"type": "DYNAMIC_TYPE_AV",
"is_top": false,
"is_retweeted": false,
"aid": "705053598",
"bvid": "BV1oQ4y1p7oi"
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698060616000,
"platform_precision": "second",
"fetcher": 1698060775227
},
"default_cookie": {
"text": "【活动奖励服饰】\n//星橼林 - 流星\nEPOQUE子品牌 [昔时/Passe]系列精选款/星橼林。流星还在卡西米尔时所着的冬装。兼顾轻便与防寒,于密林中的隐蔽性也很高。复原品。\n\n_____________\n星橼树只生长在卡西米尔。在它们尚有记忆的时候守林人温暖、安全就像家乡。",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/0650692b71afe7d01c6f855ae1f526af161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/9db6fa64eda5f227ab7bdfbb31b66bc7161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/c84ce858eb4688078a5185dbe9ed21f6161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/d2fc7f730d596130eedf0eab75190acc161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855652902373425173",
"url": "https://t.bilibili.com/855652902373425173",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698055205000,
"platform_precision": "second",
"fetcher": 1698055273578
},
"default_cookie": {
"text": "【新增家具】\n//秋日乐器行\n音乐爱好者们干脆将莱塔尼亚的乐器行搬上了罗德岛。这里不仅按莱塔尼亚风格装点乐器也一应俱全——既要身临其境也要声如其境。\n\n_________________\n新增【秋日乐器行】主题家具限时上架\n家具商店贩售时间11月1日16:00 - 11月29日03:59",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/54ff0594e25034440b7a0a07ac4865fe161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/bef297fa00abad3e8006b6fb92a46ff6161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/3d1046af7346b4797bc4eb0b6e8bbebb161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/d74379253b4284bedf67b4da502db5c7161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/4b28c8a7f3146d27010c24ac96689149161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/9a629bd1343f0fd0c47f207cbdc60d8a161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855629657997836359",
"url": "https://t.bilibili.com/855629657997836359",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698053400000,
"platform_precision": "second",
"fetcher": 1698054139571
},
"default_cookie": {
"text": "【新增家具】\n//路德维格大学讲演厅\n根据止颂的描述还原的路德维格大学讲演厅求知者们的豪言在厅中回响。“上前来踏入求知的殿堂”\n\n_________________\n新增【路德维格大学讲演厅】主题家具限时上架\n家具商店贩售时间11月1日16:00 - 11月29日03:59",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/e5b562e04a6cdcd7a9d2cc9e8ac709b6161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/8b65e92b5fcf2aabf4ff3c881abc4ea5161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b05921d44739fb32642fc99beac63e01161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/072aaab691f0ad134053ad5a1d3f82a8161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/3a369d1bb793c9d46ae85c137f839f5d161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b22c226e5435eb2e32e427386f545cd4161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855621909896757268",
"url": "https://t.bilibili.com/855621909896757268",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698030013000,
"platform_precision": "second",
"fetcher": 1698030038868
},
"default_cookie": {
"text": "《明日方舟》特别映像 [莱塔尼亚源石技艺A1.1]\n你们都拿到教学大纲了很好。\n以防你们还没发现\n这节课教的是源石技艺\n我们会从莱塔尼亚的主要流派讲起。",
"images": [
{
"origin_url": "http://i1.hdslb.com/bfs/archive/a26990582b47031db6b90c06b528961f647a7580.jpg",
"compress_url": null
}
]
},
"item": {
"id": "855521463478780000",
"url": "https://www.bilibili.com/video/BV1tw411z7GA",
"type": "DYNAMIC_TYPE_AV",
"is_top": false,
"is_retweeted": false,
"aid": "322614860",
"bvid": "BV1tw411z7GA"
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
}
],
"next_page_id": "6535d4903b4a4fd2d7919aa6"
}
}

View File

@ -0,0 +1,413 @@
{
"code": "00000",
"message": "Operate Success",
"data": {
"cookies": [
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698147618000,
"platform_precision": "second",
"fetcher": 1698147638150
},
"default_cookie": {
"text": "【新增服饰】\n//正午余光 - 苦艾\nEPOQUE子品牌 [昔时/Passe]系列精选款/正午余光。苦艾曾经的校服。在乌萨斯,学生穿校服出操,就像是跟在一把犁后面一行整齐的秧苗。\n\n_____________\n只可惜阳光能照在这把犁上的时间总是太短了。但这样的事那个春天之前的她还不明白。",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/62e053ba7efc18f15bfd195e2d2de984161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/590a69665209ac220ea8a57f749d5267161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "856026573106577497",
"url": "https://t.bilibili.com/856026573106577497",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698141633000,
"platform_precision": "second",
"fetcher": 1698141802505
},
"default_cookie": {
"text": "【采购凭证区-新增干员】\n//折光\n“左手或右手的名片请问您要哪一张......宝石鉴定师,折光,很高兴认识您。别担心,选到另一张的话,您这里也没有值得我下手的对象。”\n\n__________________\n两名贵族侍从在宝石鉴定所的工作台前窃窃私语。唱片在留声机上旋转着乐声恰到好处地盖过了他们的谈话声也盖过了砂盘打磨宝石的单调噪音。\n如果是在几个月以前他们会就各自带来的古董珠宝高谈阔论——纹饰的象征数百年历史留下的痕迹自己效忠的贵族那悠久高贵的血脉——而非如此小心谨慎地说起该如何伪装一枚宝石才能保证不被那位大盗“折光”盯上。他们声称见过大盗本人带着宝石一起从高塔上坠下又消失不见而后义愤填膺怎能让莱塔尼亚格调优雅的精粹轻易消失怎能容忍一个疯子将历史抛进夜幕\n工作台后的宝石鉴定师始终专注地做着自己手上的工作对他们的议论充耳不闻。两名侍从对他的懂事十分满意在谈话告一段落后不吝用自己的华丽辞藻赞誉鉴定师手中的宝石。\n“这宝石如此灿烂辉煌是哪位尊敬的大人托你打造”\n宝石鉴定师终于抬起头表情困惑无比。\n“不这只是一块玻璃碎片我自己随便磨着玩的。两位聊完了的话请说说来这家小小的鉴定所是有何吩咐吧。”",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/f69f2d2570c828955130b1d77c2dc047161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/8d9c849b7a4fed9c8979014a507e26fa161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/67c2bc7661c4db3d5bbe812c69978134161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/6c0a5a7a50ac84454ffd4d72a6f77f7b161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b77f74f545dba41e473bb5e544f7ed80161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/14d5dae139477c4e8a8f54272ff26407161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/518b982b56d934b6e4ffb91a6ec71f35161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "856000867726262307",
"url": "https://t.bilibili.com/856000867726262307",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698134603000,
"platform_precision": "second",
"fetcher": 1698134630170
},
"default_cookie": {
"text": "【活动奖励家具预告】\n//“扬升”\n“踏上扬升之阶我心意已决。”",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/e33791e1c150aa729ca02878b031c01e161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/d625e658b390073980d11309897c1d76161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855970674108268553",
"url": "https://t.bilibili.com/855970674108268553",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698131537000,
"platform_precision": "second",
"fetcher": 1698132050175
},
"default_cookie": {
"text": "【采购凭证区-新增干员】\n//跃跃\n“跃跃或者随你怎么叫都行能站在你面前还不够证明我的本事吗今后我就替你做事啦好好期待吧你可别让我腻了哦。”\n\n__________________\n“据统计自跃跃来到罗德岛后本舰报告违反管理条例的事件数量环比上升了七个百分点。”\n从外表上看跃跃是一位活泼热情的少女任何人都会情不自禁地被她的欢快所感染卸下心防答应她一两个诚恳的请求。一旦到了这一步恭喜你已经落入她的圈套了。\n不相信那你就等着看吧接下来你将会亲眼见证自己的生活是如何失控的在假期莫名其妙地走回了工作室终端一直响个不停各种麻烦事突然找上了你背包里忽然钻出了磐蟹。在你手忙脚乱应付的时候不知不觉就将薄荷糖放进了碳酸饮料中......\n更恐怖的是跃跃擅长扮演无辜的旁观者。许多时候受害者深陷其中丝毫没意识到已经被她玩弄于股掌。\n不、不......不能再让这种事发生了!\n终于......好消息是,我已经找到了如何应对跃跃的办法。只要在见面时给她一盒糖果,她就不会再影响你。如果还是行不通的话,就请她吃一顿大餐吧。以上方法我都亲身验证过,绝对有效......总感觉有哪里不对?",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/4d6eabaab21ed5fa0d674b229da78a03161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/6ae42edd4db9ea8dd4cc3b33541ac847161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/9d1519a642dd2787371b6d798c2ac0b4161775300.png",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/c1dfbe157323806e6efe64a3013ddd0e161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/300619c777d32d522d383cb5d47743d0161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/f596b22577f27c61bd9df8a3489d5d4b161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/e9413a3820591ce41339901a804cb750161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855957505749024787",
"url": "https://t.bilibili.com/855957505749024787",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698116415000,
"platform_precision": "second",
"fetcher": 1698116927814
},
"default_cookie": {
"text": "《明日方舟》特别映像 [萨尔贡:万王之王]\n欢迎你们追寻传说而来的客人\n今天的主角是被尊为“沙阿”的过去与未来之王——\n路加萨尔古斯",
"images": [
{
"origin_url": "http://i0.hdslb.com/bfs/archive/b4da4ed5f5911f9cb4914973ef64ddd6b816fbe8.jpg",
"compress_url": null
}
]
},
"item": {
"id": "855892557268254720",
"url": "https://www.bilibili.com/video/BV1Zw411B7K2",
"type": "DYNAMIC_TYPE_AV",
"is_top": false,
"is_retweeted": false,
"aid": "322515082",
"bvid": "BV1Zw411B7K2"
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698113396000,
"platform_precision": "second",
"fetcher": 1698113460137
},
"default_cookie": {
"text": "《明日方舟》特别映像 [谢拉格:驶向未来]\n在遥远的高山上有一个国家\n它的名字叫谢拉格",
"images": [
{
"origin_url": "http://i2.hdslb.com/bfs/archive/2666220c595dcc3a2d165bb8499fdcb2b9323178.jpg",
"compress_url": null
}
]
},
"item": {
"id": "855879590736822277",
"url": "https://www.bilibili.com/video/BV1oQ4y1p7oi",
"type": "DYNAMIC_TYPE_AV",
"is_top": false,
"is_retweeted": false,
"aid": "705053598",
"bvid": "BV1oQ4y1p7oi"
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698060616000,
"platform_precision": "second",
"fetcher": 1698060775227
},
"default_cookie": {
"text": "【活动奖励服饰】\n//星橼林 - 流星\nEPOQUE子品牌 [昔时/Passe]系列精选款/星橼林。流星还在卡西米尔时所着的冬装。兼顾轻便与防寒,于密林中的隐蔽性也很高。复原品。\n\n_____________\n星橼树只生长在卡西米尔。在它们尚有记忆的时候守林人温暖、安全就像家乡。",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/0650692b71afe7d01c6f855ae1f526af161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/9db6fa64eda5f227ab7bdfbb31b66bc7161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/c84ce858eb4688078a5185dbe9ed21f6161775300.gif",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/d2fc7f730d596130eedf0eab75190acc161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855652902373425173",
"url": "https://t.bilibili.com/855652902373425173",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698055205000,
"platform_precision": "second",
"fetcher": 1698055273578
},
"default_cookie": {
"text": "【新增家具】\n//秋日乐器行\n音乐爱好者们干脆将莱塔尼亚的乐器行搬上了罗德岛。这里不仅按莱塔尼亚风格装点乐器也一应俱全——既要身临其境也要声如其境。\n\n_________________\n新增【秋日乐器行】主题家具限时上架\n家具商店贩售时间11月1日16:00 - 11月29日03:59",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/54ff0594e25034440b7a0a07ac4865fe161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/bef297fa00abad3e8006b6fb92a46ff6161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/3d1046af7346b4797bc4eb0b6e8bbebb161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/d74379253b4284bedf67b4da502db5c7161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/4b28c8a7f3146d27010c24ac96689149161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/9a629bd1343f0fd0c47f207cbdc60d8a161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855629657997836359",
"url": "https://t.bilibili.com/855629657997836359",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698053400000,
"platform_precision": "second",
"fetcher": 1698054139571
},
"default_cookie": {
"text": "【新增家具】\n//路德维格大学讲演厅\n根据止颂的描述还原的路德维格大学讲演厅求知者们的豪言在厅中回响。“上前来踏入求知的殿堂”\n\n_________________\n新增【路德维格大学讲演厅】主题家具限时上架\n家具商店贩售时间11月1日16:00 - 11月29日03:59",
"images": [
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/e5b562e04a6cdcd7a9d2cc9e8ac709b6161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/8b65e92b5fcf2aabf4ff3c881abc4ea5161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b05921d44739fb32642fc99beac63e01161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/072aaab691f0ad134053ad5a1d3f82a8161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/3a369d1bb793c9d46ae85c137f839f5d161775300.jpg",
"compress_url": null
},
{
"origin_url": "https://i0.hdslb.com/bfs/new_dyn/b22c226e5435eb2e32e427386f545cd4161775300.gif",
"compress_url": null
}
]
},
"item": {
"id": "855621909896757268",
"url": "https://t.bilibili.com/855621909896757268",
"type": "DYNAMIC_TYPE_DRAW",
"is_top": false,
"is_retweeted": false
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
},
{
"datasource": "明日方舟-B站",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"timestamp": {
"platform": 1698030013000,
"platform_precision": "second",
"fetcher": 1698030038868
},
"default_cookie": {
"text": "《明日方舟》特别映像 [莱塔尼亚源石技艺A1.1]\n你们都拿到教学大纲了很好。\n以防你们还没发现\n这节课教的是源石技艺\n我们会从莱塔尼亚的主要流派讲起。",
"images": [
{
"origin_url": "http://i1.hdslb.com/bfs/archive/a26990582b47031db6b90c06b528961f647a7580.jpg",
"compress_url": null
}
]
},
"item": {
"id": "855521463478780000",
"url": "https://www.bilibili.com/video/BV1tw411z7GA",
"type": "DYNAMIC_TYPE_AV",
"is_top": false,
"is_retweeted": false,
"aid": "322614860",
"bvid": "BV1tw411z7GA"
},
"source": {
"type": "bilibili:dynamic-by-uid",
"data": "161775300"
}
}
],
"next_page_id": "6535d4903b4a4fd2d7919aa6"
}
}

View File

@ -0,0 +1,77 @@
{
"code": "00000",
"message": "Operate Success",
"data": {
"cookies": [
{
"datasource": "明日方舟朝陇山-微博",
"icon": "https://cdn.ceobecanteen.top/datasource-avatar/90e2893a-4756-408d-9dc1-8ddec49bc7a3",
"timestamp": {
"platform": 1698729936000,
"platform_precision": "second",
"fetcher": 1698729954257
},
"default_cookie": {
"text": "感谢博士们的支持!目前【朝陇山休憩处】正在加急补货中!预计明日将补货完成。同时根据实际情况,现场可能会有临时名额开放,在附近的博士们可与门店工作人员确认开放情况。",
"images": null
},
"item": {
"id": "4962895416264794",
"url": "https://weibo.com/6441489862/NqocdqhL4",
"bid": "NqocdqhL4",
"type": null,
"is_long_text": false,
"is_top": false,
"is_retweeted": true,
"retweeted": {
"author_name": "明日方舟朝陇山",
"author_avatar": "https://wx4.sinaimg.cn/orj480/0071VPLMly8hgw53ei5zoj30go0go0tv.jpg",
"text": "〓明日方舟 朝陇山休憩处〓\n在某处地方来自泰拉各国的行商在这里歇脚并逐渐形成为一个固定休憩点。\n各位行商带来了风格迥异的纪念商品琳琅的商品堆满货架。\n今天兔兔为博士带来了休憩处的信息欢迎博士前来探索——\n\n【活动地点】\n上海市徐汇区肇嘉浜路1111号美罗城5",
"images": [
{
"origin_url": "https://wx4.sinaimg.cn/large/0071VPLMgy1hj4ca5ao3yj30dw0dwmzt.jpg",
"compress_url": "https://wx4.sinaimg.cn/orj360/0071VPLMgy1hj4ca5ao3yj30dw0dwmzt.jpg"
},
{
"origin_url": "https://wx4.sinaimg.cn/large/0071VPLMgy1hj4ca5bl7hj30dw0dw40s.jpg",
"compress_url": "https://wx4.sinaimg.cn/orj360/0071VPLMgy1hj4ca5bl7hj30dw0dw40s.jpg"
},
{
"origin_url": "https://wx1.sinaimg.cn/large/0071VPLMgy1hj4ca5aiwjj30dw0dw40v.jpg",
"compress_url": "https://wx1.sinaimg.cn/orj360/0071VPLMgy1hj4ca5aiwjj30dw0dw40v.jpg"
},
{
"origin_url": "https://wx2.sinaimg.cn/large/0071VPLMgy1hj4ca5ab41j30dw0dwmyo.jpg",
"compress_url": "https://wx2.sinaimg.cn/orj360/0071VPLMgy1hj4ca5ab41j30dw0dwmyo.jpg"
},
{
"origin_url": "https://wx1.sinaimg.cn/large/0071VPLMgy1hj4ca5iw9hj30dw0dwmz8.jpg",
"compress_url": "https://wx1.sinaimg.cn/orj360/0071VPLMgy1hj4ca5iw9hj30dw0dwmz8.jpg"
},
{
"origin_url": "https://wx2.sinaimg.cn/large/0071VPLMgy1hj4ca5a13hj30dw0dwjtj.jpg",
"compress_url": "https://wx2.sinaimg.cn/orj360/0071VPLMgy1hj4ca5a13hj30dw0dwjtj.jpg"
},
{
"origin_url": "https://wx1.sinaimg.cn/large/0071VPLMgy1hj4ca5dhutj30dw0dw768.jpg",
"compress_url": "https://wx1.sinaimg.cn/orj360/0071VPLMgy1hj4ca5dhutj30dw0dw768.jpg"
},
{
"origin_url": "https://wx3.sinaimg.cn/large/0071VPLMgy1hj4ca5eedaj30dw0dwwgf.jpg",
"compress_url": "https://wx3.sinaimg.cn/orj360/0071VPLMgy1hj4ca5eedaj30dw0dwwgf.jpg"
},
{
"origin_url": "https://wx4.sinaimg.cn/large/0071VPLMgy1hj4ca5egoqj30dw0dwmz9.jpg",
"compress_url": "https://wx4.sinaimg.cn/orj360/0071VPLMgy1hj4ca5egoqj30dw0dwmz9.jpg"
}
]
}
},
"source": {
"type": "weibo:dynamic-by-uid",
"data": "6441489862"
}
}
]
}
}

View File

@ -0,0 +1,348 @@
{
"code": "00000",
"message": "Operate Success",
"data": [
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "明日方舟-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/af174f25-1beb-41cd-a4de-2c3aadae9666",
"unique_id": "7d23708b-e424-418b-b4c4-43c370c3b6d0",
"db_unique_key": "161775300",
"jump_url": "https://space.bilibili.com/161775300"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "来自星尘-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/1c89736b-eda3-48d8-9620-b76470243e42",
"unique_id": "15121af1-6820-4777-8b24-3b8ae9982ecd",
"db_unique_key": "1883857209",
"jump_url": "https://space.bilibili.com/1883857209"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "鹰角网络-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/1db2fb70-91b4-406d-9dfc-5a65eab05cc0",
"unique_id": "ad35c9fa-0a73-4c13-89bf-f1f477ea43e4",
"db_unique_key": "598504181",
"jump_url": "https://space.bilibili.com/598504181"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "森空岛-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/c857622b-1700-4546-8e85-ae28b0479ce8",
"unique_id": "743fad9a-39f7-4b89-9a4e-33d69a43fd2d",
"db_unique_key": "7751894824",
"jump_url": "https://weibo.com/7751894824"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "森空岛-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/bdfcaeeb-314e-44bb-9997-0850bb4cbbb9",
"unique_id": "78a849e6-404c-4961-8d16-c2954dfda3c2",
"db_unique_key": "630840991",
"jump_url": "https://space.bilibili.com/630840991"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "明日方舟-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/6bf18e8d-0f8f-445b-b500-eef16fb17b68",
"unique_id": "c1c84fa5-9683-420b-a858-afcdaf69100b",
"db_unique_key": "6279793937",
"jump_url": "https://weibo.com/6279793937"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "明日方舟:终末地-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/1aeeb3fd-2573-49d3-bcbe-9de4eb4f768b",
"unique_id": "8cce7297-b7b9-4ec7-8311-4429ba5eb9a5",
"db_unique_key": "1265652806",
"jump_url": "https://space.bilibili.com/1265652806"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "明日方舟:终末地-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/fa8dbab7-0248-41f8-91b9-c9f55b0d9f53",
"unique_id": "cff7c521-45c6-4bd6-a435-7c7d6786810b",
"db_unique_key": "7745672941",
"jump_url": "https://weibo.com/7745672941"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "Wan顽子-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/b59fc905-bcd8-4d19-a787-56c1d7ea6878",
"unique_id": "45e5f0a8-00d4-4b5b-9d44-53c2fb3cdf7a",
"db_unique_key": "7712938090",
"jump_url": "https://weibo.com/7712938090"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "Wan顽子-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/176149ad-25ae-474b-aa1a-df3776f7070e",
"unique_id": "4f6e49d9-8df3-4af3-82e4-afc72b4eea82",
"db_unique_key": "1579053316",
"jump_url": "https://space.bilibili.com/1579053316"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "开拓芯COREBLAZER-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/b730d687-2571-4500-ba0c-16a5747535fc",
"unique_id": "6afbd6d3-31cf-485d-a46b-3fab76f568f9",
"db_unique_key": "7800541024",
"jump_url": "https://weibo.com/7800541024"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "乌柯塔界限OCTAVEDGE-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/9256d72d-09ce-4607-a402-de013d074b3d",
"unique_id": "7396af55-4c89-4804-9c0e-1669126f692a",
"db_unique_key": "7683268725",
"jump_url": "https://weibo.com/7683268725"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "乌柯塔界限OCTAVEDGE-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/90a7e8da-48d0-482e-931e-f94470e9f8ab",
"unique_id": "0b6633d7-43cc-4322-abf3-f16603c7bd64",
"db_unique_key": "1063074282",
"jump_url": "https://space.bilibili.com/1063074282"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "明日方舟朝陇山-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/90e2893a-4756-408d-9dc1-8ddec49bc7a3",
"unique_id": "e2d4c074-aeef-4bb2-a9f0-a47c2b66768b",
"db_unique_key": "6441489862",
"jump_url": "https://weibo.com/6441489862"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "CubesCollective-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/e4046802-9551-4b95-9ceb-8a2fd954a866",
"unique_id": "d77d55cc-79ae-4109-a374-6f890172c9cd",
"db_unique_key": "2123591088",
"jump_url": "https://space.bilibili.com/2123591088"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "重力井动画-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/7ca1bbce-949d-4833-b081-61e05dd773a7",
"unique_id": "b02a4c8a-7e75-4066-9239-be834584e97b",
"db_unique_key": "1554642444",
"jump_url": "https://space.bilibili.com/1554642444"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "重力井动画-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/0c6fca2a-b4a8-4700-a75d-1efcdf5195ee",
"unique_id": "163414af-549d-4fc8-97c7-2cb2d44ae0fa",
"db_unique_key": "7753678921",
"jump_url": "https://weibo.com/7753678921"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "CubesCollective-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/2d297dd8-cd42-4651-a535-2865446872e0",
"unique_id": "492c6477-016e-4b50-8ce4-5a745b0de850",
"db_unique_key": "7719744839",
"jump_url": "https://weibo.com/7719744839"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "一拾山-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/bdb5fd42-f295-4a00-a177-8dfd6ea7fee6",
"unique_id": "4cddb838-5db1-4b62-b86f-53a676a91769",
"db_unique_key": "7506039414",
"jump_url": "https://weibo.com/7506039414"
},
{
"platform": "netease-cloud-music",
"datasource": "netease-cloud-music:albums-by-artist",
"nickname": "塞壬唱片-网易云",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/1697a3c2-9b14-431c-83e0-3e1c082ec848",
"unique_id": "a3f18d47-ad2f-4912-93e5-5955d86b681a",
"db_unique_key": "32540734",
"jump_url": "https://music.163.com/#/artist/album?id=32540734"
},
{
"platform": "netease-cloud-music",
"datasource": "netease-cloud-music:albums-by-artist",
"nickname": "Cubes Collective-网易云",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/8e269272-e848-4760-8430-3f4c592bcfd8",
"unique_id": "d98999e7-51d1-4f5b-a150-3f0ef945dcfe",
"db_unique_key": "50653540",
"jump_url": "https://music.163.com/#/artist?id=50653540"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "泰拉记事社-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/c7dcd2d1-a380-4722-8dd4-e9cf4d4fb1e9",
"unique_id": "e70c9b5e-e6b4-4fc0-8ef4-71afb6d3b8e3",
"db_unique_key": "7499841383",
"jump_url": "https://weibo.com/7499841383"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "企鹅物流-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/e7b87a87-bc06-4521-804e-082b6626d446",
"unique_id": "8e4c6b1f-4d3e-46e5-8b89-d9c5257b3d61",
"db_unique_key": "2954409082",
"jump_url": "https://weibo.com/2954409082"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "鹰角网络-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/bb6ab09e-620d-4bfe-b899-4460cbeedee6",
"unique_id": "311cc0b3-e48c-42c0-a63c-38db366413f3",
"db_unique_key": "7461423907",
"jump_url": "https://weibo.com/7461423907"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "一拾山-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/086370ee-01b5-405a-9bef-5772a4314f58",
"unique_id": "7386f94d-e083-4330-919c-dd06b643615f",
"db_unique_key": "1096228210",
"jump_url": "https://space.bilibili.com/1096228210"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "来自星尘ExAstris-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/a483cfe8-f0cc-4515-8286-da52a9e396e4",
"unique_id": "b77198d6-17c9-4c71-bf8d-c39258b8f6a8",
"db_unique_key": "7697896274",
"jump_url": "https://weibo.com/u/7697896274"
},
{
"platform": "arknights-game",
"datasource": "arknights-game:version",
"nickname": "明日方舟版本-安卓",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/182a1df4-cb48-4faa-a90c-780e1cd378c1",
"unique_id": "8fc31e96-98e8-4a6e-94a6-544c1dd655f0",
"db_unique_key": "Android",
"jump_url": null
},
{
"platform": "arknights-game",
"datasource": "arknights-game:version",
"nickname": "明日方舟版本-IOS",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/90c1beab-cda7-4f33-9369-91bdf55807e0",
"unique_id": "c800b1b4-ee29-4922-be3d-bfec911a04ab",
"db_unique_key": "IOS",
"jump_url": null
},
{
"platform": "arknights-game",
"datasource": "arknights-game:version",
"nickname": "明日方舟版本-B服",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/767802e0-eafb-4fc3-a606-6346f7e62a02",
"unique_id": "bff61511-6104-4a15-970b-096a09fc08c9",
"db_unique_key": "Bilibili",
"jump_url": null
},
{
"platform": "arknights-website",
"datasource": "arknights-website:official-website",
"nickname": "明日方舟-官网",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/0e9fbb0a-0504-4bf7-ae06-daf1dbd00820",
"unique_id": "7c92944c-a669-4dd8-ada7-87e8fe60c20d",
"db_unique_key": "-",
"jump_url": "https://ak.hypergryph.com/#information"
},
{
"platform": "arknights-website",
"datasource": "arknights-website:terra-historicus",
"nickname": "泰拉记事社-官网",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/a1458614-8e8b-4cd4-8fdf-0a5d54c92225",
"unique_id": "0888a4bd-98b8-4be1-9820-4c7c9a2991e1",
"db_unique_key": "-",
"jump_url": "https://terra-historicus.hypergryph.com/"
},
{
"platform": "arknights-website",
"datasource": "arknights-website:monster-siren",
"nickname": "塞壬唱片-官网",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/6d1de55d-3356-4b5c-898f-679abac2d995",
"unique_id": "c905d094-080a-4ae1-877e-74bcd77ef68a",
"db_unique_key": "-",
"jump_url": "https://monster-siren.hypergryph.com/"
},
{
"platform": "arknights-game",
"datasource": "arknights-game:bulletin-list",
"nickname": "明日方舟公告-安卓",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/57819298-73fd-47af-8144-9860bbc5ff20",
"unique_id": "a0e1f9d0-f2de-4914-940e-7d09a63557c2",
"db_unique_key": "Android",
"jump_url": null
},
{
"platform": "arknights-game",
"datasource": "arknights-game:bulletin-list",
"nickname": "明日方舟公告-IOS",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/a54d411b-2eb0-4ca8-aa1d-02c68b2f152f",
"unique_id": "cce493e6-898f-4d1f-ad80-1f1cdf55428b",
"db_unique_key": "IOS",
"jump_url": null
},
{
"platform": "arknights-game",
"datasource": "arknights-game:bulletin-list",
"nickname": "明日方舟公告-B服",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/92773ca6-5c6f-41a6-9004-a2d8328c159f",
"unique_id": "45ed298b-b08b-4dc8-b93d-5314e019b6e7",
"db_unique_key": "Bilibili",
"jump_url": null
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "开拓芯-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/88c0b852-a217-46af-83ac-ebb62c27bf6c",
"unique_id": "32fed709-199e-4df6-a371-68d6ea51010e",
"db_unique_key": "1264646342",
"jump_url": "https://space.bilibili.com/1264646342"
},
{
"platform": "bilibili",
"datasource": "bilibili:dynamic-by-uid",
"nickname": "泡姆泡姆-B站",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/0be9bfd4-dfb7-4693-b08c-799688f4317c",
"unique_id": "360d1bcd-789b-48b1-982e-da0132ab60e3",
"db_unique_key": "1415744159",
"jump_url": "https://space.bilibili.com/1415744159"
},
{
"platform": "weibo",
"datasource": "weibo:dynamic-by-uid",
"nickname": "泡姆泡姆-微博",
"avatar": "https://cdn.ceobecanteen.top/datasource-avatar/efd15bf8-c3c1-4816-a754-2a5fd54955a1",
"unique_id": "491ea114-eb12-4b1e-b06d-c763c0bffdd2",
"db_unique_key": "7840846173",
"jump_url": "https://weibo.com/u/7840846173"
}
]
}

View File

@ -276,3 +276,32 @@ async def test_send_with_render(
# assert(post.pics == ['https://ak-fs.hypergryph.com/announce/images/20210623/e6f49aeb9547a2278678368a43b95b07.jpg']) # assert(post.pics == ['https://ak-fs.hypergryph.com/announce/images/20210623/e6f49aeb9547a2278678368a43b95b07.jpg'])
r = await post2.generate_messages() r = await post2.generate_messages()
assert r assert r
@pytest.mark.render()
@respx.mock
async def test_parse_title(
app: App,
):
from nonebot_bison.utils import ProcessContext, DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinListItem
detail_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/8397")
ark = Arknights(ProcessContext(DefaultClientManager()))
mock_detail = get_json("arknights-detail-805")
mock_detail["data"]["header"] = ""
detail_router.mock(return_value=Response(200, json=mock_detail))
mock_raw_post = BulletinListItem(
cid="8397",
title="【公开招募】\n标签刷新通知",
category=1,
displayTime="07-30 10:00:00",
updatedAt=1627582800,
sticky=False,
)
post = await ark.parse(mock_raw_post)
assert post.title == "【公开招募】 - 标签刷新通知"

View File

@ -0,0 +1,259 @@
from typing import TYPE_CHECKING
import respx
import pytest
from httpx import Response
from nonebug.app import App
from nonebot.compat import type_validate_python
from .utils import get_json
if TYPE_CHECKING:
from nonebot_bison.platform.ceobecanteen import CeobeCanteen
@pytest.fixture()
def dummy_only_open_user_subinfo(app: App):
from nonebot_plugin_saa import TargetQQGroup
from nonebot_bison.types import UserSubInfo
user = TargetQQGroup(group_id=123)
return UserSubInfo(user=user, categories=[1], tags=[])
@pytest.fixture()
def ceobecanteen(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.platform.ceobecanteen.platform import CeobeCanteenClientManager
return platform_manager["ceobecanteen"](ProcessContext(CeobeCanteenClientManager()))
@pytest.fixture(scope="module")
def dummy_target() -> str:
return "7d23708b-e424-418b-b4c4-43c370c3b6d0"
@pytest.fixture(scope="module")
def ceobecanteen_targets() -> dict:
return get_json("ceobecanteen_targets.json")
@pytest.fixture(scope="module")
def ceobecanteen_comb_id_0() -> dict:
return get_json("ceobecanteen_comb_id_0.json")
@pytest.fixture(scope="module")
def ceobecanteen_comb_id_1() -> dict:
return get_json("ceobecanteen_comb_id_1.json")
@pytest.fixture(scope="module")
def ceobecanteen_cookie_id_0() -> dict:
return get_json("ceobecanteen_cookie_id_0.json")
@pytest.fixture(scope="module")
def ceobecanteen_cookie_id_1() -> dict:
return get_json("ceobecanteen_cookie_id_1.json")
@pytest.fixture(scope="module")
def ceobecanteen_cookies_0() -> dict:
return get_json("ceobecanteen_cookies_0.json")
@pytest.fixture(scope="module")
def ceobecanteen_cookies_1() -> dict:
return get_json("ceobecanteen_cookies_1.json")
@pytest.mark.asyncio()
async def test_parse_retweet(app: App):
from nonebot_bison.platform.ceobecanteen.models import CookiesResponse
cookie_with_retweet = type_validate_python(CookiesResponse, get_json("ceobecanteen_cookies_with_retweet.json"))
assert cookie_with_retweet.data.cookies[0].item.retweeted
@pytest.mark.render()
async def test_ceobe_snapshot(app: App, ceobecanteen: "CeobeCanteen"):
from nonebot_bison.platform.ceobecanteen.models import CeobeCookie
sp_coolies = get_json("ceobe_special_cookies.json")
# arknights-game:bulletin-list but not need to snapshot
cookie_bulletin_type2 = type_validate_python(CeobeCookie, sp_coolies[0])
assert cookie_bulletin_type2.source.type == "arknights-game:bulletin-list"
post = await ceobecanteen.parse(cookie_bulletin_type2)
assert post.images
assert len(post.images) == 1
assert post.content == "【联合行动】\n定向寻访开启"
cookie_bulletin_type1 = type_validate_python(CeobeCookie, sp_coolies[1])
post2 = await ceobecanteen.parse(cookie_bulletin_type1)
assert post2.images
assert len(post2.images) == 1
assert not post2.content
cookie_offical = type_validate_python(CeobeCookie, sp_coolies[2])
post3 = await ceobecanteen.parse(cookie_offical)
assert post3.images
assert len(post3.images) == 1
assert not post3.content
cookie_common = type_validate_python(CeobeCookie, sp_coolies[3])
post4 = await ceobecanteen.parse(cookie_common)
assert post4.images
assert len(post4.images) == 7
assert post4.content
@pytest.mark.skip("极限测试, 不在CI中运行")
@pytest.mark.asyncio()
async def test_parse_crazy(app: App, ceobecanteen):
from nonebot_plugin_saa import Image
from nonebot_bison.platform.ceobecanteen import CeobeCanteen
from nonebot_bison.platform.ceobecanteen.models import CeobeCookie
def show(p: bytes):
import io
from PIL import Image
Image.open(io.BytesIO(p)).show()
def ext(m: Image):
d = m.data["image"]
assert isinstance(d, bytes)
return d
assert isinstance(ceobecanteen, CeobeCanteen)
cookie_offical = type_validate_python(CeobeCookie, get_json("ceobe_looooong_bulletin.json"))
post4 = await ceobecanteen.parse(cookie_offical)
show(ext((await post4.generate_messages())[0][0])) # type: ignore
@pytest.mark.asyncio()
@respx.mock
async def test_batch_fetch_new_with_single(
app: App,
dummy_target,
dummy_only_open_user_subinfo,
ceobecanteen: "CeobeCanteen",
ceobecanteen_targets,
ceobecanteen_comb_id_0,
ceobecanteen_cookie_id_0,
ceobecanteen_cookie_id_1,
ceobecanteen_cookies_0,
ceobecanteen_cookies_1,
):
from nonebot_bison.post import Post
from nonebot_bison.types import SubUnit
mock_respone_headers = {
"Content-Encoding": "br",
"Content-Type": "application/json; charset=utf-8",
"Date": "Thu, 08 Jul 2021 14:00:00 GMT",
# "Date": datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT"),
"Vary": "origin; access-control-request-method; access-control-request-headers",
}
targets_router = respx.get("https://server.ceobecanteen.top/api/v1/canteen/config/datasource/list")
comb_id_router = respx.post("https://server.ceobecanteen.top/api/v1/canteen/user/getDatasourceComb")
cookie_id_router = respx.get("http://cdn.ceobecanteen.top/datasource-comb/2")
cookies_router = respx.get("https://server-cdn.ceobecanteen.top/api/v1/cdn/cookie/mainList/cookieList")
targets_router.mock(return_value=Response(200, json=ceobecanteen_targets, headers=mock_respone_headers))
comb_id_router.mock(return_value=Response(200, json=ceobecanteen_comb_id_0))
cookie_id_router.mock(return_value=Response(200, json=ceobecanteen_cookie_id_0, headers=mock_respone_headers))
cookies_router.mock(return_value=Response(200, json=ceobecanteen_cookies_0, headers=mock_respone_headers))
assert await ceobecanteen.get_target_name(None, dummy_target) == "明日方舟-B站"
assert await ceobecanteen.parse_target("明日方舟-B站") == dummy_target
res1 = await ceobecanteen.batch_fetch_new_post([SubUnit(dummy_target, [dummy_only_open_user_subinfo])])
assert comb_id_router.called
assert cookie_id_router.called
assert cookies_router.called
assert res1 == []
res2 = await ceobecanteen.batch_fetch_new_post([SubUnit(dummy_target, [dummy_only_open_user_subinfo])])
assert comb_id_router.call_count == 1
assert cookie_id_router.call_count == 2
assert cookies_router.call_count == 1
assert res2 == []
cookie_id_router.mock(return_value=Response(200, json=ceobecanteen_cookie_id_1))
cookies_router.mock(return_value=Response(200, json=ceobecanteen_cookies_1))
res3 = await ceobecanteen.batch_fetch_new_post([SubUnit(dummy_target, [dummy_only_open_user_subinfo])])
assert comb_id_router.call_count == 1
assert cookie_id_router.call_count == 3
assert cookies_router.call_count == 2
post3: Post = res3[0][1][0]
assert not post3.title
assert (
post3.content
== "【新增服饰】\n//正午余光 - 苦艾\nEPOQUE子品牌 [昔时/Passe]系列精选款/正午余光。苦艾曾经的校服。"
"在乌萨斯,学生穿校服出操,就像是跟在一把犁后面一行整齐的秧苗。\n\n_____________\n只可惜,"
"阳光能照在这把犁上的时间总是太短了。但这样的事,那个春天之前的她还不明白。"
)
assert post3.images
assert len(post3.images) == 2
assert post3.timestamp
assert post3.url
assert post3.avatar
assert post3.nickname == "明日方舟-B站"
assert post3.description
assert post3.platform.platform_name == "ceobecanteen"
image1_router = respx.get("https://i0.hdslb.com/bfs/new_dyn/62e053ba7efc18f15bfd195e2d2de984161775300.jpg")
image2_router = respx.get("https://i0.hdslb.com/bfs/new_dyn/590a69665209ac220ea8a57f749d5267161775300.gif")
image1_router.mock(return_value=Response(200, content=b"image1"))
image2_router.mock(return_value=Response(200, content=b"image2"))
await post3.generate_messages()
@pytest.mark.asyncio()
@respx.mock
async def test_parse_target_fuzzy(app: App, ceobecanteen: "CeobeCanteen", dummy_target, ceobecanteen_targets):
from nonebot_bison.platform.ceobecanteen import CeobeCanteen
mock_respone_headers = {
"Content-Encoding": "br",
"Content-Type": "application/json; charset=utf-8",
"Date": "Thu, 08 Jul 2021 14:00:00 GMT",
# "Date": datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT"),
"Vary": "origin; access-control-request-method; access-control-request-headers",
}
targets_router = respx.get("https://server.ceobecanteen.top/api/v1/canteen/config/datasource/list")
targets_router.mock(return_value=Response(200, json=ceobecanteen_targets, headers=mock_respone_headers))
# check load data ok
assert await ceobecanteen.get_target_name(None, dummy_target) == "明日方舟-B站"
assert await ceobecanteen.parse_target("明日方舟-B站") == dummy_target
# check fuzzy search
# try:
# assert await ceobecanteen.parse_target("丸子姐") == dummy_target
# except CeobeCanteen.ParseTargetException as e:
# logger.error(e.prompt)
# pytest.fail("fuzzy search failed")
with pytest.raises(CeobeCanteen.ParseTargetException) as pe1:
await ceobecanteen.parse_target("丸子姐")
assert pe1.value.prompt
assert "Wan顽子-B站\nWan顽子-微博" in pe1.value.prompt
with pytest.raises(CeobeCanteen.ParseTargetException) as pe2:
await ceobecanteen.parse_target("明日方舟")
assert pe2.value.prompt
assert "明日方舟-B站" in pe2.value.prompt

View File

@ -161,7 +161,7 @@ async def test_theme_no_enable_use_browser(app: App, mock_post, mocker: MockerFi
@pytest.mark.asyncio @pytest.mark.asyncio
@flaky(max_runs=3, min_passes=1) @flaky(max_runs=3, min_passes=1)
async def test_arknights_theme(app: App, mock_post): async def test_arknights_theme(app: App, mock_post):
from nonebot_plugin_saa import Image from nonebot_plugin_saa import Text, Image
from nonebot_bison.theme import theme_manager from nonebot_bison.theme import theme_manager
from nonebot_bison.theme.themes.arknights import ArknightsTheme from nonebot_bison.theme.themes.arknights import ArknightsTheme
@ -171,8 +171,9 @@ async def test_arknights_theme(app: App, mock_post):
assert isinstance(arknights_theme, ArknightsTheme) assert isinstance(arknights_theme, ArknightsTheme)
assert arknights_theme.name == "arknights" assert arknights_theme.name == "arknights"
res = await arknights_theme.render(mock_post) res = await arknights_theme.render(mock_post)
assert len(res) == 1 assert len(res) == 2
assert isinstance(res[0], Image) assert isinstance(res[0], Image)
assert res[1] == Text("前往:http://t.tt/1")
@pytest.mark.asyncio @pytest.mark.asyncio