diff --git a/docs/usage/settings.md b/docs/usage/settings.md index 80a76a2..73f822f 100644 --- a/docs/usage/settings.md +++ b/docs/usage/settings.md @@ -128,6 +128,16 @@ HARUKA_SCREENSHOT_STYLE=pc HARUKA_CAPTCHA_ADDRESS=https://captcha-cd.ngworks.cn ``` +## HARUKA_CAPTCHA_TOKEN + +默认值:harukabot + +验证码 Token,用于验证码服务器鉴权,若不填写一天内只能使用 5 次。 + +```yml +HARUKA_CAPTCHA_TOKEN=harukabot +``` + ## HARUKA_BROWSER_UA 默认值:"" diff --git a/haruka_bot/config.py b/haruka_bot/config.py index d58e311..16522f1 100644 --- a/haruka_bot/config.py +++ b/haruka_bot/config.py @@ -19,6 +19,7 @@ class Config(BaseSettings): haruka_dynamic_at: bool = False haruka_screenshot_style: str = "mobile" haruka_captcha_address: str = "https://captcha-cd.ngworks.cn" + haruka_captcha_token: str = "harukabot" haruka_browser_ua: Optional[str] = None haruka_dynamic_timeout: int = 30 haruka_dynamic_font_source: str = "system" diff --git a/haruka_bot/plugins/pusher/dynamic_pusher.py b/haruka_bot/plugins/pusher/dynamic_pusher.py index 156008c..ed7be93 100644 --- a/haruka_bot/plugins/pusher/dynamic_pusher.py +++ b/haruka_bot/plugins/pusher/dynamic_pusher.py @@ -7,6 +7,7 @@ EVENT_JOB_MISSED, EVENT_SCHEDULER_STARTED, ) +from bilireq.exceptions import GrpcError from bilireq.grpc.dynamic import grpc_get_user_dynamics from bilireq.grpc.protos.bilibili.app.dynamic.v2.dynamic_pb2 import DynamicType from grpc import StatusCode @@ -44,8 +45,12 @@ async def dy_sched(): except AioRpcError as e: if e.code() == StatusCode.DEADLINE_EXCEEDED: logger.error(f"爬取动态超时,将在下个轮询中重试:{e.code()} {e.details()}") - return - raise + else: + logger.error(f"爬取动态失败:{e.code()} {e.details()}") + return + except GrpcError as e: + logger.error(f"爬取动态失败:{e.code} {e.msg}") + return if not dynamics: # 没发过动态 if uid in offset and offset[uid] == -1: # 不记录会导致第一次发动态不推送 @@ -96,8 +101,9 @@ async def dy_sched(): } message = ( f"{name} {type_msg.get(dynamic.card_type, type_msg[0])}:\n" - f"{f'动态图片可能截图异常:{err}' if err else ''}\n" - f"{MessageSegment.image(image)}\n{url}" + + str(f"动态图片可能截图异常:{err}\n" if err else "") + + MessageSegment.image(image) + + f"\n{url}" ) push_list = await db.get_push_list(uid, "dynamic") diff --git a/haruka_bot/plugins/pusher/live_pusher.py b/haruka_bot/plugins/pusher/live_pusher.py index c60e3cd..535d44d 100644 --- a/haruka_bot/plugins/pusher/live_pusher.py +++ b/haruka_bot/plugins/pusher/live_pusher.py @@ -16,6 +16,7 @@ "interval", seconds=plugin_config.haruka_live_interval, id="live_sched" ) async def live_sched(): + # sourcery skip: use-fstring-for-concatenation """直播推送""" uids = await db.get_uid_list("live") @@ -42,20 +43,22 @@ async def live_sched(): url = f"https://live.bilibili.com/{room_id}" title = info["title"] cover = info["cover_from_user"] or info["keyframe"] - area_parent = info["area_v2_parent_name"] area = info["area_v2_name"] + area_parent = info["area_v2_parent_name"] room_area = f"{area_parent} / {area}" logger.info(f"检测到开播:{name}({uid})") live_msg = ( - f"{name} 开播啦!\n分区:{room_area}\n标题:{title}\n{MessageSegment.image(cover)}\n{url}" + f"{name} 开播啦!\n分区:{room_area}\n标题:{title}\n" + + MessageSegment.image(cover) + + f"\n{url}" ) else: # 下播 logger.info(f"检测到下播:{name}({uid})") if not plugin_config.haruka_live_off_notify: # 没开下播推送 continue live_time_msg = ( - f",本次直播时长 {calc_time_total(time.time() - live_time[uid])}。" - if live_time[uid] + f"\n本次直播时长 {calc_time_total(time.time() - live_time[uid])}。" + if live_time.get(uid) else "。" ) live_msg = f"{name} 下播了{live_time_msg}" diff --git a/haruka_bot/plugins/sub/sub_list.py b/haruka_bot/plugins/sub/sub_list.py index 59de036..6cc18e8 100644 --- a/haruka_bot/plugins/sub/sub_list.py +++ b/haruka_bot/plugins/sub/sub_list.py @@ -19,7 +19,7 @@ async def _(event: MessageEvent, bot: Bot): user = await db.get_user(uid=sub.uid) assert user is not None message += ( - f"{user.name}({user.uid})" + f"{user.name}({user.uid})\n" f"直播:{'开' if sub.live else '关'}," f"动态:{'开' if sub.dynamic else '关'}," # TODO 私聊不显示全体 diff --git a/haruka_bot/utils/browser.py b/haruka_bot/utils/browser.py index 99f45a9..62c5391 100644 --- a/haruka_bot/utils/browser.py +++ b/haruka_bot/utils/browser.py @@ -7,12 +7,12 @@ from typing import Optional from nonebot.log import logger +from aunly_captcha_solver import CaptchaInfer from playwright.__main__ import main from playwright.async_api import BrowserContext, async_playwright, Page from ..config import plugin_config from .fonts_provider import fill_font -from .captcha import resolve_captcha from ..utils import get_path _browser: Optional[BrowserContext] = None @@ -20,6 +20,7 @@ async def init_browser(proxy=plugin_config.haruka_proxy, **kwargs) -> BrowserContext: + logger.info("初始化浏览器") if proxy: kwargs["proxy"] = {"server": proxy} global _browser @@ -38,6 +39,7 @@ async def init_browser(proxy=plugin_config.haruka_proxy, **kwargs) -> BrowserCon else None ), device_scale_factor=2, + timeout=plugin_config.haruka_dynamic_timeout * 1000, **kwargs, ) if plugin_config.haruka_screenshot_style.lower() != "mobile": @@ -57,7 +59,7 @@ async def init_browser(proxy=plugin_config.haruka_proxy, **kwargs) -> BrowserCon async def get_browser() -> BrowserContext: global _browser - if not _browser or _browser.browser is None or not _browser.browser.is_connected(): + if not _browser: _browser = await init_browser() return _browser @@ -78,7 +80,7 @@ async def get_dynamic_screenshot(dynamic_id, style=plugin_config.haruka_screensh clip["height"] = min(clip["height"], 32766) return ( await page.screenshot(clip=clip, full_page=True, type="jpeg", quality=98), - err, + None, ) except TimeoutError: logger.warning(f"截图超时,重试 {i + 1}/3") @@ -115,13 +117,12 @@ async def get_dynamic_screenshot_mobile(dynamic_id, page: Page): await page.set_viewport_size({"width": 460, "height": 780}) await page.route(re.compile("^https://static.graiax/fonts/(.+)$"), fill_font) if plugin_config.haruka_captcha_address: - page = await resolve_captcha(url, page) - else: - await page.goto( - url, - wait_until="networkidle", - timeout=plugin_config.haruka_dynamic_timeout * 1000, + captcha = CaptchaInfer( + plugin_config.haruka_captcha_address, plugin_config.haruka_captcha_token ) + page = await captcha.solve_captcha(page, url) + else: + await page.goto(url, wait_until="networkidle") # 动态被删除或者进审核了 if page.url == "https://m.bilibili.com/404": raise Notfound @@ -137,11 +138,8 @@ async def get_dynamic_screenshot_mobile(dynamic_id, page: Page): # "dyn.style.overflowWrap='break-word'" # ) - await page.wait_for_load_state(state="domcontentloaded", timeout=20000) - if "opus" in page.url: - await page.wait_for_selector(".opus-module-author", state="visible") - else: - await page.wait_for_selector(".dyn-header__author__face", state="visible") + await page.wait_for_load_state(state="domcontentloaded") + await page.wait_for_selector(".b-img__inner, .dyn-header__author__face", state="visible") await page.add_script_tag(path=mobile_js) @@ -159,7 +157,7 @@ async def get_dynamic_screenshot_mobile(dynamic_id, page: Page): await page.wait_for_load_state("domcontentloaded") await page.wait_for_timeout( - 200 if plugin_config.haruka_dynamic_font_source == "remote" else 50 + 1000 if plugin_config.haruka_dynamic_font_source == "remote" else 200 ) # 判断字体是否加载完成 @@ -177,11 +175,7 @@ async def get_dynamic_screenshot_pc(dynamic_id, page: Page): """电脑端动态截图""" url = f"https://t.bilibili.com/{dynamic_id}" await page.set_viewport_size({"width": 2560, "height": 1080}) - await page.goto( - url, - wait_until="networkidle", - timeout=plugin_config.haruka_dynamic_timeout * 1000, - ) + await page.goto(url, wait_until="networkidle") # 动态被删除或者进审核了 if page.url == "https://www.bilibili.com/404": raise Notfound diff --git a/haruka_bot/utils/captcha.py b/haruka_bot/utils/captcha.py deleted file mode 100644 index 11e3c31..0000000 --- a/haruka_bot/utils/captcha.py +++ /dev/null @@ -1,125 +0,0 @@ -import contextlib -from typing import Optional, List - -import httpx -from nonebot.log import logger -from playwright._impl._api_structures import Position -from playwright.async_api import Page, Response -from pydantic import BaseModel -from yarl import URL - -from ..config import plugin_config - - -class CaptchaData(BaseModel): - captcha_id: str - points: List[List[int]] - rectangles: List[List[int]] - yolo_data: List[List[int]] - time: int - - -class CaptchaResponse(BaseModel): - code: int - message: str - data: Optional[CaptchaData] - - -async def resolve_captcha(url: str, page: Page) -> Page: - captcha_image_body = "" - last_captcha_id = "" - captcha_result = None - - async def captcha_image_url_callback(response: Response): - nonlocal captcha_image_body - logger.debug(f"[Captcha] Get captcha image url: {response.url}") - captcha_image_body = await response.body() - - async def captcha_result_callback(response: Response): - nonlocal captcha_result, last_captcha_id - logger.debug(f"[Captcha] Get captcha result: {response.url}") - captcha_resp = await response.text() - logger.debug(f"[Captcha] Result: {captcha_resp}") - if '"result": "success"' in captcha_resp: - logger.success("[Captcha] 验证码 Callback 验证成功") - captcha_result = True - elif '"result": "click"' in captcha_resp: - pass - else: - if last_captcha_id: - logger.warning(f"[Captcha] 验证码 Callback 验证失败,正在上报:{last_captcha_id}") - async with httpx.AsyncClient() as client: - await client.post( - f"{captcha_baseurl}/report", - json={"captcha_id": last_captcha_id}, - ) - last_captcha_id = "" - captcha_result = False - - captcha_address = URL(plugin_config.haruka_captcha_address) - page.on( - "response", - lambda response: captcha_image_url_callback(response) - if response.url.startswith("https://static.geetest.com/captcha_v3/") - else None, - ) - page.on( - "response", - lambda response: captcha_result_callback(response) - if response.url.startswith("https://api.geetest.com/ajax.php") - else None, - ) - - with contextlib.suppress(TimeoutError): - await page.goto( - url, - wait_until="networkidle", - timeout=plugin_config.haruka_dynamic_timeout * 1000, - ) - - captcha_baseurl = f"{captcha_address.scheme}://{captcha_address.host}:{captcha_address.port}/captcha/select" - while captcha_image_body or captcha_result is False: - logger.warning("[Captcha] 需要人机验证,正在尝试自动解决验证码") - captcha_image = await page.query_selector(".geetest_item_img") - assert captcha_image - captcha_size = await captcha_image.bounding_box() - assert captcha_size - origin_image_size = 344, 384 - - async with httpx.AsyncClient() as client: - captcha_req = await client.post( - f"{captcha_baseurl}/bytes", - timeout=10, - files={"img_file": captcha_image_body}, - ) - captcha_req = CaptchaResponse(**captcha_req.json()) - logger.debug(f"[Captcha] Get Resolve Result: {captcha_req}") - assert captcha_req.data - last_captcha_id = captcha_req.data.captcha_id - if captcha_req.data: - click_points: List[List[int]] = captcha_req.data.points - logger.warning(f"[Captcha] 识别到 {len(click_points)} 个坐标,正在点击") - # 根据原图大小和截图大小计算缩放比例,然后计算出正确的需要点击的位置 - for point in click_points: - real_click_points = { - "x": point[0] * captcha_size["width"] / origin_image_size[0], - "y": point[1] * captcha_size["height"] / origin_image_size[1], - } - await captcha_image.click(position=Position(**real_click_points)) - await page.wait_for_timeout(800) - await page.click("text=确认") - geetest_up = await page.wait_for_selector(".geetest_up", state="visible") - if not geetest_up: - logger.warning("[Captcha] 未检测到验证码验证结果,正在重试") - continue - geetest_result = await geetest_up.text_content() - assert geetest_result - logger.debug(f"[Captcha] Geetest result: {geetest_result}") - if "验证成功" in geetest_result: - logger.success("[Captcha] 极验网页 Tip 验证成功") - captcha_image_body = "" - await page.wait_for_timeout(2000) - else: - logger.warning("[Captcha] 极验验证失败,正在重试") - - return page diff --git a/haruka_bot/utils/mobile.js b/haruka_bot/utils/mobile.js index 612cc41..2b80c0e 100644 --- a/haruka_bot/utils/mobile.js +++ b/haruka_bot/utils/mobile.js @@ -157,7 +157,7 @@ function setFont(font = "", fontSource = "local") { // 如果传入了字体名, 则将其添加到字体列表首位 if (fontSource === "local") { needLoadFontList.unshift({ - fontUrl: `https://fonts.bbot/${font}`, + fontUrl: `https://static.graiax/fonts/${font}`, fontFamily: "BBot_Custom_Font", }); } else if (fontSource === "remote") { diff --git a/haruka_bot/version.py b/haruka_bot/version.py index bbf0a93..87523e1 100644 --- a/haruka_bot/version.py +++ b/haruka_bot/version.py @@ -1,4 +1,4 @@ from packaging.version import Version -__version__ = "1.6.0post4" +__version__ = "1.6.0post5" VERSION = Version(__version__) diff --git a/pdm.lock b/pdm.lock index 8e789f6..7a4c1ea 100644 --- a/pdm.lock +++ b/pdm.lock @@ -38,6 +38,18 @@ version = "0.27.0" requires_python = ">=3.7.0" summary = "An asyncio PostgreSQL driver" +[[package]] +name = "aunly-captcha-solver" +version = "0.1.2" +requires_python = ">=3.8" +summary = "适用于 B 站手机网页版的点选验证码识别" +dependencies = [ + "httpx>=0.24.1", + "loguru>=0.7.0", + "playwright>=1.35.0", + "pydantic<=2.0,>=1.10", +] + [[package]] name = "backports-zoneinfo" version = "0.2.1" @@ -154,7 +166,7 @@ summary = "Simple module to parse ISO 8601 dates" [[package]] name = "loguru" -version = "0.6.0" +version = "0.7.0" requires_python = ">=3.5" summary = "Python logging made (stupidly) simple" dependencies = [ @@ -291,7 +303,7 @@ summary = "ASN.1 types and codecs" [[package]] name = "pydantic" -version = "1.10.9" +version = "1.10.10" requires_python = ">=3.7" summary = "Data validation and settings management using python type hints" dependencies = [ @@ -300,12 +312,12 @@ dependencies = [ [[package]] name = "pydantic" -version = "1.10.9" +version = "1.10.10" extras = ["dotenv"] requires_python = ">=3.7" summary = "Data validation and settings management using python type hints" dependencies = [ - "pydantic==1.10.9", + "pydantic==1.10.10", "python-dotenv>=0.10.4", ] @@ -423,7 +435,7 @@ dependencies = [ [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.6.3" requires_python = ">=3.7" summary = "Backported and Experimental Type Hints for Python 3.7+" @@ -512,7 +524,7 @@ dependencies = [ lock_version = "4.2" cross_platform = true groups = ["default", "dev"] -content_hash = "sha256:c592d987aaec91601c5f5629217138982a61969d58bc0bbb49c2755434561b7d" +content_hash = "sha256:6f2384e3e825323301fbac128a121cbad7f9373c3e81f5621923e450176dfc8e" [metadata.files] "aiosqlite 0.17.0" = [ @@ -565,6 +577,10 @@ content_hash = "sha256:c592d987aaec91601c5f5629217138982a61969d58bc0bbb49c275543 {url = "https://files.pythonhosted.org/packages/e7/84/0e848301b97bde051e8f318d6b3af2b51e0398a88230231f2d3cbf3fa077/asyncpg-0.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:88b62164738239f62f4af92567b846a8ef7cf8abf53eddd83650603de4d52163"}, {url = "https://files.pythonhosted.org/packages/f3/66/b9efec66d97008fd0276382fdcb9ebd47e8c66484d4ae2feef67e7d482a9/asyncpg-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20b596d8d074f6f695c13ffb8646d0b6bb1ab570ba7b0cfd349b921ff03cfc1e"}, ] +"aunly-captcha-solver 0.1.2" = [ + {url = "https://files.pythonhosted.org/packages/83/59/d0ff6b0da176fbae9a768211a1b9327a10f417c5d2b9e3dfa72e12b4cb2d/aunly_captcha_solver-0.1.2-py3-none-any.whl", hash = "sha256:586583d0b286180887ba789f3e0f6b0233bea965c7200e6258e25e752a24dd7b"}, + {url = "https://files.pythonhosted.org/packages/9a/a5/455a59dbb5a5dc09e872a5f14870b18bda517b0fa1890294911d10f837f1/aunly_captcha_solver-0.1.2.tar.gz", hash = "sha256:30cf19cae8766aa5f19854bd0c6a567dbf4296f916c880722e402f76d87aaf81"}, +] "backports-zoneinfo 0.2.1" = [ {url = "https://files.pythonhosted.org/packages/1a/ab/3e941e3fcf1b7d3ab3d0233194d99d6a0ed6b24f8f956fc81e47edc8c079/backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, {url = "https://files.pythonhosted.org/packages/1c/96/baaca3ad1b06d97138d42a225e4d4d27cd1586b646740f771706cd2d812c/backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, @@ -779,9 +795,9 @@ content_hash = "sha256:c592d987aaec91601c5f5629217138982a61969d58bc0bbb49c275543 {url = "https://files.pythonhosted.org/packages/31/8c/1c342fdd2f4af0857684d16af766201393ef53318c15fa785fcb6c3b7c32/iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, {url = "https://files.pythonhosted.org/packages/65/6c/9d72435c72adfa6e4ed1824b6df7fffbeaaf15c653881e9b041a318ba572/iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, ] -"loguru 0.6.0" = [ - {url = "https://files.pythonhosted.org/packages/75/1f/d3818863e4be96bd641c4643c535a98f0fa2a12efa7c8ba35f763fa778ee/loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, - {url = "https://files.pythonhosted.org/packages/fe/21/e1d1da2586865a159fc73b611f36bdd50b6c4043cb6132d3d5e972988028/loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, +"loguru 0.7.0" = [ + {url = "https://files.pythonhosted.org/packages/0c/1d/697cbb4ae54217784c1c4805696efb2fd7a1cbbe4827264a80a49e52b828/loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, + {url = "https://files.pythonhosted.org/packages/71/bd/337f7a0cd2628c4c77512d78e26f93b13c327a2ddf2132001dd78c000bf4/loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, ] "msgpack 1.0.4" = [ {url = "https://files.pythonhosted.org/packages/01/9c/26a337b8d4a7cb5b1058bec7f187936bf749e78cd519c497e845e965d2e5/msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, @@ -997,43 +1013,43 @@ content_hash = "sha256:c592d987aaec91601c5f5629217138982a61969d58bc0bbb49c275543 {url = "https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, {url = "https://files.pythonhosted.org/packages/a4/db/fffec68299e6d7bad3d504147f9094830b704527a7fc098b721d38cc7fa7/pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] -"pydantic 1.10.9" = [ - {url = "https://files.pythonhosted.org/packages/02/05/1c505fd7cc174ddecd5aa956057638ba6039b584af6fa9687f11a074fca7/pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"}, - {url = "https://files.pythonhosted.org/packages/0a/53/5dbbfac34a8040d9af562287d7604d001170b88aa0df6789ce670aa77718/pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"}, - {url = "https://files.pythonhosted.org/packages/0e/7a/6d5d0cd7155a9625a78860698b2efe992eb9539eeddbeca099e34b0b0bb5/pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"}, - {url = "https://files.pythonhosted.org/packages/0f/2e/e22c5765f342d8250edf706c6852c241d1c0696387464343026e47f92399/pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"}, - {url = "https://files.pythonhosted.org/packages/1b/36/d0699cae7a41eb741175321ec338095d9981d05661a543b1705b35fcf7fa/pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"}, - {url = "https://files.pythonhosted.org/packages/1c/09/2395aebb2363026f23599df9c79353111ba0921d9b5fa188fc63065d605f/pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"}, - {url = "https://files.pythonhosted.org/packages/1d/ac/d9b98a37670d755f2488dba7e2b3a91e1f4123fe32c726827a03a24af7b1/pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"}, - {url = "https://files.pythonhosted.org/packages/25/7d/b15e5da706957af6a570a2155ad80db47a82f1fe343beb9903b38adbb6a3/pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"}, - {url = "https://files.pythonhosted.org/packages/26/8f/8d93aae2517f702858b16d11bb3b740fa57cf00d2f986026ff852e1d6993/pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"}, - {url = "https://files.pythonhosted.org/packages/2d/8b/00fa25d377e804bb78e2d9c0cf75363d16e92bb7b6359aec825175520b12/pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"}, - {url = "https://files.pythonhosted.org/packages/2d/ba/7d8c23a4c80bf33c3bffc66e98818087d1662eeaa44bdadb58bfbfcbd10f/pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"}, - {url = "https://files.pythonhosted.org/packages/35/2c/eadcfc255b5ba09113ba2cef4910355656116591947e8251ef03e14ac2b4/pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"}, - {url = "https://files.pythonhosted.org/packages/3d/dc/e6c3abd1e486c32ace48c0a5f545865f54c934ce809192aaa56e10989ed6/pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"}, - {url = "https://files.pythonhosted.org/packages/45/3c/23b1d0ca338ee91ad45057a4ef1130282bf155a3b45c9e82d2adf89ddceb/pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"}, - {url = "https://files.pythonhosted.org/packages/46/a2/8b29ba7ff9666ad96e23258d317fbf63f66c397801a274e352fc532ab901/pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"}, - {url = "https://files.pythonhosted.org/packages/5b/31/e773155df3b875f5c7af23a5a8db5f8b9f06526cc08bc20a02c07d24f263/pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"}, - {url = "https://files.pythonhosted.org/packages/63/c3/a79f780b1e52b2e836f489f09710451e110114be5eede5dcaa57535d7a7d/pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"}, - {url = "https://files.pythonhosted.org/packages/66/a8/85ce916a7be8f601782b5a4162ddfedafccbb7ab61b1b409507aab7f9913/pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"}, - {url = "https://files.pythonhosted.org/packages/6a/88/4979f837c8ec013761610ea7c27f0fc99bcc7e06ece6c239fafff1b282f5/pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"}, - {url = "https://files.pythonhosted.org/packages/7b/54/6843930a0a0632e8431a3d2071e253e1bddd1ac41ea32ae40897497cd14f/pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"}, - {url = "https://files.pythonhosted.org/packages/8b/7b/41b331751b75cc215724c49646bef438fb23f4d1e3938e07fd5a10178b67/pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"}, - {url = "https://files.pythonhosted.org/packages/8c/ea/1483d76e4048af279fe7f49f35ea0fce6ec34d6b0276c775618204121cd0/pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"}, - {url = "https://files.pythonhosted.org/packages/a5/2a/dbc7a80b6192cc49efb27dc9c29965911ce7aef95c11466989ffcf0b0784/pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"}, - {url = "https://files.pythonhosted.org/packages/b5/e9/5ffcdbe8ceb1ac23184b16bbd90fb5f20cdf1022e658d864c7782a32bc40/pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"}, - {url = "https://files.pythonhosted.org/packages/b8/38/d956a7a25c962a0b231a33fc4323c31177920cd6f0cdea69e0225369dad0/pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"}, - {url = "https://files.pythonhosted.org/packages/bd/d2/703bfdc4a17f4c20d0d76fd447266a8e5e58208b4a75aaa2aa3534f9000b/pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"}, - {url = "https://files.pythonhosted.org/packages/c0/82/a14d25985fbfe7be8ba871db8d6a972c1bd9af8a904425b335ce37830b80/pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"}, - {url = "https://files.pythonhosted.org/packages/c7/5e/d2f760680276a015b7b9a3ccd66e4ab7924d3ee425fcf59daa949dc2ae79/pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"}, - {url = "https://files.pythonhosted.org/packages/ca/1a/78c25abfc36fd22ae79042dc26692cfead3fc03eeb5dbaae50536f1bc9c1/pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"}, - {url = "https://files.pythonhosted.org/packages/ce/4c/56283ddccc9cf5f4fabad21b0fec0f28867225c0cedd9ef3432872bf9456/pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"}, - {url = "https://files.pythonhosted.org/packages/ce/80/92bdb68e1fda29be502adfd0b95c4cdef41f498a35125d0d540d4696c091/pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"}, - {url = "https://files.pythonhosted.org/packages/cf/6b/19bc450d7d51ed7e5eddfe2e09f10bd054b8e766526fbf1e6735d185039e/pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"}, - {url = "https://files.pythonhosted.org/packages/d5/27/29f43b7148eb3d6e5fdd14935e88f03b6b501baddf88fb6913da7f3f7661/pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"}, - {url = "https://files.pythonhosted.org/packages/e1/36/9d92178cba055627c891f3a57b660d2d4e6fe84419a520d16a677050b4e1/pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"}, - {url = "https://files.pythonhosted.org/packages/ec/0a/cf955f8bb3b9498d554522cfe7cb9b019ba9f8b86e2879009f604207b72c/pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"}, - {url = "https://files.pythonhosted.org/packages/ed/8c/278ece6217c6dc15ab588e2b68d3d9953b426648f70444eed93eb61f8d30/pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"}, +"pydantic 1.10.10" = [ + {url = "https://files.pythonhosted.org/packages/0d/cf/19ea27c3612b860da394f94bedef6c5ad2b561de0b8228eb1fdba60b7ac5/pydantic-1.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4870f13a4fafd5bc3e93cff3169222534fad867918b188e83ee0496452978437"}, + {url = "https://files.pythonhosted.org/packages/1a/d6/431356f6eaa86889cf073a0fec74ec9511484c6410683bfea8f1d297ce4e/pydantic-1.10.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e088e3865a2270ecbc369924cd7d9fbc565667d9158e7f304e4097ebb9cf98dd"}, + {url = "https://files.pythonhosted.org/packages/24/31/f437a753bd530c5f20bddd4d258cf18435cd265482bff954962e47ebe8c5/pydantic-1.10.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7aa75d1bd9cc275cf9782f50f60cddaf74cbaae19b6ada2a28e737edac420312"}, + {url = "https://files.pythonhosted.org/packages/2b/fb/5156a6dd16aad8ffd7f45d743e2ca680b2d1fee3fcbf692bf914f286dfa5/pydantic-1.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a7db03339893feef2092ff7b1afc9497beed15ebd4af84c3042a74abce02d48"}, + {url = "https://files.pythonhosted.org/packages/39/5d/0d107e316dddf3061248ef6e069bdc986d0ecc6fd1d5cce282be1cea6b1f/pydantic-1.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f79db3652ed743309f116ba863dae0c974a41b688242482638b892246b7db21d"}, + {url = "https://files.pythonhosted.org/packages/39/e8/6c0ff73c8b45798ecf78c3b59980683334491605cda10c94c4d432002c7a/pydantic-1.10.10-cp37-cp37m-win_amd64.whl", hash = "sha256:9f62a727f5c590c78c2d12fda302d1895141b767c6488fe623098f8792255fe5"}, + {url = "https://files.pythonhosted.org/packages/3b/e8/12d37c26e8cd17848aff5947d2f66dceb5ee9a8facc81bd3c1f01d063a68/pydantic-1.10.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3403a090db45d4027d2344859d86eb797484dfda0706cf87af79ace6a35274ef"}, + {url = "https://files.pythonhosted.org/packages/3d/b8/4ff9559174ed4513adb1f477e795023965611e9bd6a529a2c74b167c1a63/pydantic-1.10.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ce937a2a2c020bcad1c9fde02892392a1123de6dda906ddba62bfe8f3e5989a2"}, + {url = "https://files.pythonhosted.org/packages/3f/97/8b7c5ff63b304db8c4df5c5fa94752393395e29394afdb86e73eec7a79b1/pydantic-1.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86936c383f7c38fd26d35107eb669c85d8f46dfceae873264d9bab46fe1c7dde"}, + {url = "https://files.pythonhosted.org/packages/43/38/b19aac63f729c5982b1ea6282e99bce534f028729588d7444ac60c6a5248/pydantic-1.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:37ebddef68370e6f26243acc94de56d291e01227a67b2ace26ea3543cf53dd5f"}, + {url = "https://files.pythonhosted.org/packages/43/84/589d1e185be3b2f602166699ab3f0f1e22f00e98c83a382eb3906e9152d2/pydantic-1.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c62376890b819bebe3c717a9ac841a532988372b7e600e76f75c9f7c128219d5"}, + {url = "https://files.pythonhosted.org/packages/48/00/0c8bdbc73b69854e2e06bf483a701911eebbcb984e9ad2fe56e3b9d87250/pydantic-1.10.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8c40964596809eb616d94f9c7944511f620a1103d63d5510440ed2908fc410af"}, + {url = "https://files.pythonhosted.org/packages/4f/2f/2f2940a297264107c74e835e46d2564f98d0f5a1abc5b0ed3148cab6274e/pydantic-1.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:566a04ba755e8f701b074ffb134ddb4d429f75d5dced3fbd829a527aafe74c71"}, + {url = "https://files.pythonhosted.org/packages/51/25/5aade6a87321b1aa8ee52d34dc86f703ece897e12983960504c408588a16/pydantic-1.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c41bbaae89e32fc582448e71974de738c055aef5ab474fb25692981a08df808a"}, + {url = "https://files.pythonhosted.org/packages/5d/e6/19bf53dd62c04925c1396f9f2e4a44ce008dded600839097b411674a6de8/pydantic-1.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:a2d5be50ac4a0976817144c7d653e34df2f9436d15555189f5b6f61161d64183"}, + {url = "https://files.pythonhosted.org/packages/5f/ba/64fbd2e322e367c6244a6348fb239ae7ed7465d429e288ed860b9a63cd2f/pydantic-1.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edfdf0a5abc5c9bf2052ebaec20e67abd52e92d257e4f2d30e02c354ed3e6030"}, + {url = "https://files.pythonhosted.org/packages/62/8c/477522d0de12b211e3260c915955cbdf11390d19b8d112593ae70a484c5b/pydantic-1.10.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a3b30fd255eeeb63caa9483502ba96b7795ce5bf895c6a179b3d909d9f53a6"}, + {url = "https://files.pythonhosted.org/packages/80/fb/8ffd090805ccff521ed2538177d98a353e4f2ea838fc83bb2bd3276da3a0/pydantic-1.10.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3d4ee957a727ccb5a36f1b0a6dbd9fad5dedd2a41eada99a8df55c12896e18d"}, + {url = "https://files.pythonhosted.org/packages/8f/ed/da9ac52953eff4c3687bcd3789cc53dc2a4e01a87ff7d71da5d4651a8b9a/pydantic-1.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a26841be620309a9697f5b1ffc47dce74909e350c5315ccdac7a853484d468a"}, + {url = "https://files.pythonhosted.org/packages/92/90/670394832cbf3decee949ea7dc56c3e413607bdd2da7679c3fd6fda161a3/pydantic-1.10.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:762aa598f79b4cac2f275d13336b2dd8662febee2a9c450a49a2ab3bec4b385f"}, + {url = "https://files.pythonhosted.org/packages/96/22/28823352c589f420288fa2f4e403f73b987516ec3d7cb5e6a27f3c0ff159/pydantic-1.10.10-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b69f9138dec566962ec65623c9d57bee44412d2fc71065a5f3ebb3820bdeee96"}, + {url = "https://files.pythonhosted.org/packages/99/2c/0326d930a31e673a05594827012db1307647cba79e04942751ab50abd2da/pydantic-1.10.10-py3-none-any.whl", hash = "sha256:a5939ec826f7faec434e2d406ff5e4eaf1716eb1f247d68cd3d0b3612f7b4c8a"}, + {url = "https://files.pythonhosted.org/packages/9b/b3/a7e6ab836a486c0e06ef5c256c3aeda589f47fded8bcc73e41b0192e2791/pydantic-1.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aac218feb4af73db8417ca7518fb3bade4534fcca6e3fb00f84966811dd94450"}, + {url = "https://files.pythonhosted.org/packages/a3/0e/247191a49d636a6af7c9594ee35c6013a24999d4b51e56ff1f05eed40d54/pydantic-1.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:e0014e29637125f4997c174dd6167407162d7af0da73414a9340461ea8573252"}, + {url = "https://files.pythonhosted.org/packages/b0/46/0f1fb406edbfb51770ede5907dd01dba9d0e56975a5ea5fc14eff89a20c6/pydantic-1.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:adad1ee4ab9888f12dac2529276704e719efcf472e38df7813f5284db699b4ec"}, + {url = "https://files.pythonhosted.org/packages/b9/e0/b4f5ac92494664a0f1d3d59df62a5c7091bc10129a5e4e12fd8983c7697c/pydantic-1.10.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:990027e77cda6072a566e433b6962ca3b96b4f3ae8bd54748e9d62a58284d9d7"}, + {url = "https://files.pythonhosted.org/packages/c3/e9/673e38410df4e5dbdbbdacdc0c251234dbf39d3a603eedac672a803f92fa/pydantic-1.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:748d10ab6089c5d196e1c8be9de48274f71457b01e59736f7a09c9dc34f51887"}, + {url = "https://files.pythonhosted.org/packages/c9/fb/6225e6ac15897e73f34c4aa103bdba7455d1338b14e6b1083fb792b8afd8/pydantic-1.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b3714b97ff84b2689654851c2426389bcabfac9080617bcf4306c69db606f6"}, + {url = "https://files.pythonhosted.org/packages/cb/bb/419b32fc6d86687220374c86f3c82d2b8a777a3a8fd8aab71583e9d01e88/pydantic-1.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b71bd504d1573b0b722ae536e8ffb796bedeef978979d076bf206e77dcc55a5"}, + {url = "https://files.pythonhosted.org/packages/e1/4b/5887bf795e6b4d20e3bff2f9b8bd3773eec29d1890b61f8b98efe6264216/pydantic-1.10.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db4c7f7e60ca6f7d6c1785070f3e5771fcb9b2d88546e334d2f2c3934d949028"}, + {url = "https://files.pythonhosted.org/packages/e5/89/bbad719b3d92d94ca76b7639c27ddd7c40ec02fcf31a215f10fdf7715d8b/pydantic-1.10.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dab5219659f95e357d98d70577b361383057fb4414cfdb587014a5f5c595f7b"}, + {url = "https://files.pythonhosted.org/packages/e8/43/c9e0e07ec44fef69b4c3182792ca1992cd887758518963a7b09544fed89e/pydantic-1.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9965e49c6905840e526e5429b09e4c154355b6ecc0a2f05492eda2928190311d"}, + {url = "https://files.pythonhosted.org/packages/e9/bf/16add0c4fbf5fb3b59e77c56cb1fea92ba10fb0d351f558fae2c8b480244/pydantic-1.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88546dc10a40b5b52cae87d64666787aeb2878f9a9b37825aedc2f362e7ae1da"}, + {url = "https://files.pythonhosted.org/packages/eb/84/9b0a0e2d931fc9bdb32e6905076714f9592f9b20de03c90fd0f65b3ab063/pydantic-1.10.10.tar.gz", hash = "sha256:3b8d5bd97886f9eb59260594207c9f57dce14a6f869c6ceea90188715d29921a"}, + {url = "https://files.pythonhosted.org/packages/ef/fc/b02f036f159402af46460728206d718e7bf69e5764d5ad0c090f390667b9/pydantic-1.10.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:409b810f387610cc7405ab2fa6f62bdf7ea485311845a242ebc0bd0496e7e5ac"}, + {url = "https://files.pythonhosted.org/packages/f3/24/4fd5dee69b76d2f435a743f494a7a3cd96f7484be4d8e82c1eb77b849334/pydantic-1.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:ea9eebc2ebcba3717e77cdeee3f6203ffc0e78db5f7482c68b1293e8cc156e5e"}, ] "pyee 9.0.4" = [ {url = "https://files.pythonhosted.org/packages/99/d0/32803671d5d9dc032c766ad6c0716db98fa9b2c6ad9ec544f04849e9d3c7/pyee-9.0.4.tar.gz", hash = "sha256:2770c4928abc721f46b705e6a72b0c59480c4a69c9a83ca0b00bb994f1ea4b32"}, @@ -1129,9 +1145,9 @@ content_hash = "sha256:c592d987aaec91601c5f5629217138982a61969d58bc0bbb49c275543 {url = "https://files.pythonhosted.org/packages/58/cf/286eb8997113dd04a61c430b5a0d3b2aef9ee51031440d18357bf21740a9/tortoise_orm-0.19.3-py3-none-any.whl", hash = "sha256:9e368820c70a0866ef9c521d43aa5503485bd7a20a561edc0933b7b0f7036fbc"}, {url = "https://files.pythonhosted.org/packages/8a/47/4369c766243067776b4899b1041281d0fc2452b67a0d5a4b7ac72f3e962f/tortoise_orm-0.19.3.tar.gz", hash = "sha256:ca574bca5191f55608f9013314b1f5d1c6ffd4165a1fcc2f60f6c902f529b3b6"}, ] -"typing-extensions 4.4.0" = [ - {url = "https://files.pythonhosted.org/packages/0b/8e/f1a0a5a76cfef77e1eb6004cb49e5f8d72634da638420b9ea492ce8305e8/typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {url = "https://files.pythonhosted.org/packages/e3/a7/8f4e456ef0adac43f452efc2d0e4b242ab831297f1bac60ac815d37eb9cf/typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +"typing-extensions 4.6.3" = [ + {url = "https://files.pythonhosted.org/packages/42/56/cfaa7a5281734dadc842f3a22e50447c675a1c5a5b9f6ad8a07b467bffe7/typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, + {url = "https://files.pythonhosted.org/packages/5f/86/d9b1518d8e75b346a33eb59fa31bdbbee11459a7e2cc5be502fa779e96c5/typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, ] "tzdata 2022.7" = [ {url = "https://files.pythonhosted.org/packages/5b/30/b7abfb11be6642d26de1c1840d25e8d90333513350ad0ebc03101d55e13b/tzdata-2022.7.tar.gz", hash = "sha256:fe5f866eddd8b96e9fcba978f8e503c909b19ea7efda11e52e39494bad3a7bfa"}, diff --git a/pyproject.toml b/pyproject.toml index ff933ea..2ca1a7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,13 +13,14 @@ dependencies = [ "nonebot-plugin-apscheduler>=0.3.0", "nonebot2[fastapi]>=2.0.0", "playwright>=1.35.0", - "pydantic>=1.10.9", + "pydantic>=1.10.9, <=2.0", "python-dotenv>=1.0.0", "tortoise-orm[asyncpg]>=0.19.3", "bilireq>=0.2.6", "packaging>=23.1", "nonebot-plugin-guild-patch>=0.2.3", "msvc-runtime>=14.34.31931; sys_platform == \"win32\"", + "aunly-captcha-solver>=0.1", ] dynamic = ["version"] name = "haruka-bot" diff --git a/test.py b/test.py new file mode 100644 index 0000000..4fba05f --- /dev/null +++ b/test.py @@ -0,0 +1,12 @@ +def test(a): + try: + if a == 1: + raise Exception + return a + except Exception: + print("error") + finally: + print("finally") + + +print(test(2))