mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-09-12 06:02:26 +08:00
✨ 适配小刻食堂平台 (#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:
parent
4eb7a17306
commit
e2a97a9e56
@ -1,12 +1,13 @@
|
||||
import random
|
||||
import string
|
||||
from datetime import timedelta
|
||||
|
||||
from expiringdict import ExpiringDict
|
||||
from expiringdictx import ExpiringDict
|
||||
|
||||
|
||||
class TokenManager:
|
||||
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:
|
||||
res = self.token_manager.get(token)
|
||||
|
1
nonebot_bison/platform/ceobecanteen/__init__.py
Normal file
1
nonebot_bison/platform/ceobecanteen/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .platform import CeobeCanteen as CeobeCanteen
|
119
nonebot_bison/platform/ceobecanteen/cache.py
Normal file
119
nonebot_bison/platform/ceobecanteen/cache.py
Normal 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)
|
4
nonebot_bison/platform/ceobecanteen/const.py
Normal file
4
nonebot_bison/platform/ceobecanteen/const.py
Normal 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"
|
10
nonebot_bison/platform/ceobecanteen/exception.py
Normal file
10
nonebot_bison/platform/ceobecanteen/exception.py
Normal file
@ -0,0 +1,10 @@
|
||||
class CeobeResponseError(Exception): ...
|
||||
|
||||
|
||||
class CeobeSnapshotException(Exception): ...
|
||||
|
||||
|
||||
class CeobeSnapshotSkip(CeobeSnapshotException): ...
|
||||
|
||||
|
||||
class CeobeSnapshotFailed(CeobeSnapshotException): ...
|
127
nonebot_bison/platform/ceobecanteen/models.py
Normal file
127
nonebot_bison/platform/ceobecanteen/models.py
Normal 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
|
||||
"""跳转url(null就是没办法跳转)"""
|
||||
|
||||
|
||||
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)
|
324
nonebot_bison/platform/ceobecanteen/platform.py
Normal file
324
nonebot_bison/platform/ceobecanteen/platform.py
Normal 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
|
20
nonebot_bison/platform/ceobecanteen/utils.py
Normal file
20
nonebot_bison/platform/ceobecanteen/utils.py
Normal 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
|
@ -31,8 +31,8 @@ class Post(AbstractPost):
|
||||
"""标题"""
|
||||
images: list[str | bytes | Path | BytesIO] | None = None
|
||||
"""图片列表"""
|
||||
timestamp: int | None = None
|
||||
"""发布/获取时间戳"""
|
||||
timestamp: float | None = None
|
||||
"""发布/获取时间戳, 秒"""
|
||||
url: str | None = None
|
||||
"""来源链接"""
|
||||
avatar: str | bytes | Path | BytesIO | None = None
|
||||
|
@ -1,9 +1,12 @@
|
||||
from io import BytesIO
|
||||
from pathlib import Path
|
||||
from dataclasses import dataclass
|
||||
from typing import TYPE_CHECKING, Literal
|
||||
|
||||
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
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@ -34,16 +37,21 @@ class ArknightsTheme(Theme):
|
||||
|
||||
if not post.title:
|
||||
raise ThemeRenderUnsupportError("标题为空")
|
||||
if post.images and len(post.images) > 1:
|
||||
raise ThemeRenderUnsupportError("图片数量大于1")
|
||||
|
||||
banner = post.images[0] if post.images else None
|
||||
|
||||
if banner is not None and not isinstance(banner, str | Path):
|
||||
raise ThemeRenderUnsupportError(f"图片类型错误, 期望 str 或 Path, 实际为 {type(banner)}")
|
||||
match 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(
|
||||
announce_title=post.title,
|
||||
announce_title=text_fletten(post.title),
|
||||
content=post.content,
|
||||
banner_image_url=banner,
|
||||
)
|
||||
@ -64,6 +72,10 @@ class ArknightsTheme(Theme):
|
||||
raise ThemeRenderError(f"渲染文本失败: {e}")
|
||||
msgs: list[MessageSegmentFactory] = []
|
||||
msgs.append(Image(announce_pic))
|
||||
|
||||
if 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
|
||||
|
@ -3,8 +3,12 @@
|
||||
## LOGO图片
|
||||
|
||||
- `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>进行许可。
|
||||
本项目<img src="templates/ceobecanteen_logo.png" style="width:100px">使用已经过 [Ceobe Canteen](https://github.com/Enraged-Dun-Cookie-Development-Team) 授权许可使用。
|
||||
<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>进行许可。
|
||||
|
||||
本项目使用的 小刻食堂 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">由画师 不画涩图の企鹅 倾情贡献,非常感谢!
|
||||
|
@ -4,12 +4,15 @@ from datetime import datetime
|
||||
from typing import TYPE_CHECKING, Literal
|
||||
|
||||
import jinja2
|
||||
from yarl import URL
|
||||
from httpx import AsyncClient
|
||||
from pydantic import BaseModel
|
||||
from PIL import Image as PILImage
|
||||
from nonebot_plugin_saa import Text, Image, MessageSegmentFactory
|
||||
|
||||
from nonebot_bison.compat import model_validator
|
||||
from nonebot_bison.theme.utils import convert_to_qr
|
||||
from nonebot_bison.utils.image import pic_merge, is_pics_mergable
|
||||
from nonebot_bison.utils 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
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@ -35,13 +38,26 @@ class CeoboContent(BaseModel):
|
||||
text: 文字内容
|
||||
"""
|
||||
|
||||
image: str | None = None
|
||||
text: str
|
||||
|
||||
|
||||
class CeoboRetweet(BaseModel):
|
||||
"""卡片的转发部分
|
||||
|
||||
author: 原作者
|
||||
image: 图片链接
|
||||
content: 文字内容
|
||||
"""
|
||||
|
||||
image: str | None
|
||||
text: str | None
|
||||
content: str | None
|
||||
author: str
|
||||
|
||||
@model_validator(mode="before")
|
||||
def check(cls, values):
|
||||
if values["image"] is None and values["text"] is None:
|
||||
raise ValueError("image and text cannot be both None")
|
||||
if values["image"] is None and values["content"] is None:
|
||||
raise ValueError("image and content cannot be both None")
|
||||
return values
|
||||
|
||||
|
||||
@ -49,6 +65,7 @@ class CeobeCard(BaseModel):
|
||||
info: CeobeInfo
|
||||
content: CeoboContent
|
||||
qr: str | None
|
||||
retweet: CeoboRetweet | None
|
||||
|
||||
|
||||
class CeobeCanteenTheme(Theme):
|
||||
@ -63,8 +80,8 @@ class CeobeCanteenTheme(Theme):
|
||||
template_path: Path = Path(__file__).parent / "templates"
|
||||
template_name: str = "ceobe_canteen.html.jinja"
|
||||
|
||||
def parse(self, post: "Post") -> CeobeCard:
|
||||
"""解析 Post 为 CeobeCard"""
|
||||
async def parse(self, post: "Post") -> tuple[CeobeCard, list[str | bytes | Path | BytesIO]]:
|
||||
"""解析 Post 为 CeobeCard与处理好的图片列表"""
|
||||
if not post.nickname:
|
||||
raise ThemeRenderUnsupportError("post.nickname is None")
|
||||
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")
|
||||
)
|
||||
|
||||
head_pic = post.images[0] if post.images else None
|
||||
if head_pic is not None and not isinstance(head_pic, str):
|
||||
raise ThemeRenderUnsupportError("post.images[0] is not str")
|
||||
http_client = await post.platform.ctx.get_client_for_static()
|
||||
images: list[str | bytes | Path | BytesIO] = []
|
||||
if post.images:
|
||||
images = await self.merge_pics(post.images, http_client)
|
||||
|
||||
content = CeoboContent(image=head_pic, text=post.content)
|
||||
return CeobeCard(info=info, content=content, qr=convert_to_qr(post.url or "No URL"))
|
||||
content = CeoboContent(text=post.content)
|
||||
|
||||
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]:
|
||||
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
|
||||
|
||||
template_env = jinja2.Environment(
|
||||
@ -91,7 +189,8 @@ class CeobeCanteenTheme(Theme):
|
||||
template = template_env.get_template(self.template_name)
|
||||
html = await template.render_async(card=ceobe_card)
|
||||
pages = {
|
||||
"viewport": {"width": 1000, "height": 3000},
|
||||
"device_scale_factor": 2,
|
||||
"viewport": {"width": 512, "height": 455},
|
||||
"base_url": self.template_path.as_uri(),
|
||||
}
|
||||
try:
|
||||
@ -99,12 +198,24 @@ class CeobeCanteenTheme(Theme):
|
||||
await page.goto(self.template_path.as_uri())
|
||||
await page.set_content(html)
|
||||
await page.wait_for_timeout(1)
|
||||
img_raw = await page.locator("#ceobecanteen-card").screenshot(
|
||||
type="png",
|
||||
card_body = await page.locator("#ceobecanteen-card").screenshot(
|
||||
type="jpeg",
|
||||
quality=90,
|
||||
)
|
||||
except Exception as 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"
|
||||
if post.url:
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 106 KiB |
Binary file not shown.
After Width: | Height: | Size: 640 KiB |
@ -11,6 +11,19 @@
|
||||
{% endif %}
|
||||
{% if card.content.text %}
|
||||
<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 %}
|
||||
<div class="footer">
|
||||
<div class="datasource">
|
||||
@ -21,7 +34,7 @@
|
||||
<img class='qr' src="{{ card.qr }}">
|
||||
</div>
|
||||
<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="slogan">小刻吃到饼啦!</div>
|
||||
<div class="linkage">bison&小刻食堂联动</div>
|
||||
@ -46,6 +59,16 @@
|
||||
padding: 30px;
|
||||
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 {
|
||||
margin: 0 2%;
|
||||
height: 80px;
|
||||
|
@ -1,9 +1,13 @@
|
||||
from io import BytesIO
|
||||
from pathlib import Path
|
||||
from base64 import b64encode
|
||||
|
||||
from qrcode import constants
|
||||
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
|
||||
Args:
|
||||
data (str): data to be converted
|
||||
@ -15,8 +19,24 @@ def convert_to_qr(data: str) -> str:
|
||||
error_correction=constants.ERROR_CORRECT_L,
|
||||
box_size=10,
|
||||
border=2,
|
||||
image_factory=SvgFragmentImage,
|
||||
image_factory=PilImage,
|
||||
)
|
||||
qr.add_data(data)
|
||||
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()}"
|
||||
|
@ -12,6 +12,7 @@ from .site import Site as Site
|
||||
from ..plugin_config import plugin_config
|
||||
from .image import pic_merge as pic_merge
|
||||
from .http import http_client as http_client
|
||||
from .image import capture_html as capture_html
|
||||
from .site import ClientManager as ClientManager
|
||||
from .image import text_to_image as text_to_image
|
||||
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}")
|
||||
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)
|
||||
|
@ -1,7 +1,8 @@
|
||||
from io import BytesIO
|
||||
from typing import TypeGuard
|
||||
from functools import partial
|
||||
from typing import Literal, TypeGuard
|
||||
|
||||
from yarl import URL
|
||||
from PIL import Image
|
||||
from httpx import AsyncClient
|
||||
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]]:
|
||||
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:
|
||||
@ -108,3 +113,32 @@ async def text_to_image(saa_text: SaaText) -> SaaImage:
|
||||
|
||||
render_data = await text_to_pic(str(saa_text))
|
||||
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
700
poetry.lock
generated
@ -21,13 +21,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "aiofiles"
|
||||
version = "23.2.1"
|
||||
version = "24.1.0"
|
||||
description = "File support for asyncio."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"},
|
||||
{file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"},
|
||||
{file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
|
||||
{file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
|
||||
]
|
||||
|
||||
[package.source]
|
||||
@ -183,13 +183,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "alembic"
|
||||
version = "1.13.1"
|
||||
version = "1.13.2"
|
||||
description = "A database migration tool for SQLAlchemy."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"},
|
||||
{file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"},
|
||||
{file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"},
|
||||
{file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -688,13 +688,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2024.6.2"
|
||||
version = "2024.7.4"
|
||||
description = "Python package for providing Mozilla's CA Bundle."
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"},
|
||||
{file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"},
|
||||
{file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"},
|
||||
{file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
|
||||
]
|
||||
|
||||
[package.source]
|
||||
@ -970,63 +970,63 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "coverage"
|
||||
version = "7.5.3"
|
||||
version = "7.6.0"
|
||||
description = "Code coverage measurement for Python"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"},
|
||||
{file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"},
|
||||
{file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"},
|
||||
{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.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.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"},
|
||||
{file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"},
|
||||
{file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"},
|
||||
{file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"},
|
||||
{file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"},
|
||||
{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.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.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"},
|
||||
{file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"},
|
||||
{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.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.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"},
|
||||
{file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"},
|
||||
{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.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.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"},
|
||||
{file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"},
|
||||
{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.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.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"},
|
||||
{file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"},
|
||||
{file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"},
|
||||
{file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"},
|
||||
{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.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.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"},
|
||||
{file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"},
|
||||
{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.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.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"},
|
||||
{file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"},
|
||||
{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.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.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"},
|
||||
{file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"},
|
||||
{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.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.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"},
|
||||
{file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"},
|
||||
{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.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.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"},
|
||||
{file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"},
|
||||
{file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"},
|
||||
{file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -1099,13 +1099,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "email-validator"
|
||||
version = "2.1.1"
|
||||
version = "2.2.0"
|
||||
description = "A robust email address syntax and deliverability validation library."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"},
|
||||
{file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"},
|
||||
{file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"},
|
||||
{file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -1175,18 +1175,18 @@ url = "https://pypi.org/simple"
|
||||
reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "expiringdict"
|
||||
version = "1.2.2"
|
||||
description = "Dictionary with auto-expiring values for caching purposes"
|
||||
name = "expiringdictx"
|
||||
version = "1.0.1"
|
||||
description = "提供一个带有过期时间的字典数据结构,适用于缓存和临时存储。"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
python-versions = ">=3.10,<4.0"
|
||||
files = [
|
||||
{file = "expiringdict-1.2.2-py3-none-any.whl", hash = "sha256:09a5d20bc361163e6432a874edd3179676e935eb81b925eccef48d409a8a45e8"},
|
||||
{file = "expiringdict-1.2.2.tar.gz", hash = "sha256:300fb92a7e98f15b05cf9a856c1415b3bc4f2e132be07daa326da6414c23ee09"},
|
||||
{file = "expiringdictx-1.0.1-py3-none-any.whl", hash = "sha256:0b8c66f7781a066bafa842fc1af49594207d5c78dbfd09c7991c03208a37ae49"},
|
||||
{file = "expiringdictx-1.0.1.tar.gz", hash = "sha256:4c077cb69774594f85bd181bfec66398971c5df50c737abb2f6c9524b7ac519f"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
tests = ["coverage", "coveralls", "dill", "mock", "nose"]
|
||||
[package.dependencies]
|
||||
lru-dict = ">=1.3.0,<2.0.0"
|
||||
|
||||
[package.source]
|
||||
type = "legacy"
|
||||
@ -1268,18 +1268,18 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "filelock"
|
||||
version = "3.14.0"
|
||||
version = "3.15.4"
|
||||
description = "A platform independent file lock."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"},
|
||||
{file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"},
|
||||
{file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"},
|
||||
{file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
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)"]
|
||||
|
||||
[package.source]
|
||||
@ -1522,6 +1522,30 @@ type = "legacy"
|
||||
url = "https://pypi.org/simple"
|
||||
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]]
|
||||
name = "hpack"
|
||||
version = "4.0.0"
|
||||
@ -1665,13 +1689,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "identify"
|
||||
version = "2.5.36"
|
||||
version = "2.6.0"
|
||||
description = "File identification library for Python"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"},
|
||||
{file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"},
|
||||
{file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"},
|
||||
{file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
@ -1737,13 +1761,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "ipython"
|
||||
version = "8.25.0"
|
||||
version = "8.26.0"
|
||||
description = "IPython: Productive Interactive Computing"
|
||||
optional = false
|
||||
python-versions = ">=3.10"
|
||||
files = [
|
||||
{file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"},
|
||||
{file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"},
|
||||
{file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"},
|
||||
{file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -1770,7 +1794,7 @@ nbformat = ["nbformat"]
|
||||
notebook = ["ipywidgets", "notebook"]
|
||||
parallel = ["ipyparallel"]
|
||||
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"]
|
||||
|
||||
[package.source]
|
||||
@ -1866,6 +1890,104 @@ type = "legacy"
|
||||
url = "https://pypi.org/simple"
|
||||
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]]
|
||||
name = "lxml"
|
||||
version = "5.2.2"
|
||||
@ -2593,19 +2715,19 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "nonebot-plugin-localstore"
|
||||
version = "0.6.0"
|
||||
version = "0.7.0"
|
||||
description = "Local Storage Support for NoneBot2"
|
||||
optional = false
|
||||
python-versions = ">=3.8,<4.0"
|
||||
python-versions = ">=3.9,<4.0"
|
||||
files = [
|
||||
{file = "nonebot_plugin_localstore-0.6.0-py3-none-any.whl", hash = "sha256:59f0126d85680601166a9a62cca886a33e1b0a8fef7cd67fff52747bd47f42d3"},
|
||||
{file = "nonebot_plugin_localstore-0.6.0.tar.gz", hash = "sha256:7eb4039cb2e76c54b860b2b98f2b90cd25284919603e81dedec367f215662fcd"},
|
||||
{file = "nonebot_plugin_localstore-0.7.0-py3-none-any.whl", hash = "sha256:5cb8a18d87c88259ff3ae4d741390e44076d48c8cc9c33aea66f7a6a29fe70af"},
|
||||
{file = "nonebot_plugin_localstore-0.7.0.tar.gz", hash = "sha256:f04d99daba13d8e7cc6cf72c43fab28cbde30e0c2a71b328e815d9c96403e2e3"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
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"
|
||||
typing-extensions = ">=4.0.0"
|
||||
typing-extensions = ">=4.0.0,<5.0.0"
|
||||
|
||||
[package.source]
|
||||
type = "legacy"
|
||||
@ -2756,57 +2878,62 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "orjson"
|
||||
version = "3.10.3"
|
||||
version = "3.10.6"
|
||||
description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
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.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"},
|
||||
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"},
|
||||
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"},
|
||||
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"},
|
||||
{file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"},
|
||||
{file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"},
|
||||
{file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"},
|
||||
{file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"},
|
||||
{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.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"},
|
||||
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"},
|
||||
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"},
|
||||
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"},
|
||||
{file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"},
|
||||
{file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"},
|
||||
{file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"},
|
||||
{file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"},
|
||||
{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.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"},
|
||||
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"},
|
||||
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"},
|
||||
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"},
|
||||
{file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"},
|
||||
{file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"},
|
||||
{file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"},
|
||||
{file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"},
|
||||
{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.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"},
|
||||
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"},
|
||||
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"},
|
||||
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"},
|
||||
{file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"},
|
||||
{file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"},
|
||||
{file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"},
|
||||
{file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"},
|
||||
{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.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"},
|
||||
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"},
|
||||
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"},
|
||||
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"},
|
||||
{file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"},
|
||||
{file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"},
|
||||
{file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"},
|
||||
{file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"},
|
||||
{file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"},
|
||||
{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.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"},
|
||||
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"},
|
||||
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"},
|
||||
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"},
|
||||
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"},
|
||||
{file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"},
|
||||
{file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"},
|
||||
{file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"},
|
||||
{file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"},
|
||||
{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.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"},
|
||||
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"},
|
||||
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"},
|
||||
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"},
|
||||
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"},
|
||||
{file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"},
|
||||
{file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"},
|
||||
{file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"},
|
||||
{file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"},
|
||||
{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.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"},
|
||||
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"},
|
||||
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"},
|
||||
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"},
|
||||
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"},
|
||||
{file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"},
|
||||
{file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"},
|
||||
{file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"},
|
||||
{file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"},
|
||||
{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.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"},
|
||||
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"},
|
||||
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"},
|
||||
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"},
|
||||
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"},
|
||||
{file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"},
|
||||
{file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"},
|
||||
{file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"},
|
||||
{file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"},
|
||||
{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.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"},
|
||||
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"},
|
||||
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"},
|
||||
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"},
|
||||
{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]
|
||||
@ -2816,13 +2943,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "packaging"
|
||||
version = "24.0"
|
||||
version = "24.1"
|
||||
description = "Core utilities for Python packages"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
|
||||
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
|
||||
{file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
|
||||
{file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
|
||||
]
|
||||
|
||||
[package.source]
|
||||
@ -3010,18 +3137,18 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "playwright"
|
||||
version = "1.44.0"
|
||||
version = "1.45.0"
|
||||
description = "A high-level API to automate web browsers"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "playwright-1.44.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c2317a80896796fdeb03d60f06cc229e775ff2e19b80c64b1bb9b29c8a59d992"},
|
||||
{file = "playwright-1.44.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54d44fb634d870839301c2326e1e12a178a1be0de76d0caaec230ab075c2e077"},
|
||||
{file = "playwright-1.44.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:64b67194e73b47ae72acf25f1a9cfacfef38ca2b52e4bb8b0abd385c5deeaadf"},
|
||||
{file = "playwright-1.44.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:29161b1fae71f7c402df5b15f0bd3deaeecd8b3d1ecd9ff01271700c66210e7b"},
|
||||
{file = "playwright-1.44.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8c8a3bfea17576d3f94a2363eee195cbda8dbba86975588c7eaac7792b25eee"},
|
||||
{file = "playwright-1.44.0-py3-none-win32.whl", hash = "sha256:235e37832deaa9af8a629d09955396259ab757533cc1922f9b0308b4ee0d9cdf"},
|
||||
{file = "playwright-1.44.0-py3-none-win_amd64.whl", hash = "sha256:5b8a4a1d4d50f4ff99b47965576322a8c4e34631854b862a25c1feb824be22a8"},
|
||||
{file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"},
|
||||
{file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"},
|
||||
{file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"},
|
||||
{file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"},
|
||||
{file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"},
|
||||
{file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"},
|
||||
{file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -3094,13 +3221,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "prompt-toolkit"
|
||||
version = "3.0.46"
|
||||
version = "3.0.47"
|
||||
description = "Library for building powerful interactive command lines in Python"
|
||||
optional = false
|
||||
python-versions = ">=3.7.0"
|
||||
files = [
|
||||
{file = "prompt_toolkit-3.0.46-py3-none-any.whl", hash = "sha256:45abe60a8300f3c618b23c16c4bb98c6fc80af8ce8b17c7ae92db48db3ee63c1"},
|
||||
{file = "prompt_toolkit-3.0.46.tar.gz", hash = "sha256:869c50d682152336e23c4db7f74667639b5047494202ffe7670817053fd57795"},
|
||||
{file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"},
|
||||
{file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -3113,27 +3240,28 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "psutil"
|
||||
version = "5.9.8"
|
||||
version = "6.0.0"
|
||||
description = "Cross-platform lib for process and system monitoring in Python."
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
files = [
|
||||
{file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"},
|
||||
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"},
|
||||
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"},
|
||||
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"},
|
||||
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"},
|
||||
{file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"},
|
||||
{file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"},
|
||||
{file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"},
|
||||
{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-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-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"},
|
||||
{file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"},
|
||||
{file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"},
|
||||
{file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"},
|
||||
{file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"},
|
||||
{file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"},
|
||||
{file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"},
|
||||
{file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"},
|
||||
{file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"},
|
||||
{file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"},
|
||||
{file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"},
|
||||
{file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"},
|
||||
{file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"},
|
||||
{file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"},
|
||||
{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-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-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"},
|
||||
{file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"},
|
||||
{file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"},
|
||||
{file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"},
|
||||
{file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"},
|
||||
{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]
|
||||
@ -3910,6 +4038,116 @@ type = "legacy"
|
||||
url = "https://pypi.org/simple"
|
||||
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]]
|
||||
name = "requests"
|
||||
version = "2.32.3"
|
||||
@ -4113,65 +4351,65 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "sqlalchemy"
|
||||
version = "2.0.30"
|
||||
version = "2.0.31"
|
||||
description = "Database Abstraction Library"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"},
|
||||
{file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"},
|
||||
{file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"},
|
||||
{file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"},
|
||||
{file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"},
|
||||
{file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"},
|
||||
{file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"},
|
||||
{file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"},
|
||||
{file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"},
|
||||
{file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"},
|
||||
{file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"},
|
||||
{file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"},
|
||||
{file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"},
|
||||
{file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"},
|
||||
{file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"},
|
||||
{file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"},
|
||||
{file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
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\""}
|
||||
|
||||
[package.extras]
|
||||
@ -4321,13 +4559,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "tomlkit"
|
||||
version = "0.12.5"
|
||||
version = "0.13.0"
|
||||
description = "Style preserving TOML library"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"},
|
||||
{file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"},
|
||||
{file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"},
|
||||
{file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"},
|
||||
]
|
||||
|
||||
[package.source]
|
||||
@ -4541,13 +4779,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "2.2.1"
|
||||
version = "2.2.2"
|
||||
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"},
|
||||
{file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"},
|
||||
{file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
|
||||
{file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
@ -4643,13 +4881,13 @@ reference = "offical-source"
|
||||
|
||||
[[package]]
|
||||
name = "virtualenv"
|
||||
version = "20.26.2"
|
||||
version = "20.26.3"
|
||||
description = "Virtual Python Environment builder"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"},
|
||||
{file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"},
|
||||
{file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"},
|
||||
{file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -5014,4 +5252,4 @@ yaml = []
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = ">=3.10,<4.0.0"
|
||||
content-hash = "beac69393abcc2ef55d851f8ef5d8e2928f6c30d8ec1924ebbb9f15d95471b21"
|
||||
content-hash = "f803840e2fcf6c5731e3bf842cf898125c464ce52ac4fbbb960258c026407110"
|
||||
|
@ -23,7 +23,6 @@ classifiers = [
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.10,<4.0.0"
|
||||
beautifulsoup4 = ">=4.12.3"
|
||||
expiringdict = "^1.2.2"
|
||||
feedparser = "^6.0.11"
|
||||
httpx = ">=0.27.0"
|
||||
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"
|
||||
lxml = ">=5.2.2"
|
||||
yarl = ">=1.9.4"
|
||||
hishel = "^0.0.20"
|
||||
expiringdictx = "^1.0.1"
|
||||
rapidfuzz = "^3.9.3"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
black = ">=23.12.1,<25.0"
|
||||
|
@ -1,5 +1,6 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from shutil import rmtree
|
||||
|
||||
import pytest
|
||||
import nonebot
|
||||
@ -67,6 +68,11 @@ async def app(tmp_path: Path, request: pytest.FixtureRequest, mocker: MockerFixt
|
||||
|
||||
# 关闭渲染图片时打开的浏览器
|
||||
await shutdown_browser()
|
||||
# 清除缓存文件
|
||||
cache_dir = Path.cwd() / ".cache" / "hishel"
|
||||
if cache_dir.exists():
|
||||
rmtree(cache_dir)
|
||||
cache_dir.mkdir()
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
|
124
tests/platforms/static/ceobe_looooong_bulletin.json
vendored
Normal file
124
tests/platforms/static/ceobe_looooong_bulletin.json
vendored
Normal file
File diff suppressed because one or more lines are too long
124
tests/platforms/static/ceobe_looooong_offical_website.json
vendored
Normal file
124
tests/platforms/static/ceobe_looooong_offical_website.json
vendored
Normal file
File diff suppressed because one or more lines are too long
181
tests/platforms/static/ceobe_special_cookies.json
vendored
Normal file
181
tests/platforms/static/ceobe_special_cookies.json
vendored
Normal 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¶m1=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"
|
||||
}
|
||||
}
|
||||
]
|
7
tests/platforms/static/ceobecanteen_comb_id_0.json
vendored
Normal file
7
tests/platforms/static/ceobecanteen_comb_id_0.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"code": "00000",
|
||||
"message": "Operate Success",
|
||||
"data": {
|
||||
"datasource_comb_id": "2"
|
||||
}
|
||||
}
|
7
tests/platforms/static/ceobecanteen_comb_id_1.json
vendored
Normal file
7
tests/platforms/static/ceobecanteen_comb_id_1.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"code": "00000",
|
||||
"message": "Operate Success",
|
||||
"data": {
|
||||
"datasource_comb_id": "4"
|
||||
}
|
||||
}
|
4
tests/platforms/static/ceobecanteen_cookie_id_0.json
vendored
Normal file
4
tests/platforms/static/ceobecanteen_cookie_id_0.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"cookie_id": "6537ad363b4a4fd2d7919ac2",
|
||||
"update_cookie_id": "6537ad363b4a4fd2d7919ac2"
|
||||
}
|
4
tests/platforms/static/ceobecanteen_cookie_id_1.json
vendored
Normal file
4
tests/platforms/static/ceobecanteen_cookie_id_1.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"cookie_id": "6537ad363b4a4fd2d7919ac3",
|
||||
"update_cookie_id": "6537ad363b4a4fd2d7919ac2"
|
||||
}
|
380
tests/platforms/static/ceobecanteen_cookies_0.json
vendored
Normal file
380
tests/platforms/static/ceobecanteen_cookies_0.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
413
tests/platforms/static/ceobecanteen_cookies_1.json
vendored
Normal file
413
tests/platforms/static/ceobecanteen_cookies_1.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
77
tests/platforms/static/ceobecanteen_cookies_with_retweet.json
vendored
Normal file
77
tests/platforms/static/ceobecanteen_cookies_with_retweet.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
348
tests/platforms/static/ceobecanteen_targets.json
vendored
Normal file
348
tests/platforms/static/ceobecanteen_targets.json
vendored
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
@ -276,3 +276,32 @@ async def test_send_with_render(
|
||||
# assert(post.pics == ['https://ak-fs.hypergryph.com/announce/images/20210623/e6f49aeb9547a2278678368a43b95b07.jpg'])
|
||||
r = await post2.generate_messages()
|
||||
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 == "【公开招募】 - 标签刷新通知"
|
||||
|
259
tests/platforms/test_ceobecanteen.py
Normal file
259
tests/platforms/test_ceobecanteen.py
Normal 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
|
@ -161,7 +161,7 @@ async def test_theme_no_enable_use_browser(app: App, mock_post, mocker: MockerFi
|
||||
@pytest.mark.asyncio
|
||||
@flaky(max_runs=3, min_passes=1)
|
||||
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.themes.arknights import ArknightsTheme
|
||||
@ -171,8 +171,9 @@ async def test_arknights_theme(app: App, mock_post):
|
||||
assert isinstance(arknights_theme, ArknightsTheme)
|
||||
assert arknights_theme.name == "arknights"
|
||||
res = await arknights_theme.render(mock_post)
|
||||
assert len(res) == 1
|
||||
assert len(res) == 2
|
||||
assert isinstance(res[0], Image)
|
||||
assert res[1] == Text("前往:http://t.tt/1")
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
|
Loading…
x
Reference in New Issue
Block a user