├── .deepsource.toml ├── .flake8 ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── 错误报告.md └── workflows │ ├── python-package.yml │ └── python-publish.yml ├── .gitignore ├── .pdm-python ├── .pre-commit-config.yaml ├── .ruff.toml ├── LICENSE ├── README.md ├── nonebot_plugin_genshin_cos ├── __init__.py ├── config.py ├── hoyospider.py ├── matcher.py └── utils.py ├── pdm.lock ├── pyproject.toml ├── res └── ico.png └── tests └── __init__.py /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "python" 5 | 6 | [analyzers.meta] 7 | runtime_version = "3.x.x" 8 | 9 | [[transformers]] 10 | name = "ruff" 11 | 12 | [[transformers]] 13 | name = "black" 14 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | select = E9, F63, F7, F82 3 | show-source = true 4 | statistics = true 5 | max-line-length = 127 6 | max-complexity = 10 7 | exclude = .git,__pycache__,docs/source/conf.py,old,build,dist 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[Feature]" 5 | labels: 'feature' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | * 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/错误报告.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 错误报告 3 | about: 运行时出现的错误 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **描述bug** 11 | 这里为具体描述的内容 12 | 13 | **怎么出现的** 14 | 1.步骤1 15 | 2.步骤2 16 | 3.步骤3 17 | …… 18 | 19 | **异常情况** 20 | 文字报错说明 21 | 22 | **屏幕截图** 23 | 这里是截图 24 | 25 | **版本情况** 26 | python:xxx 27 | nonebot2:xxx 28 | nonebot-plugin-genshin-cos:xxx 29 | …… 30 | 31 | **额外的说明** 32 | 这里是额外的描述 33 | -------------------------------------------------------------------------------- /.github/workflows/python-package.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python 3 | 4 | name: Python package 5 | 6 | on: 7 | push: 8 | branches: [ "main" ] 9 | pull_request: 10 | branches: [ "main" ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | python-version: ["3.8", "3.9", "3.10"] 20 | 21 | steps: 22 | - uses: actions/checkout@v3 23 | - name: Set up Python ${{ matrix.python-version }} 24 | uses: actions/setup-python@v3 25 | with: 26 | python-version: ${{ matrix.python-version }} 27 | - name: Install dependencies 28 | run: | 29 | python -m pip install --upgrade pip 30 | python -m pip install flake8 pytest 31 | python -m pip install pdm 32 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 33 | - name: Lint with flake8 34 | run: | 35 | # stop the build if there are Python syntax errors or undefined names 36 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 37 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 38 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 39 | - name: Install prerequisites 40 | run: pdm install 41 | -------------------------------------------------------------------------------- /.github/workflows/python-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish package to PyPI 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' # 匹配"v1.0.0"、"v1.0.0-alpha"等发布标签 7 | 8 | permissions: 9 | contents: write # 如果您的包发布到 GitHub Packages,则需要此权限 10 | packages: write # 如果您的包发布到 GitHub Packages,则需要此权限 11 | 12 | jobs: 13 | deploy: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Set up Python 19 | uses: actions/setup-python@v3 20 | with: 21 | python-version: '3.x' 22 | - name: Install dependencies 23 | run: | 24 | python -m pip install --upgrade pip 25 | pip install build 26 | - name: Build package 27 | run: python -m build 28 | - name: Publish package 29 | uses: pypa/gh-action-pypi-publish@release/v1 # 使用一个稳定的版本标签,而不是具体的提交哈希 30 | with: 31 | user: __token__ 32 | password: ${{ secrets.PYPI_API_TOKEN }} 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 105 | __pypackages__/ 106 | 107 | # Celery stuff 108 | celerybeat-schedule 109 | celerybeat.pid 110 | 111 | # SageMath parsed files 112 | *.sage.py 113 | 114 | # Environments 115 | .env 116 | .venv 117 | env/ 118 | venv/ 119 | ENV/ 120 | env.bak/ 121 | venv.bak/ 122 | 123 | # Spyder project settings 124 | .spyderproject 125 | .spyproject 126 | 127 | # Rope project settings 128 | .ropeproject 129 | 130 | # mkdocs documentation 131 | /site 132 | 133 | # mypy 134 | .mypy_cache/ 135 | .dmypy.json 136 | dmypy.json 137 | 138 | # Pyre type checker 139 | .pyre/ 140 | 141 | # pytype static type analyzer 142 | .pytype/ 143 | 144 | # Cython debug symbols 145 | cython_debug/ 146 | 147 | # PyCharm 148 | # JetBrains specific template is maintainted in a separate JetBrains.gitignore that can 149 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 150 | # and can be added to the global gitignore or merged into this file. For a more nuclear 151 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 152 | #.idea/ 153 | -------------------------------------------------------------------------------- /.pdm-python: -------------------------------------------------------------------------------- 1 | E:/nb-plugin/nonebot-plugin-genshin-cos/.venv/Scripts/python.exe 2 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/hadialqattan/pycln 3 | rev: v2.5.0 4 | hooks: 5 | - id: pycln 6 | args: [--config, pyproject.toml] 7 | 8 | - repo: https://github.com/pre-commit/pre-commit-hooks 9 | rev: v5.0.0 10 | hooks: 11 | # 检查大文件 12 | - id: check-added-large-files 13 | # 检查文件编码 14 | - id: end-of-file-fixer 15 | 16 | - repo: https://github.com/psf/black 17 | rev: 24.10.0 18 | hooks: 19 | - id: black 20 | stages: [pre-commit] 21 | 22 | # ruff check 23 | - repo: https://github.com/astral-sh/ruff-pre-commit 24 | # Ruff version. 25 | rev: v0.9.3 26 | hooks: 27 | # Run the linter. 28 | - id: ruff 29 | args: [--fix] 30 | # Run the formatter. 31 | - id: ruff-format 32 | -------------------------------------------------------------------------------- /.ruff.toml: -------------------------------------------------------------------------------- 1 | [lint] 2 | select = [ 3 | "F", # Pyflakes 4 | "E", # pycodestyle error 5 | "W", # pycodestyle warning 6 | "I", # isort 7 | "UP", # pyupgrade 8 | "ASYNC", # fflake8-async 9 | "S", # flake8-bandit 10 | "B", # flake8-bugbear 11 | "C4", # flake8-comprehensions 12 | "ISC", # flake8-implicit-str-concat 13 | "PIE", # flake8-pie 14 | "T20", # flake8-print 15 | "PYI", # flake8-pyi 16 | "PT", # flake8-pytest-style 17 | "Q", # flake8-quotes 18 | "RSE", # flake8-raise 19 | "RET", # flake8-return 20 | "SLOT", # flake8-slots 21 | "SIM", # flake8-simplify 22 | "TID", # flake8-tidy-imports 23 | "TCH", # flake8-type-checking 24 | "ARG", # flake8-unused-arguments 25 | "PTH", # flake8-use-pathlib 26 | "ERA", # eradicate 27 | "PL", # Pylint 28 | "TRY", # tryceratops 29 | "PERF", # Perflint 30 | # "FURB", # refurb 31 | "RUF", # Ruff-specific rules 32 | ] 33 | ignore = [ 34 | "E402", # module-import-not-at-top-of-file 35 | "E501", # line-too-long 36 | "B009", # get-attr-with-constant 37 | "B010", # set-attr-with-constant 38 | "PLC0414", # useless-import-alias 39 | "PLR0913", # too-many-arguments 40 | "TRY003", # raise-vanilla-args 41 | "RUF001", # ambiguous-unicode-character-string 42 | "RUF002", # ambiguous-unicode-character-docstring 43 | "RUF003", # ambiguous-unicode-character-comment 44 | 45 | # Avoid formatter conflicts, see https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules 46 | "W191", # tab-indentation 47 | "E111", # indentation-with-invalid-multiple 48 | "E114", # indentation-with-invalid-multiple-comment 49 | "E117", # over-indented 50 | "D206", # indent-with-spaces 51 | "D300", # triple-single-quotes 52 | "Q000", # bad-quotes-inline-string 53 | "Q001", # bad-quotes-multiline-string 54 | "Q002", # bad-quotes-docstring 55 | "Q003", # avoidable-escaped-quote 56 | "COM812", # missing-trailing-comma 57 | "COM819", # prohibited-trailing-comma 58 | "ISC001", # single-line-implicit-string-concatenation 59 | "ISC002", # multi-line-implicit-string-concatenation 60 | ] 61 | unfixable = [ 62 | "F401", # unused-import 63 | "F841", # unused-variable 64 | "ERA001", # commented-out-code 65 | ] 66 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 divandia 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | NoneBotPluginLogo 4 | 5 |
6 | 7 |
8 | 9 | # nonebot-plugin-genshin-cos 10 | 11 | _⭐基于Nonebot2的一款获取米游社cos的插件⭐_ 12 | 13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 | 21 | ## ⭐ 介绍 22 | 23 | 受到[教程](https://juejin.cn/post/6990320268010848286)的启发,根据原文基础上修改编写出本插件,**若你不是Nonebot用户,并且想使用米游社cos相关内容,请参考[以下内容](https://github.com/Cvandia/nonebot_plugin_genshin_cos/blob/main/nonebot_plugin_genshin_cos/hoyospider.py)** 24 | 25 | 26 |
27 | 28 | 29 | ### 目前不仅有原神,现在支持崩坏3、星穹铁道、大别野、绝区零的cos图! 30 | 31 |
32 | 33 | ## 💿 安装 34 | 35 |
36 | 安装 37 | 38 | pip 安装 39 | 40 | ``` 41 | pip install nonebot-plugin-genshin-cos 42 | ``` 43 | - 在nonebot的pyproject.toml中的plugins = ["xxx"]添加此插件 44 | 45 | nb-cli安装 46 | 47 | ``` 48 | nb plugin install nonebot-plugin-genshin-cos --upgrade 49 | ``` 50 | 51 | git clone安装(不推荐) 52 | 53 | - 运行 54 | ```git clone https://github.com/Cvandia/nonebot_plugin_genshin_cos``` 55 | - 在运行处 56 | 把文件夹`nonebot-plugin-genshen-cos`复制到bot根目录下的`src/plugins`(或者你创建bot时的其他名称`xxx/plugins`) 57 | 58 | 59 |
60 | 61 |
62 | 注意 63 | 64 | 推荐镜像站下载 65 | 66 | 清华源```https://pypi.tuna.tsinghua.edu.cn/simple``` 67 | 68 | 阿里源```https://mirrors.aliyun.com/pypi/simple/``` 69 | 70 |
71 | 72 | 73 | ## ⚙️ 配置 74 | ### 在env.中添加以下配置 75 | 76 | | 配置 | 类型 | 默认值 | 说明 | 77 | |:-----:|:----:|:----:|:---:| 78 | |cos_max|int|5|最大返回cos图片数量| 79 | |cos_path|str|无|不配置则默认下载到bot根目录的`"data/genshin_cos"`,支持绝对路劲如`"C:/Users/image"`和相对bot根目录路劲如`"coser/image"` 80 | |cos_cd|int|30|用户触发cd| 81 | |cos_forward_msg|bool|True|默认是否合并转发| 82 | |cos_delay|float|0.5|当上面的配置项为`False`时,发送图片的每张延迟s| 83 | 84 | > 注意:绝对路劲中用`/`,用`\`可能会被转义 85 | 86 | ## ⭐ 使用 87 | 88 | ### 指令: 89 | | 指令 | 需要@ | 范围 | 说明 |权限| 90 | |:--------:|:----:|:----:|:----:|:----:| 91 | |下载cos|否|群聊、私聊|下载热门cos图|超管、群主、管理员| 92 | |热门cos|否|同上|获取指定游戏热门cos图,如`热门cos 原神 x3`|全部| 93 | |日、周、月榜cos|否|同上|获取排行榜cos图。如`日榜cos 原神 x3`|全部| 94 | |最新cos|否|同上|和上面差不多,不写了,哼哼|全部| 95 | |精品cos|否|同上|上上面一样的道理!|全部| 96 | |搜索(原神\|崩坏3\|星穹铁道\|大别野\|绝区零)cos|否|同上|搜索米游社社区的cos图片
例:
搜索原神cos甘雨
搜索崩坏3cos图德丽莎|全部| 97 | |开启每日推送xx (时间)|否|仅群聊|如`开启每日推送原神 8:30`,注意时间的格式|超管、群主、管理员| 98 | |查看本群推送|是|群聊|查看本群的订阅cos目录|全部| 99 | 100 | **注意** 101 | 102 | 指令触发方式是正则匹配的,不需要加指令前缀 103 | 104 | ## 🌙 未来 105 | - [x] 缓慢更新,最近学业繁忙哦~ 106 | - [x] 随机发送cos图片 107 | - [x] 保存cos图 108 | - [x] 内置cd和用户触发上限 109 | - [x] 合并转发发送多张cos图 110 | 111 | ~~playwright获取cos图~~ 112 | ~~选择发送图库方式:离线 (迅速) or 在线(缓慢、目前是的)~~ 113 | 114 | - [x] 支持米游社其他社区cos获取 115 | - [x] 支持每日推送热榜的cos图 116 | 117 | --- 喜欢记得点个star⭐--- 118 | 119 | ## ❗免责声明 120 | 121 | 图片版权归米游社原神cos社区所属,请尊重 122 | coser的创作权 123 | 124 | 125 | 126 | ## 💝 特别鸣谢 127 | 128 | - [x] [Nonebot](https://github.com/nonebot/nonebot2): 本项目的基础,非常好用的聊天机器人框架。 129 | - [x] [@qxdn](https://github.com/qxdn):感谢qxdn的[博客文章](https://qianxu.run/2021/11/12/mihoyo-bbs-crawler/),有兴趣大家也去看看咯 130 | -------------------------------------------------------------------------------- /nonebot_plugin_genshin_cos/__init__.py: -------------------------------------------------------------------------------- 1 | import contextlib 2 | 3 | from nonebot import logger, require 4 | 5 | require("nonebot_plugin_apscheduler") 6 | 7 | from . import matcher # noqa 8 | 9 | 10 | with contextlib.suppress(Exception): 11 | from nonebot.plugin import PluginMetadata 12 | 13 | __plugin_meta__ = PluginMetadata( 14 | name="米游社cos", 15 | description="获取原神coser图片", 16 | usage="原神cos,CosPlus,下载cos", 17 | type="application", 18 | homepage="https://github.com/Cvandia/nonebot-plugin-genshin-cos", 19 | supported_adapters={"~onebot.v11"}, 20 | extra={ 21 | "unique_name": "genshin_cos", 22 | "example": "保存cos:保存cos图片至本地文件", 23 | "author": "nor", 24 | "version": "0.3.3", 25 | }, 26 | ) 27 | 28 | 29 | logo = r""" 30 | /$$ /$$ /$$ /$$ /$$ /$$ /$$ /$$$$$$ 31 | | $$$ /$$$|__/| $$ | $$ | $$ /$$/ /$$__ $$ 32 | | $$$$ /$$$$ /$$| $$ | $$ /$$$$$$\ $$ /$$//$$$$$$ | $$ \__/ /$$$$$$ /$$$$$$$ 33 | | $$ $$/$$ $$| $$| $$$$$$$$ /$$__ $$\ $$$$//$$__ $$ | $$ /$$__ $$ /$$_____/ 34 | | $$ $$$| $$| $$| $$__ $$| $$ \ $$ \ $$/| $$ \ $$ | $$ | $$ \ $$| $$$$$$ 35 | | $$\ $ | $$| $$| $$ | $$| $$ | $$ | $$ | $$ | $$ | $$ $$| $$ | $$ \____ $$ 36 | | $$ \/ | $$| $$| $$ | $$| $$$$$$/ | $$ | $$$$$$/ | $$$$$$/| $$$$$$/ /$$$$$$$/ 37 | |__/ |__/|__/|__/ |__/ \______/ |__/ \______/ \______/ \______/ |_______/ 38 | """ 39 | 40 | logger.opt(colors=True).info(logo) 41 | -------------------------------------------------------------------------------- /nonebot_plugin_genshin_cos/config.py: -------------------------------------------------------------------------------- 1 | from nonebot import get_plugin_config 2 | from pydantic import BaseModel 3 | 4 | 5 | class Config(BaseModel): 6 | cos_max: int = 10 7 | cos_path: str = "" 8 | cos_cd: int = 10 9 | cos_forward_msg: bool = False 10 | cos_delay: float = 0.5 11 | 12 | 13 | config = get_plugin_config(Config) 14 | -------------------------------------------------------------------------------- /nonebot_plugin_genshin_cos/hoyospider.py: -------------------------------------------------------------------------------- 1 | from abc import abstractmethod 2 | from enum import Enum, unique 3 | 4 | import httpx 5 | from httpx import Response 6 | 7 | # 类定义 8 | 9 | 10 | class HoyoBasicSpider: 11 | def __init__(self) -> None: 12 | self.base_url = "https://bbs-api.mihoyo.com/post/wapi/" # 基础url 13 | self.api = "" # api 14 | self.forum_id = 0 # 论坛id 15 | self.gids = 0 # 游戏id 16 | self.is_good = False # 是否精品 17 | self.is_hot = False # 是否热门 18 | self.game_name = "" # 游戏名 19 | self.headers = { 20 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.0.0", 21 | "Referer": "https://bbs.mihoyo.com/", 22 | "origin": "https://bbs.mihoyo.com", 23 | "Host": "bbs-api.mihoyo.com", 24 | "Connection": "keep-alive", 25 | } 26 | 27 | @abstractmethod 28 | def get_params(self, page_size: int) -> dict: 29 | """ 30 | 获取参数 31 | 32 | 参数: 33 | - page_size: 每页数量 34 | 返回: 35 | - 参数字典 36 | """ 37 | return {} 38 | 39 | @abstractmethod 40 | def sync_get_urls(self, page_size: int) -> str: 41 | """ 42 | 同步获取urls 43 | 44 | 参数: 45 | - page_size: 每页数量 46 | 返回: 47 | - urls 48 | """ 49 | return "" 50 | 51 | @abstractmethod 52 | def sync_get_name(self, page_size: int) -> str: 53 | """ 54 | 同步获取names 55 | 56 | 参数: 57 | - page_size: 每页数量 58 | 返回: 59 | - names 60 | """ 61 | return "" 62 | 63 | def sync_get(self, params: dict, is_good: bool = False): 64 | """ 65 | 同步获取 66 | 67 | 参数: 68 | - params: 参数 69 | - is_good: 是否精品 70 | 返回: 71 | - 响应list 72 | """ 73 | 74 | response = httpx.get(self.api, params=params, headers=self.headers) 75 | return self.handle_response(response, is_good) 76 | 77 | def sync_name(self, params: dict, is_good: bool = False): 78 | """ 79 | 同步获取 80 | 81 | 参数: 82 | - params: 参数 83 | - is_good: 是否精品 84 | 返回: 85 | - 响应list 86 | """ 87 | 88 | response = httpx.get(self.api, params=params, headers=self.headers) 89 | return self.get_rsp_name(response, is_good) 90 | 91 | @abstractmethod 92 | async def async_get_urls(self, page_size: int = 20) -> list: 93 | """ 94 | 异步获取urls 95 | 96 | 参数: 97 | - page_size: 每页数量 98 | 返回: 99 | - urls 100 | """ 101 | return [] 102 | 103 | @abstractmethod 104 | async def async_get_name(self, page_size: int = 20) -> list: 105 | """ 106 | 异步获取names 107 | 108 | 参数: 109 | - page_size: 每页数量 110 | 返回: 111 | - names 112 | """ 113 | return [] 114 | 115 | async def async_get(self, params: dict, is_good: bool = False): 116 | """ 117 | 异步获取 118 | 119 | 参数: 120 | - params: 参数 121 | - is_good: 是否精品 122 | 返回: 123 | - 响应list 124 | """ 125 | 126 | async with httpx.AsyncClient() as client: 127 | response = await client.get(self.api, params=params, headers=self.headers) 128 | 129 | return self.handle_response(response, is_good) 130 | 131 | async def async_name(self, params: dict, is_good: bool = False): 132 | """ 133 | 异步获取 134 | 135 | 参数: 136 | - params: 参数 137 | - is_good: 是否精品 138 | 返回: 139 | - 响应list 140 | """ 141 | 142 | async with httpx.AsyncClient() as client: 143 | response = await client.get(self.api, params=params, headers=self.headers) 144 | return self.get_rsp_name(response, is_good) 145 | 146 | @staticmethod 147 | def handle_response(response: Response, is_good: bool = False) -> list: 148 | """ 149 | 处理响应 150 | 151 | 参数: 152 | - response: 响应 153 | - is_good: 是否精品 154 | 返回: 155 | - urls 156 | """ 157 | 158 | if is_good: 159 | posts = response.json()["data"]["posts"] 160 | else: 161 | posts = response.json()["data"]["list"] 162 | 163 | return [image for post in posts for image in post["post"]["images"]] 164 | 165 | @staticmethod 166 | def get_rsp_name(response: Response, is_good: bool = False) -> list: 167 | """ 168 | 获取响应的帖子名称 169 | 170 | 参数: 171 | - response: 响应 172 | - is_good: 是否精品 173 | 返回: 174 | - names 175 | """ 176 | if is_good: 177 | posts = response.json()["data"]["posts"] 178 | else: 179 | posts = response.json()["data"]["list"] 180 | return [post["post"]["subject"] for post in posts] 181 | 182 | 183 | @unique 184 | class RankType(Enum): 185 | """ 186 | 排行榜类型 187 | """ 188 | 189 | Daily = 1 # 日榜 190 | Weekly = 2 # 周榜 191 | Monthly = 3 # 月榜 192 | 193 | 194 | @unique 195 | class LatestType(Enum): 196 | """ 197 | 最新回复或发帖类型 198 | """ 199 | 200 | LatestComment = 1 # 最新回复 201 | LatestPost = 2 # 最新发帖 202 | 203 | 204 | @unique 205 | class GameType(Enum): 206 | """ 207 | 游戏类型 208 | """ 209 | 210 | Genshin = 2 # 原神 211 | Honkai3rd = 1 # 崩坏3 212 | DBY = 5 # 大别野 213 | StarRail = 6 # 星穹铁道 214 | Honkai2 = 3 # 崩坏2 215 | ZZZ = 8 # 绝区零 216 | 217 | 218 | @unique 219 | class ForumType(Enum): 220 | """ 221 | 论坛类型 222 | """ 223 | 224 | GenshinCos = 49 # 原神cos 225 | GenshinPic = 29 # 原神同人图 226 | Honkai3rdPic = 4 # 崩坏3同人图 227 | DBYCOS = 47 # 大别野cos 228 | DBYPIC = 39 # 大别野同人图 229 | StarRailPic = 56 # 星穹铁道同人图 230 | StarRailCos = 62 # 星穹铁道cos 231 | Honkai2Pic = 40 # 崩坏2同人图 232 | ZZZ = 65 # 绝区零 233 | 234 | 235 | def get_gids(forum: str) -> GameType: 236 | """ 237 | 根据论坛名获取游戏id 238 | """ 239 | forum2gids = { 240 | "GenshinCos": GameType.Genshin, 241 | "GenshinPic": GameType.Genshin, 242 | "Honkai3rdPic": GameType.Honkai3rd, 243 | "DBYCOS": GameType.DBY, 244 | "DBYPIC": GameType.DBY, 245 | "StarRailPic": GameType.StarRail, 246 | "Honkai2Pic": GameType.Honkai2, 247 | "StarRailCos": GameType.StarRail, 248 | "ZZZ": GameType.ZZZ, 249 | } 250 | return forum2gids[forum] 251 | 252 | 253 | class Rank(HoyoBasicSpider): 254 | """ 255 | 排行榜 256 | url: https://bbs.mihoyo.com/ys/imgRanking/49 257 | """ 258 | 259 | def __init__(self, forum_id: ForumType, type: RankType) -> None: 260 | super().__init__() 261 | self.api = self.base_url + "getImagePostList" 262 | self.forum_id = forum_id.value 263 | gametype = get_gids(forum_id.name) 264 | self.gids = gametype.value 265 | self.type = type.value # 排行榜类型 266 | self.game_name = gametype.name # 游戏名 267 | 268 | def get_params(self, page_size: int) -> dict: 269 | return { 270 | "forum_id": self.forum_id, 271 | "gids": self.gids, 272 | "page_size": page_size, 273 | "type": self.type, 274 | } 275 | 276 | def sync_get_urls(self, page_size: int = 21) -> list: 277 | params = self.get_params(page_size) 278 | return self.sync_get(params) 279 | 280 | async def async_get_urls(self, page_size: int = 21) -> list: 281 | params = self.get_params(page_size) 282 | return await self.async_get(params) 283 | 284 | async def async_get_name(self, page_size: int = 21) -> list: 285 | params = self.get_params(page_size) 286 | return await self.async_name(params) 287 | 288 | def sync_get_name(self, page_size: int = 21) -> list: 289 | params = self.get_params(page_size) 290 | return self.sync_name(params) 291 | 292 | 293 | class Hot(HoyoBasicSpider): 294 | """ 295 | 获取热门帖子 296 | url: https://bbs.mihoyo.com/ys/home/49?type=hot 297 | """ 298 | 299 | def __init__(self, forum_id: ForumType) -> None: 300 | super().__init__() 301 | self.api = self.base_url + "getForumPostList" 302 | self.forum_id = forum_id.value 303 | gametype = get_gids(forum_id.name) 304 | self.gids = gametype.value 305 | self.game_name = gametype.name # 游戏名 306 | self.is_hot = True 307 | 308 | def get_params(self, page_size: int) -> dict: 309 | return { 310 | "forum_id": self.forum_id, 311 | "is_hot": self.is_hot, 312 | "page_size": page_size, 313 | } 314 | 315 | def sync_get_urls(self, page_size: int = 20) -> list: 316 | params = self.get_params(page_size) 317 | return self.sync_get(params) 318 | 319 | async def async_get_urls(self, page_size: int = 20) -> list: 320 | params = self.get_params(page_size) 321 | return await self.async_get(params) 322 | 323 | def sync_get_name(self, page_size: int = 20) -> list: 324 | params = self.get_params(page_size) 325 | return self.sync_name(params) 326 | 327 | async def async_get_name(self, page_size: int = 20) -> list: 328 | params = self.get_params(page_size) 329 | return await self.async_name(params) 330 | 331 | 332 | class Good(HoyoBasicSpider): 333 | """ 334 | 获取精品帖子 335 | url: https://bbs.mihoyo.com/ys/home/56?type=good 336 | """ 337 | 338 | def __init__(self, forum_id: ForumType) -> None: 339 | super().__init__() 340 | self.api = self.base_url + "forumGoodPostFullList" 341 | self.forum_id = forum_id.value 342 | gametype = get_gids(forum_id.name) 343 | self.gids = gametype.value 344 | self.game_name = gametype.name 345 | 346 | def get_params(self, page_size: int) -> dict: 347 | return {"forum_id": self.forum_id, "gids": self.gids, "page_size": page_size} 348 | 349 | def sync_get_urls(self, page_size: int = 20) -> list: 350 | params = self.get_params(page_size) 351 | return self.sync_get(params, is_good=True) 352 | 353 | async def async_get_urls(self, page_size: int = 20) -> list: 354 | params = self.get_params(page_size) 355 | return await self.async_get(params, is_good=True) 356 | 357 | def sync_get_name(self, page_size: int = 20) -> list: 358 | params = self.get_params(page_size) 359 | return self.sync_name(params, is_good=True) 360 | 361 | async def async_get_name(self, page_size: int = 20) -> list: 362 | params = self.get_params(page_size) 363 | return await self.async_name(params, is_good=True) 364 | 365 | 366 | class Latest(HoyoBasicSpider): 367 | """ 368 | 获取最新回复或发帖 369 | url: https://bbs.mihoyo.com/ys/home/49?type=1 370 | """ 371 | 372 | def __init__(self, forum_id: ForumType, type: LatestType) -> None: 373 | super().__init__() 374 | self.api = self.base_url + "getForumPostList" 375 | self.forum_id = forum_id.value 376 | gametype = get_gids(forum_id.name) 377 | self.gids = gametype.value 378 | self.sort_type = type.value 379 | self.game_name = gametype.name 380 | 381 | def get_params(self, page_size: int) -> dict: 382 | return { 383 | "forum_id": self.forum_id, 384 | "page_size": page_size, 385 | "sort_type": self.sort_type, 386 | } 387 | 388 | def sync_get_urls(self, page_size: int = 20) -> list: 389 | params = self.get_params(page_size) 390 | return self.sync_get(params) 391 | 392 | async def async_get_urls(self, page_size: int = 20) -> list: 393 | params = self.get_params(page_size) 394 | return await self.async_get(params) 395 | 396 | def sync_get_name(self, page_size: int = 20) -> list: 397 | params = self.get_params(page_size) 398 | return self.sync_name(params) 399 | 400 | async def async_get_name(self, page_size: int = 20) -> list: 401 | params = self.get_params(page_size) 402 | return await self.async_name(params) 403 | 404 | 405 | class Search(HoyoBasicSpider): 406 | """ 407 | 搜索帖子 408 | url: https://bbs.mihoyo.com/ys/searchPost?keyword=原神 409 | """ 410 | 411 | def __init__(self, forum_id: ForumType, keyword: str) -> None: 412 | super().__init__() 413 | self.api = self.base_url + "searchPosts" 414 | gametype = get_gids(forum_id.name) 415 | self.gids = gametype.value 416 | self.game_name = gametype.name 417 | self.keyword = keyword 418 | self.forum_id = forum_id.value 419 | 420 | def get_params(self, page_size: int) -> dict: 421 | return { 422 | "gids": self.gids, 423 | "size": page_size, 424 | "keyword": self.keyword, 425 | "forum_id": self.forum_id, 426 | } 427 | 428 | def sync_get_urls(self, page_size: int = 20) -> list: 429 | params = self.get_params(page_size) 430 | return self.sync_get(params, is_good=True) 431 | 432 | async def async_get_urls(self, page_size: int = 20) -> list: 433 | params = self.get_params(page_size) 434 | return await self.async_get(params, is_good=True) 435 | 436 | def sync_get_name(self, page_size: int = 20) -> list: 437 | params = self.get_params(page_size) 438 | return self.sync_name(params, is_good=True) 439 | 440 | async def async_get_name(self, page_size: int = 20) -> list: 441 | params = self.get_params(page_size) 442 | return await self.async_name(params, is_good=True) 443 | 444 | 445 | # 实例化对象 446 | 447 | genshin_rank_daily = Rank(ForumType.GenshinCos, RankType.Daily) 448 | genshin_hot = Hot(ForumType.GenshinCos) 449 | genshin_good = Good(ForumType.GenshinCos) 450 | genshin_latest_comment = Latest(ForumType.GenshinCos, LatestType.LatestComment) 451 | 452 | honkai3rd_rank_daily = Rank(ForumType.Honkai3rdPic, RankType.Daily) 453 | honkai3rd_hot = Hot(ForumType.Honkai3rdPic) 454 | honkai3rd_good = Good(ForumType.Honkai3rdPic) 455 | honkai3rd_latest_comment = Latest(ForumType.Honkai3rdPic, LatestType.LatestComment) 456 | 457 | dby_rank_daily = Rank(ForumType.DBYPIC, RankType.Daily) 458 | dby_hot = Hot(ForumType.DBYPIC) 459 | dby_good = Good(ForumType.DBYPIC) 460 | dby_latest_comment = Latest(ForumType.DBYPIC, LatestType.LatestComment) 461 | 462 | starrail_rank_daily = Rank(ForumType.StarRailCos, RankType.Daily) 463 | starrail_hot = Hot(ForumType.StarRailCos) 464 | starrail_good = Good(ForumType.StarRailCos) 465 | starrail_latest_comment = Latest(ForumType.StarRailCos, LatestType.LatestComment) 466 | 467 | honkai2_rank_daily = Rank(ForumType.Honkai2Pic, RankType.Daily) 468 | honkai2_hot = Hot(ForumType.Honkai2Pic) 469 | honkai2_good = Good(ForumType.Honkai2Pic) 470 | honkai2_latest_comment = Latest(ForumType.Honkai2Pic, LatestType.LatestComment) 471 | 472 | dbycos_rank_daily = Rank(ForumType.DBYCOS, RankType.Daily) 473 | dbycos_hot = Hot(ForumType.DBYCOS) 474 | dbycos_good = Good(ForumType.DBYCOS) 475 | dbycos_latest_comment = Latest(ForumType.DBYCOS, LatestType.LatestComment) 476 | 477 | zzz_hot = Hot(ForumType.ZZZ) 478 | zzz_good = Good(ForumType.ZZZ) 479 | zzz_latest_comment = Latest(ForumType.ZZZ, LatestType.LatestComment) 480 | -------------------------------------------------------------------------------- /nonebot_plugin_genshin_cos/matcher.py: -------------------------------------------------------------------------------- 1 | try: 2 | import ujson as json 3 | except ModuleNotFoundError: 4 | import json 5 | 6 | import asyncio 7 | import random 8 | import re 9 | import secrets 10 | from datetime import datetime 11 | from pathlib import Path 12 | 13 | from nonebot import get_bot, get_driver 14 | from nonebot.adapters.onebot.v11 import ( 15 | ActionFailed, 16 | Bot, 17 | GroupMessageEvent, 18 | Message, 19 | MessageEvent, 20 | MessageSegment, 21 | ) 22 | from nonebot.log import logger 23 | from nonebot.matcher import Matcher 24 | from nonebot.params import ArgPlainText, CommandArg, RegexGroup 25 | from nonebot.plugin import on_command, on_regex 26 | from nonebot.rule import to_me 27 | from nonebot_plugin_apscheduler import scheduler 28 | 29 | from .hoyospider import ( 30 | ForumType, 31 | HoyoBasicSpider, 32 | Rank, 33 | RankType, 34 | Search, 35 | dbycos_good, 36 | dbycos_hot, 37 | dbycos_latest_comment, 38 | dbycos_rank_daily, 39 | genshin_hot, 40 | genshin_latest_comment, 41 | genshin_rank_daily, 42 | honkai3rd_good, 43 | honkai3rd_hot, 44 | honkai3rd_latest_comment, 45 | starrail_hot, 46 | starrail_latest_comment, 47 | zzz_good, 48 | zzz_hot, 49 | zzz_latest_comment, 50 | ) 51 | from .utils import ( 52 | DBY_NAME, 53 | GENSHIN_NAME, 54 | HONKAI3RD_NAME, 55 | IS_FORWARD, 56 | MAX, 57 | SAVE_PATH, 58 | STAR_RAIL, 59 | SUPER_PERMISSION, 60 | ZZZ_NAME, 61 | WriteError, 62 | check_cd, 63 | download_from_urls, 64 | msglist2forward, 65 | send_forward_msg, 66 | send_regular_msg, 67 | ) 68 | 69 | g_config: dict[str, dict[str, str]] = { 70 | "原神": {}, 71 | "崩坏3": {}, 72 | "大别野": {}, 73 | "星穹铁道": {}, 74 | } # 全局配置 75 | 76 | # 读取配置文件 77 | config_path = Path("config/genshincos.json") 78 | config_path.parent.mkdir(parents=True, exist_ok=True) 79 | if config_path.exists(): 80 | with Path.open(config_path, encoding="utf8") as f: 81 | g_config = json.load(f) 82 | else: 83 | with Path.open(config_path, "w", encoding="utf8") as f: 84 | json.dump(g_config, f, ensure_ascii=False, indent=4) 85 | 86 | # 事件响应器 87 | download_cos = on_command( 88 | "下载cos", 89 | aliases={"cos保存", "保存cos"}, 90 | block=False, 91 | priority=5, 92 | permission=SUPER_PERMISSION, 93 | ) 94 | hot_cos = on_command( 95 | "热门cos", aliases={"热门coser", "热门cos图"}, block=False, priority=5 96 | ) 97 | rank_cos = on_regex( 98 | r"^(日|月|周)榜cos[er]?[图]?(.+)?", priority=5, block=False, flags=re.I 99 | ) 100 | latest_cos = on_command( 101 | "最新cos", aliases={"最新coser", "最新cos图"}, block=False, priority=5 102 | ) 103 | good_cos = on_command( 104 | "精品cos", aliases={"精品coser", "精品cos图"}, block=False, priority=5 105 | ) 106 | search_cos = on_regex( 107 | r"^搜索(原神|崩坏3|星穹铁道|大别野|绝区零)cos[er]?[图]?(.+)?", 108 | block=False, 109 | priority=5, 110 | ) 111 | turn_aps = on_regex( 112 | r"^(开启|关闭)每日推送(原神|崩坏3|星穹铁道|大别野)(\s)?(.+)?", 113 | block=False, 114 | priority=5, 115 | flags=re.I, 116 | permission=SUPER_PERMISSION, 117 | ) 118 | show_aps = on_command( 119 | "查看本群推送", 120 | aliases={"查看推送", "查看订阅"}, 121 | block=False, 122 | priority=5, 123 | rule=to_me(), 124 | ) 125 | 126 | 127 | @search_cos.handle() 128 | async def _( 129 | bot: Bot, 130 | matcher: Matcher, 131 | event: MessageEvent, 132 | args: tuple[str, ...] = RegexGroup(), 133 | ): 134 | if not args[1]: 135 | await search_cos.finish("请指定搜索内容") 136 | else: 137 | groups = args[1].split() 138 | 139 | forum_type_map = { 140 | "原神": ForumType.GenshinCos, 141 | "崩坏3": ForumType.Honkai3rdPic, 142 | "大别野": ForumType.DBYCOS, 143 | "星穹铁道": ForumType.StarRailCos, 144 | "绝区零": ForumType.ZZZ, 145 | } 146 | 147 | search_class = forum_type_map.get(args[0]) 148 | if not search_class: 149 | await search_cos.finish("暂不支持该类型") 150 | 151 | search_instance = Search(search_class, groups[0]) 152 | await send_images(bot, matcher, groups, event, search_instance) 153 | 154 | 155 | async def handle_cos_type(arg: str, finish_func, send_func, type_dict: dict): 156 | if not arg: 157 | await finish_func("请指定cos类型") 158 | args = arg.split() 159 | send_type = type_dict.get(args[0]) 160 | if not send_type: 161 | await finish_func("暂不支持该类型") 162 | await send_func(args, send_type) 163 | 164 | 165 | @hot_cos.handle() 166 | async def _( 167 | bot: Bot, 168 | matcher: Matcher, 169 | event: MessageEvent, 170 | arg: Message = CommandArg(), # noqa 171 | ): 172 | type_dict = { 173 | **{name: genshin_hot for name in GENSHIN_NAME}, 174 | **{name: honkai3rd_hot for name in HONKAI3RD_NAME}, 175 | **{name: dbycos_hot for name in DBY_NAME}, 176 | **{name: starrail_hot for name in STAR_RAIL}, 177 | **{name: zzz_hot for name in ZZZ_NAME}, 178 | } 179 | await handle_cos_type( 180 | arg.extract_plain_text(), 181 | hot_cos.finish, 182 | lambda args, send_type: send_images(bot, matcher, args, event, send_type), 183 | type_dict, 184 | ) 185 | 186 | 187 | @rank_cos.handle() 188 | async def _( 189 | bot: Bot, 190 | matcher: Matcher, 191 | event: MessageEvent, 192 | group: tuple[str, ...] = RegexGroup(), 193 | ): 194 | if not group[1]: 195 | await rank_cos.finish("请指定cos类型") 196 | rank_type = { 197 | "日": RankType.Daily, 198 | "周": RankType.Weekly, 199 | "月": RankType.Monthly, 200 | }.get(group[0]) 201 | type_dict = { 202 | **{name: Rank(ForumType.GenshinCos, rank_type) for name in GENSHIN_NAME}, 203 | **{name: Rank(ForumType.DBYCOS, rank_type) for name in DBY_NAME}, 204 | } 205 | await handle_cos_type( 206 | group[1], 207 | rank_cos.finish, 208 | lambda args, send_type: send_images(bot, matcher, args, event, send_type), 209 | type_dict, 210 | ) 211 | 212 | 213 | @latest_cos.handle() 214 | async def _( 215 | bot: Bot, 216 | matcher: Matcher, 217 | event: MessageEvent, 218 | arg: Message = CommandArg(), # noqa 219 | ): 220 | type_dict = { 221 | **{name: genshin_latest_comment for name in GENSHIN_NAME}, 222 | **{name: honkai3rd_latest_comment for name in HONKAI3RD_NAME}, 223 | **{name: dbycos_latest_comment for name in DBY_NAME}, 224 | **{name: starrail_latest_comment for name in STAR_RAIL}, 225 | **{name: zzz_latest_comment for name in ZZZ_NAME}, 226 | } 227 | await handle_cos_type( 228 | arg.extract_plain_text(), 229 | latest_cos.finish, 230 | lambda args, send_type: send_images(bot, matcher, args, event, send_type), 231 | type_dict, 232 | ) 233 | 234 | 235 | @good_cos.handle() 236 | async def _( 237 | bot: Bot, 238 | matcher: Matcher, 239 | event: MessageEvent, 240 | arg: Message = CommandArg(), # noqa 241 | ): 242 | if not arg: 243 | await good_cos.finish("请指定cos类型") 244 | args = arg.extract_plain_text().split() 245 | if args[0] in GENSHIN_NAME: 246 | await good_cos.finish("原神暂不支持精品cos") 247 | elif args[0] in STAR_RAIL: 248 | await good_cos.finish("星穹铁道暂不支持精品cos") 249 | type_dict = { 250 | **{name: honkai3rd_good for name in HONKAI3RD_NAME}, 251 | **{name: dbycos_good for name in DBY_NAME}, 252 | **{name: zzz_good for name in ZZZ_NAME}, 253 | } 254 | await handle_cos_type( 255 | arg.extract_plain_text(), 256 | good_cos.finish, 257 | lambda args, send_type: send_images(bot, matcher, args, event, send_type), 258 | type_dict, 259 | ) 260 | 261 | 262 | @show_aps.handle() 263 | async def _(event: GroupMessageEvent): 264 | send_msg = "本群订阅的推送有:\n" 265 | for game_type, dict in g_config.items(): 266 | if game_type: 267 | for group_id, time in dict.items(): 268 | if str(event.group_id) == group_id: 269 | send_msg += f"{game_type}的每日{time}推送\n" 270 | await show_aps.finish(send_msg) 271 | 272 | 273 | @turn_aps.handle() 274 | async def _(event: GroupMessageEvent, args: tuple[str, ...] = RegexGroup()): 275 | if scheduler is None: 276 | await turn_aps.finish("未安装apscheduler插件,无法使用此功能") 277 | 278 | mode, game_type, time = args[0], args[1], args[3] 279 | if game_type not in GENSHIN_NAME + DBY_NAME: 280 | await turn_aps.finish("暂不支持其他类型的订阅,仅支持原神和大别野") 281 | 282 | aps_group_id = str(event.group_id) 283 | if mode == "开启": 284 | if not time: 285 | await turn_aps.finish("请指定推送时间") 286 | if aps_group_id in g_config.get(game_type, {}): 287 | await turn_aps.finish("该群已开启,无需重复开启") 288 | 289 | g_config.setdefault(game_type, {})[aps_group_id] = time 290 | try: 291 | scheduler.add_job( 292 | aps_send, 293 | trigger="cron", 294 | hour=time.split(":")[0], 295 | minute=time.split(":")[1], 296 | id=f"{game_type}{aps_group_id}", 297 | args=(aps_group_id,), 298 | ) 299 | logger.debug(f"已成功添加{aps_group_id}的{game_type}定时推送") 300 | except Exception as e: 301 | logger.error(e) 302 | else: 303 | if aps_group_id not in g_config.get(game_type, {}): 304 | await turn_aps.finish("该群已关闭,无需重复关闭") 305 | 306 | g_config[game_type].pop(aps_group_id, None) 307 | try: 308 | scheduler.remove_job(f"{game_type}{aps_group_id}") 309 | except Exception as e: 310 | logger.error(e) 311 | 312 | with Path.open(config_path, "w", encoding="utf8") as f: 313 | json.dump(g_config, f, ensure_ascii=False, indent=4) 314 | 315 | await turn_aps.finish(f"已成功{mode}{aps_group_id}的{game_type}定时推送") 316 | 317 | 318 | @download_cos.got( 319 | "game_type", prompt="你想下载哪种类型的,有原神和大别野,崩坏3,星穹铁道" 320 | ) 321 | async def got_type(game_type: str = ArgPlainText()): 322 | type_dict = { 323 | **{name: genshin_hot for name in GENSHIN_NAME}, 324 | **{name: dbycos_hot for name in DBY_NAME}, 325 | **{name: honkai3rd_hot for name in HONKAI3RD_NAME}, 326 | **{name: starrail_hot for name in STAR_RAIL}, 327 | **{name: zzz_hot for name in ZZZ_NAME}, 328 | } 329 | hot = type_dict.get(game_type) 330 | if not hot: 331 | await download_cos.finish("暂不支持该类型") 332 | image_urls = await hot.async_get_urls() 333 | if not image_urls: 334 | await download_cos.finish(f"没有找到{game_type}的cos图片") 335 | else: 336 | await download_cos.send(f"正在下载{game_type}的cos图片") 337 | try: 338 | await download_from_urls(image_urls, SAVE_PATH / f"{game_type}cos") 339 | await download_cos.finish( 340 | f"已成功保存{len(image_urls)}张{game_type}的cos图片" 341 | ) 342 | except WriteError as e: 343 | await download_cos.finish(f"保存部分{game_type}的cos图片失败,原因:{e}") 344 | 345 | 346 | ########################################################################################### 347 | 348 | 349 | # 定时任务 350 | async def aps_send(aps_goup_id: str): 351 | logger.debug("正在发送定时推送") 352 | bot: Bot = get_bot() # type:ignore 353 | for game_type, dict in g_config.items(): 354 | if not game_type: 355 | continue 356 | for saved_group_id, time in dict.items(): 357 | if not ( 358 | datetime.now().hour == int(time.split(":")[0]) 359 | and datetime.now().minute == int(time.split(":")[1]) 360 | ): 361 | continue 362 | if saved_group_id != aps_goup_id: 363 | continue 364 | try: 365 | group_id = int(saved_group_id) 366 | send_type = { 367 | **{name: genshin_rank_daily for name in GENSHIN_NAME}, 368 | **{name: dbycos_rank_daily for name in DBY_NAME}, 369 | }.get(game_type) 370 | if not send_type: 371 | continue 372 | image_list = await send_type.async_get_urls(page_size=5) 373 | name_list = await send_type.async_get_name(page_size=5) 374 | rank_text = "\n".join( 375 | [f"{i + 1}.{name}" for i, name in enumerate(name_list)] 376 | ) 377 | msg_list = [ 378 | MessageSegment.text(f"✅米游社{game_type}cos每日榜单✅"), 379 | MessageSegment.text(rank_text), 380 | ] + [MessageSegment.image(img) for img in image_list] 381 | msg_list = msglist2forward("米游社cos", "2854196306", msg_list) 382 | await bot.call_api( 383 | "send_group_forward_msg", group_id=group_id, messages=msg_list 384 | ) 385 | await asyncio.sleep(1) 386 | except Exception as e: 387 | logger.error(e) 388 | 389 | 390 | g_user_data = {} # 用户cd数据 391 | 392 | 393 | async def send_images( 394 | bot: Bot, 395 | matcher: Matcher, 396 | args: list, 397 | event: MessageEvent, 398 | send_type: HoyoBasicSpider, 399 | ): 400 | """ 401 | 发送图片 402 | 403 | params: 404 | bot: 当前bot 405 | matcher: 事件响应器 406 | args: 命令参数(0:类型 1:数量) 407 | event: 消息事件类型 408 | send_type: 爬虫类型 409 | """ 410 | global g_user_data 411 | out_cd, deletime, g_user_data = check_cd(event.user_id, g_user_data) 412 | if not out_cd: 413 | await matcher.finish(f"cd冷却中,还剩{deletime}秒", at_sender=True) 414 | return 415 | 416 | num_images = min(int(re.sub(r"[x|*|X]", "", args[1])) if len(args) > 1 else 1, MAX) 417 | 418 | await matcher.send( 419 | f"获取{num_images}张图片中…请稍等" if num_images > 1 else "获取图片中…请稍等" 420 | ) 421 | 422 | try: 423 | image_list = await send_type.async_get_urls() 424 | if num_images > len(image_list): 425 | await matcher.finish(f"最多只能获取{len(image_list)}张图片", at_sender=True) 426 | return 427 | 428 | selected_images = ( 429 | random.sample(image_list, num_images) 430 | if num_images > 1 431 | else [secrets.choice(image_list)] 432 | ) 433 | msg_list = ( 434 | [MessageSegment.text(f"✅找到最新的一些{args[0]}图如下:✅")] 435 | if num_images > 1 436 | else [] 437 | ) 438 | 439 | for img in selected_images: 440 | msg_list.append(MessageSegment.image(img)) # noqa 441 | 442 | if IS_FORWARD: 443 | await send_forward_msg(bot, event, "米游社cos", bot.self_id, msg_list) 444 | else: 445 | await send_regular_msg(matcher, msg_list) 446 | except ActionFailed: 447 | await matcher.finish("账户风控了,发送不了图片", at_sender=True) 448 | 449 | 450 | g_driver = get_driver() # 全局driver 451 | 452 | 453 | @g_driver.on_startup 454 | async def start_aps(): 455 | try: 456 | if not scheduler: 457 | logger.error("未安装apscheduler插件,无法使用此功能") 458 | with Path.open(config_path, encoding="utf8") as f: 459 | g_config: dict[str, dict[str, str]] = json.load(f) 460 | for game_type, _dict in g_config.items(): 461 | if game_type == "": 462 | continue 463 | for aps_group_id, time in _dict.items(): 464 | if time == "": 465 | continue 466 | try: 467 | if scheduler: 468 | scheduler.add_job( 469 | aps_send, 470 | trigger="cron", 471 | hour=time.split(":")[0], 472 | minute=time.split(":")[1], 473 | id=f"{game_type}{aps_group_id}", 474 | args=(aps_group_id,), 475 | ) 476 | else: 477 | logger.error("未安装apscheduler插件,无法使用此功能") 478 | return 479 | logger.debug(f"已成功添加{aps_group_id}的{game_type}定时推送") 480 | except Exception as e: 481 | logger.error(e) 482 | continue 483 | except Exception as e: 484 | logger.error(e) 485 | -------------------------------------------------------------------------------- /nonebot_plugin_genshin_cos/utils.py: -------------------------------------------------------------------------------- 1 | from asyncio import sleep 2 | from datetime import datetime, timedelta 3 | from pathlib import Path 4 | 5 | import httpx 6 | from httpx import TimeoutException 7 | from nonebot.adapters.onebot.v11 import ( 8 | GROUP_ADMIN, 9 | GROUP_OWNER, 10 | Bot, 11 | GroupMessageEvent, 12 | Message, 13 | MessageEvent, 14 | ) 15 | from nonebot.exception import ActionFailed 16 | from nonebot.log import logger 17 | from nonebot.matcher import Matcher 18 | from nonebot.permission import SUPERUSER 19 | 20 | from .config import config 21 | 22 | ####################################################### 23 | 24 | # 拓展的异常类和函数 25 | SUPER_PERMISSION = GROUP_ADMIN | GROUP_OWNER | SUPERUSER 26 | GENSHIN_NAME = ["原神", "OP", "op", "欧泡", "⭕", "🅾️", "🅾️P", "🅾️p", "原", "圆", "原"] 27 | HONKAI3RD_NAME = [ 28 | "崩坏3", 29 | "崩崩崩", 30 | "蹦蹦蹦", 31 | "崩坏三", 32 | "崩三", 33 | "崩崩崩三", 34 | "崩坏3rd", 35 | "崩坏3Rd", 36 | "崩坏3RD", 37 | "崩坏3rd", 38 | "崩坏3RD", 39 | "崩坏3Rd", 40 | ] 41 | DBY_NAME = ["大别野", "DBY", "dby"] 42 | STAR_RAIL = ["星穹铁道", "星穹", "崩铁", "铁道", "星铁", "穹p", "穹铁"] 43 | ZZZ_NAME = ["绝区零", "绝零区", "绝零", "0", "零", "绝区", "0区"] 44 | 45 | 46 | class WriteError(Exception): 47 | """写入错误""" 48 | 49 | 50 | # 加载配置 51 | 52 | MAX = config.cos_max 53 | SAVE_PATH = Path(config.cos_path) 54 | CD = config.cos_cd 55 | DELAY = config.cos_delay 56 | IS_FORWARD = config.cos_forward_msg 57 | 58 | 59 | def check_cd(user_id: int, user_data: dict[str, datetime]) -> tuple[bool, int, dict]: 60 | """检查用户触发事件的cd 61 | 62 | Args: 63 | user_id (int): 用户的id 64 | user_data (dict): 用户数据 65 | 66 | Returns: 67 | Tuple[bool,int,dict]: 返回一个元组,第一个元素为True表示可以触发,为False表示不可以触发,第二个元素为剩余时间,第三个元素为用户数据 68 | """ 69 | data = user_data 70 | if str(user_id) not in data: 71 | data[str(user_id)] = datetime.now() 72 | if datetime.now() < data[f"{user_id}"]: 73 | delta = (data[str(user_id)] - datetime.now()).seconds 74 | return False, delta, data 75 | data[str(user_id)] = datetime.now() + timedelta(seconds=CD) 76 | return True, 0, data 77 | 78 | 79 | async def download_from_urls(urls: list[str], path: Path): 80 | """ 81 | 下载图片 82 | :param urls: 图片链接 83 | :param path: 保存路径 84 | :return: None 85 | """ 86 | is_download_error = False 87 | error_cnt = 0 88 | success_cnt = 0 89 | if not path.exists(): 90 | path.mkdir(parents=True) 91 | if not path.is_dir(): 92 | raise WriteError("路径不是文件夹") 93 | async with httpx.AsyncClient() as client: 94 | for url in urls: 95 | try: 96 | filename = url.split("/")[-1] 97 | new_path = path / filename 98 | rsp = await client.get(url) 99 | content = rsp.content 100 | with Path.open(new_path, "wb") as f: 101 | f.write(content) 102 | except ( 103 | httpx.ConnectError, 104 | httpx.RequestError, 105 | httpx.ReadTimeout, 106 | TimeoutException, 107 | ): 108 | is_download_error = True 109 | error_cnt += 1 110 | continue 111 | if is_download_error: 112 | raise WriteError(f"有{error_cnt}张图片由于超时下载失败了") 113 | success_cnt += 1 114 | logger.success(f"下载{success_cnt}张成功") 115 | 116 | 117 | async def send_forward_msg( 118 | bot: Bot, 119 | event: MessageEvent, 120 | name: str, 121 | uin: str, 122 | msgs: list, 123 | ) -> dict: 124 | """调用合并转发API 125 | 126 | params: 127 | bot: Bot, 128 | event: 消息事件类型, 129 | name: 发送者昵称, 130 | uin: 发送者账号, 131 | msgs: 消息列表, 132 | """ 133 | 134 | def to_json(msg: Message): 135 | return {"type": "node", "data": {"name": name, "uin": uin, "content": msg}} 136 | 137 | messages = [to_json(msg) for msg in msgs] 138 | if isinstance(event, GroupMessageEvent): 139 | return await bot.call_api( 140 | "send_group_forward_msg", group_id=event.group_id, messages=messages 141 | ) 142 | return await bot.call_api( 143 | "send_private_forward_msg", user_id=event.user_id, messages=messages 144 | ) 145 | 146 | 147 | def msglist2forward(name: str, uin: str, msgs: list) -> list: 148 | """调用合并转发群API 149 | 150 | params: 151 | bot: Bot 152 | name: 发送者昵称 153 | uin: 发送者账号 154 | msgs: 消息列表 155 | """ 156 | 157 | def to_json(msg: Message): 158 | return {"type": "node", "data": {"name": name, "uin": uin, "content": msg}} 159 | 160 | return [to_json(msg) for msg in msgs] 161 | 162 | 163 | async def send_regular_msg(matcher: Matcher, messages: list): 164 | """ 165 | 发送常规消息 166 | :param matcher: Matcher 167 | :param messages: 消息列表 168 | """ 169 | MAX_RETRIES = 2 170 | cnt = 1 171 | try: 172 | for msg in messages: 173 | cnt += 1 174 | await matcher.send(msg) 175 | await sleep(DELAY) 176 | except ActionFailed: 177 | if cnt <= MAX_RETRIES: 178 | await matcher.send("消息可能风控,请尝试更改为合并转发模式") 179 | -------------------------------------------------------------------------------- /pdm.lock: -------------------------------------------------------------------------------- 1 | # This file is @generated by PDM. 2 | # It is not intended for manual editing. 3 | 4 | [metadata] 5 | groups = ["default", "dev"] 6 | strategy = ["inherit_metadata"] 7 | lock_version = "4.5.0" 8 | content_hash = "sha256:92b62ef85c80eef1bcf44459bc624496c0a3defa2e5f24c79cf686419a9101dd" 9 | 10 | [[metadata.targets]] 11 | requires_python = "~=3.9" 12 | 13 | [[package]] 14 | name = "aiofiles" 15 | version = "24.1.0" 16 | requires_python = ">=3.8" 17 | summary = "File support for asyncio." 18 | groups = ["default"] 19 | files = [ 20 | {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, 21 | {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, 22 | ] 23 | 24 | [[package]] 25 | name = "annotated-types" 26 | version = "0.7.0" 27 | requires_python = ">=3.8" 28 | summary = "Reusable constraint types to use with typing.Annotated" 29 | groups = ["default"] 30 | dependencies = [ 31 | "typing-extensions>=4.0.0; python_version < \"3.9\"", 32 | ] 33 | files = [ 34 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 35 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 36 | ] 37 | 38 | [[package]] 39 | name = "anyio" 40 | version = "4.6.2.post1" 41 | requires_python = ">=3.9" 42 | summary = "High level compatibility layer for multiple asynchronous event loop implementations" 43 | groups = ["default"] 44 | dependencies = [ 45 | "exceptiongroup>=1.0.2; python_version < \"3.11\"", 46 | "idna>=2.8", 47 | "sniffio>=1.1", 48 | "typing-extensions>=4.1; python_version < \"3.11\"", 49 | ] 50 | files = [ 51 | {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, 52 | {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, 53 | ] 54 | 55 | [[package]] 56 | name = "apscheduler" 57 | version = "3.10.4" 58 | requires_python = ">=3.6" 59 | summary = "In-process task scheduler with Cron-like capabilities" 60 | groups = ["default"] 61 | dependencies = [ 62 | "importlib-metadata>=3.6.0; python_version < \"3.8\"", 63 | "pytz", 64 | "six>=1.4.0", 65 | "tzlocal!=3.*,>=2.0", 66 | ] 67 | files = [ 68 | {file = "APScheduler-3.10.4-py3-none-any.whl", hash = "sha256:fb91e8a768632a4756a585f79ec834e0e27aad5860bac7eaa523d9ccefd87661"}, 69 | {file = "APScheduler-3.10.4.tar.gz", hash = "sha256:e6df071b27d9be898e486bc7940a7be50b4af2e9da7c08f0744a96d4bd4cef4a"}, 70 | ] 71 | 72 | [[package]] 73 | name = "certifi" 74 | version = "2024.8.30" 75 | requires_python = ">=3.6" 76 | summary = "Python package for providing Mozilla's CA Bundle." 77 | groups = ["default"] 78 | files = [ 79 | {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, 80 | {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, 81 | ] 82 | 83 | [[package]] 84 | name = "cfgv" 85 | version = "3.4.0" 86 | requires_python = ">=3.8" 87 | summary = "Validate configuration and produce human readable error messages." 88 | groups = ["dev"] 89 | files = [ 90 | {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, 91 | {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, 92 | ] 93 | 94 | [[package]] 95 | name = "colorama" 96 | version = "0.4.6" 97 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 98 | summary = "Cross-platform colored terminal text." 99 | groups = ["default"] 100 | marker = "sys_platform == \"win32\"" 101 | files = [ 102 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 103 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 104 | ] 105 | 106 | [[package]] 107 | name = "distlib" 108 | version = "0.3.9" 109 | summary = "Distribution utilities" 110 | groups = ["dev"] 111 | files = [ 112 | {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, 113 | {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, 114 | ] 115 | 116 | [[package]] 117 | name = "exceptiongroup" 118 | version = "1.2.2" 119 | requires_python = ">=3.7" 120 | summary = "Backport of PEP 654 (exception groups)" 121 | groups = ["default"] 122 | marker = "python_version < \"3.11\"" 123 | files = [ 124 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, 125 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, 126 | ] 127 | 128 | [[package]] 129 | name = "filelock" 130 | version = "3.16.1" 131 | requires_python = ">=3.8" 132 | summary = "A platform independent file lock." 133 | groups = ["dev"] 134 | files = [ 135 | {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, 136 | {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, 137 | ] 138 | 139 | [[package]] 140 | name = "h11" 141 | version = "0.14.0" 142 | requires_python = ">=3.7" 143 | summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 144 | groups = ["default"] 145 | dependencies = [ 146 | "typing-extensions; python_version < \"3.8\"", 147 | ] 148 | files = [ 149 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 150 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 151 | ] 152 | 153 | [[package]] 154 | name = "httpcore" 155 | version = "1.0.6" 156 | requires_python = ">=3.8" 157 | summary = "A minimal low-level HTTP client." 158 | groups = ["default"] 159 | dependencies = [ 160 | "certifi", 161 | "h11<0.15,>=0.13", 162 | ] 163 | files = [ 164 | {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, 165 | {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, 166 | ] 167 | 168 | [[package]] 169 | name = "httpx" 170 | version = "0.27.2" 171 | requires_python = ">=3.8" 172 | summary = "The next generation HTTP client." 173 | groups = ["default"] 174 | dependencies = [ 175 | "anyio", 176 | "certifi", 177 | "httpcore==1.*", 178 | "idna", 179 | "sniffio", 180 | ] 181 | files = [ 182 | {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, 183 | {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, 184 | ] 185 | 186 | [[package]] 187 | name = "identify" 188 | version = "2.6.3" 189 | requires_python = ">=3.9" 190 | summary = "File identification library for Python" 191 | groups = ["dev"] 192 | files = [ 193 | {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, 194 | {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, 195 | ] 196 | 197 | [[package]] 198 | name = "idna" 199 | version = "3.10" 200 | requires_python = ">=3.6" 201 | summary = "Internationalized Domain Names in Applications (IDNA)" 202 | groups = ["default"] 203 | files = [ 204 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 205 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 206 | ] 207 | 208 | [[package]] 209 | name = "loguru" 210 | version = "0.7.2" 211 | requires_python = ">=3.5" 212 | summary = "Python logging made (stupidly) simple" 213 | groups = ["default"] 214 | dependencies = [ 215 | "aiocontextvars>=0.2.0; python_version < \"3.7\"", 216 | "colorama>=0.3.4; sys_platform == \"win32\"", 217 | "win32-setctime>=1.0.0; sys_platform == \"win32\"", 218 | ] 219 | files = [ 220 | {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, 221 | {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, 222 | ] 223 | 224 | [[package]] 225 | name = "msgpack" 226 | version = "1.1.0" 227 | requires_python = ">=3.8" 228 | summary = "MessagePack serializer" 229 | groups = ["default"] 230 | files = [ 231 | {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, 232 | {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, 233 | {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, 234 | {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, 235 | {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, 236 | {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, 237 | {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, 238 | {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, 239 | {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, 240 | {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, 241 | {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, 242 | {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, 243 | {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, 244 | {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, 245 | {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, 246 | {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, 247 | {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, 248 | {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, 249 | {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, 250 | {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, 251 | {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, 252 | {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, 253 | {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, 254 | {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, 255 | {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, 256 | {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, 257 | {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, 258 | {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, 259 | {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, 260 | {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, 261 | {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, 262 | {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, 263 | {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, 264 | {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, 265 | {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, 266 | {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, 267 | {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, 268 | {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, 269 | {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, 270 | {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, 271 | {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, 272 | {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, 273 | {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, 274 | {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, 275 | {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, 276 | {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, 277 | {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, 278 | {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, 279 | {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, 280 | {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, 281 | {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, 282 | {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, 283 | {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, 284 | {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, 285 | {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, 286 | {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, 287 | ] 288 | 289 | [[package]] 290 | name = "multidict" 291 | version = "6.1.0" 292 | requires_python = ">=3.8" 293 | summary = "multidict implementation" 294 | groups = ["default"] 295 | dependencies = [ 296 | "typing-extensions>=4.1.0; python_version < \"3.11\"", 297 | ] 298 | files = [ 299 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, 300 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, 301 | {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, 302 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, 303 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, 304 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, 305 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, 306 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, 307 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, 308 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, 309 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, 310 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, 311 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, 312 | {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, 313 | {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, 314 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, 315 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, 316 | {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, 317 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, 318 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, 319 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, 320 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, 321 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, 322 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, 323 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, 324 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, 325 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, 326 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, 327 | {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, 328 | {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, 329 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, 330 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, 331 | {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, 332 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, 333 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, 334 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, 335 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, 336 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, 337 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, 338 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, 339 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, 340 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, 341 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, 342 | {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, 343 | {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, 344 | {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, 345 | {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, 346 | {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, 347 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, 348 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, 349 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, 350 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, 351 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, 352 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, 353 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, 354 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, 355 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, 356 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, 357 | {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, 358 | {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, 359 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, 360 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, 361 | {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, 362 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, 363 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, 364 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, 365 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, 366 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, 367 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, 368 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, 369 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, 370 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, 371 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, 372 | {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, 373 | {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, 374 | {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, 375 | {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, 376 | ] 377 | 378 | [[package]] 379 | name = "nodeenv" 380 | version = "1.9.1" 381 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 382 | summary = "Node.js virtual environment builder" 383 | groups = ["dev"] 384 | files = [ 385 | {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, 386 | {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, 387 | ] 388 | 389 | [[package]] 390 | name = "nonebot-adapter-onebot" 391 | version = "2.4.6" 392 | requires_python = "<4.0,>=3.9" 393 | summary = "OneBot(CQHTTP) adapter for nonebot2" 394 | groups = ["default"] 395 | dependencies = [ 396 | "msgpack<2.0.0,>=1.0.3", 397 | "nonebot2<3.0.0,>=2.2.0", 398 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 399 | "typing-extensions<5.0.0,>=4.0.0", 400 | ] 401 | files = [ 402 | {file = "nonebot_adapter_onebot-2.4.6-py3-none-any.whl", hash = "sha256:b1ec7023fd83d731f63b513217327a57d12893a261944934b9195f79173791ad"}, 403 | {file = "nonebot_adapter_onebot-2.4.6.tar.gz", hash = "sha256:e33c93649ad11b320d8e9ff213635f29b23b4d0413c9158bd031c513c2f8f701"}, 404 | ] 405 | 406 | [[package]] 407 | name = "nonebot-plugin-apscheduler" 408 | version = "0.5.0" 409 | requires_python = "<4.0,>=3.9" 410 | summary = "APScheduler Support for NoneBot2" 411 | groups = ["default"] 412 | dependencies = [ 413 | "apscheduler<4.0.0,>=3.7.0", 414 | "nonebot2<3.0.0,>=2.2.0", 415 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 416 | ] 417 | files = [ 418 | {file = "nonebot_plugin_apscheduler-0.5.0-py3-none-any.whl", hash = "sha256:8b99b5ee60c4bc195d4df2fd27dab3d6963691e3332f6cee31a06eb4277c307f"}, 419 | {file = "nonebot_plugin_apscheduler-0.5.0.tar.gz", hash = "sha256:6c0230e99765f275dc83d6639ff33bd6f71203fa10cd1b8a204b0f95530cda86"}, 420 | ] 421 | 422 | [[package]] 423 | name = "nonebot2" 424 | version = "2.2.1" 425 | requires_python = ">=3.8,<4.0" 426 | summary = "An asynchronous python bot framework." 427 | groups = ["default"] 428 | dependencies = [ 429 | "loguru<1.0.0,>=0.6.0", 430 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 431 | "pygtrie<3.0.0,>=2.4.1", 432 | "python-dotenv<2.0.0,>=0.21.0", 433 | "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"", 434 | "typing-extensions<5.0.0,>=4.4.0", 435 | "yarl<2.0.0,>=1.7.2", 436 | ] 437 | files = [ 438 | {file = "nonebot2-2.2.1-py3-none-any.whl", hash = "sha256:88f2bb456bf90922925bbe489a9effe3b09300f3aa50bfa75ee50d8a83d7330f"}, 439 | {file = "nonebot2-2.2.1.tar.gz", hash = "sha256:fe57692300571b00724999238545d8d894523460e6835a11b326a2e1cdf98fc4"}, 440 | ] 441 | 442 | [[package]] 443 | name = "pathlib" 444 | version = "1.0.1" 445 | summary = "Object-oriented filesystem paths" 446 | groups = ["default"] 447 | files = [ 448 | {file = "pathlib-1.0.1-py3-none-any.whl", hash = "sha256:f35f95ab8b0f59e6d354090350b44a80a80635d22efdedfa84c7ad1cf0a74147"}, 449 | {file = "pathlib-1.0.1.tar.gz", hash = "sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f"}, 450 | ] 451 | 452 | [[package]] 453 | name = "platformdirs" 454 | version = "4.3.6" 455 | requires_python = ">=3.8" 456 | summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." 457 | groups = ["dev"] 458 | files = [ 459 | {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, 460 | {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, 461 | ] 462 | 463 | [[package]] 464 | name = "pre-commit" 465 | version = "4.0.1" 466 | requires_python = ">=3.9" 467 | summary = "A framework for managing and maintaining multi-language pre-commit hooks." 468 | groups = ["dev"] 469 | dependencies = [ 470 | "cfgv>=2.0.0", 471 | "identify>=1.0.0", 472 | "nodeenv>=0.11.1", 473 | "pyyaml>=5.1", 474 | "virtualenv>=20.10.0", 475 | ] 476 | files = [ 477 | {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, 478 | {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, 479 | ] 480 | 481 | [[package]] 482 | name = "propcache" 483 | version = "0.2.0" 484 | requires_python = ">=3.8" 485 | summary = "Accelerated property cache" 486 | groups = ["default"] 487 | files = [ 488 | {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, 489 | {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, 490 | {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, 491 | {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, 492 | {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, 493 | {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, 494 | {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, 495 | {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, 496 | {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, 497 | {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, 498 | {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, 499 | {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, 500 | {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, 501 | {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, 502 | {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, 503 | {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, 504 | {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, 505 | {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, 506 | {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, 507 | {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, 508 | {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, 509 | {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, 510 | {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, 511 | {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, 512 | {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, 513 | {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, 514 | {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, 515 | {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, 516 | {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, 517 | {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, 518 | {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, 519 | {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, 520 | {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, 521 | {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, 522 | {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, 523 | {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, 524 | {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, 525 | {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, 526 | {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, 527 | {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, 528 | {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, 529 | {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, 530 | {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, 531 | {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, 532 | {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, 533 | {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, 534 | {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, 535 | {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, 536 | {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, 537 | {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, 538 | {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, 539 | {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, 540 | {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, 541 | {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, 542 | {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, 543 | {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, 544 | {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, 545 | {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, 546 | {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, 547 | {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, 548 | {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, 549 | {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, 550 | {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, 551 | {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, 552 | {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, 553 | {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, 554 | {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, 555 | {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, 556 | {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, 557 | {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, 558 | {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, 559 | {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, 560 | {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, 561 | {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, 562 | {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, 563 | {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, 564 | {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, 565 | {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, 566 | {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, 567 | {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, 568 | {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, 569 | {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, 570 | ] 571 | 572 | [[package]] 573 | name = "pydantic" 574 | version = "2.9.2" 575 | requires_python = ">=3.8" 576 | summary = "Data validation using Python type hints" 577 | groups = ["default"] 578 | dependencies = [ 579 | "annotated-types>=0.6.0", 580 | "pydantic-core==2.23.4", 581 | "typing-extensions>=4.12.2; python_version >= \"3.13\"", 582 | "typing-extensions>=4.6.1; python_version < \"3.13\"", 583 | ] 584 | files = [ 585 | {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, 586 | {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, 587 | ] 588 | 589 | [[package]] 590 | name = "pydantic-core" 591 | version = "2.23.4" 592 | requires_python = ">=3.8" 593 | summary = "Core functionality for Pydantic validation and serialization" 594 | groups = ["default"] 595 | dependencies = [ 596 | "typing-extensions!=4.7.0,>=4.6.0", 597 | ] 598 | files = [ 599 | {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, 600 | {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, 601 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, 602 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, 603 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, 604 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, 605 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, 606 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, 607 | {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, 608 | {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, 609 | {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, 610 | {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, 611 | {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, 612 | {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, 613 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, 614 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, 615 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, 616 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, 617 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, 618 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, 619 | {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, 620 | {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, 621 | {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, 622 | {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, 623 | {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, 624 | {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, 625 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, 626 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, 627 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, 628 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, 629 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, 630 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, 631 | {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, 632 | {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, 633 | {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, 634 | {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, 635 | {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, 636 | {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, 637 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, 638 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, 639 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, 640 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, 641 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, 642 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, 643 | {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, 644 | {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, 645 | {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, 646 | {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, 647 | {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, 648 | {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, 649 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, 650 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, 651 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, 652 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, 653 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, 654 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, 655 | {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, 656 | {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, 657 | {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, 658 | {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, 659 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, 660 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, 661 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, 662 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, 663 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, 664 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, 665 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, 666 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, 667 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, 668 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, 669 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, 670 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, 671 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, 672 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, 673 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, 674 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, 675 | {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, 676 | ] 677 | 678 | [[package]] 679 | name = "pygtrie" 680 | version = "2.5.0" 681 | summary = "A pure Python trie data structure implementation." 682 | groups = ["default"] 683 | files = [ 684 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, 685 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, 686 | ] 687 | 688 | [[package]] 689 | name = "python-dotenv" 690 | version = "1.0.1" 691 | requires_python = ">=3.8" 692 | summary = "Read key-value pairs from a .env file and set them as environment variables" 693 | groups = ["default"] 694 | files = [ 695 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 696 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 697 | ] 698 | 699 | [[package]] 700 | name = "pytz" 701 | version = "2024.2" 702 | summary = "World timezone definitions, modern and historical" 703 | groups = ["default"] 704 | files = [ 705 | {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, 706 | {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, 707 | ] 708 | 709 | [[package]] 710 | name = "pyyaml" 711 | version = "6.0.2" 712 | requires_python = ">=3.8" 713 | summary = "YAML parser and emitter for Python" 714 | groups = ["dev"] 715 | files = [ 716 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, 717 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, 718 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, 719 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, 720 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, 721 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, 722 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, 723 | {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, 724 | {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, 725 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, 726 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, 727 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, 728 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, 729 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, 730 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, 731 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, 732 | {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, 733 | {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, 734 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, 735 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, 736 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, 737 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, 738 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, 739 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, 740 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, 741 | {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, 742 | {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, 743 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, 744 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, 745 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, 746 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, 747 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, 748 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, 749 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, 750 | {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, 751 | {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, 752 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, 753 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, 754 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, 755 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, 756 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, 757 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, 758 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, 759 | {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, 760 | {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, 761 | {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, 762 | ] 763 | 764 | [[package]] 765 | name = "six" 766 | version = "1.16.0" 767 | requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 768 | summary = "Python 2 and 3 compatibility utilities" 769 | groups = ["default"] 770 | files = [ 771 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 772 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 773 | ] 774 | 775 | [[package]] 776 | name = "sniffio" 777 | version = "1.3.1" 778 | requires_python = ">=3.7" 779 | summary = "Sniff out which async library your code is running under" 780 | groups = ["default"] 781 | files = [ 782 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 783 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 784 | ] 785 | 786 | [[package]] 787 | name = "tomli" 788 | version = "2.1.0" 789 | requires_python = ">=3.8" 790 | summary = "A lil' TOML parser" 791 | groups = ["default"] 792 | marker = "python_version < \"3.11\"" 793 | files = [ 794 | {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, 795 | {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, 796 | ] 797 | 798 | [[package]] 799 | name = "typing-extensions" 800 | version = "4.12.2" 801 | requires_python = ">=3.8" 802 | summary = "Backported and Experimental Type Hints for Python 3.8+" 803 | groups = ["default"] 804 | files = [ 805 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 806 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 807 | ] 808 | 809 | [[package]] 810 | name = "tzdata" 811 | version = "2024.2" 812 | requires_python = ">=2" 813 | summary = "Provider of IANA time zone data" 814 | groups = ["default"] 815 | marker = "platform_system == \"Windows\"" 816 | files = [ 817 | {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, 818 | {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, 819 | ] 820 | 821 | [[package]] 822 | name = "tzlocal" 823 | version = "5.2" 824 | requires_python = ">=3.8" 825 | summary = "tzinfo object for the local timezone" 826 | groups = ["default"] 827 | dependencies = [ 828 | "backports-zoneinfo; python_version < \"3.9\"", 829 | "tzdata; platform_system == \"Windows\"", 830 | ] 831 | files = [ 832 | {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, 833 | {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, 834 | ] 835 | 836 | [[package]] 837 | name = "ujson" 838 | version = "5.10.0" 839 | requires_python = ">=3.8" 840 | summary = "Ultra fast JSON encoder and decoder for Python" 841 | groups = ["default"] 842 | files = [ 843 | {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, 844 | {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, 845 | {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, 846 | {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, 847 | {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, 848 | {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, 849 | {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, 850 | {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, 851 | {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, 852 | {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, 853 | {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, 854 | {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, 855 | {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, 856 | {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, 857 | {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, 858 | {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, 859 | {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, 860 | {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, 861 | {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, 862 | {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, 863 | {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, 864 | {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, 865 | {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, 866 | {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, 867 | {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, 868 | {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, 869 | {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, 870 | {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, 871 | {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, 872 | {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, 873 | {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, 874 | {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, 875 | {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, 876 | {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, 877 | {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, 878 | {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, 879 | {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, 880 | {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, 881 | {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, 882 | {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, 883 | {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, 884 | {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, 885 | {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, 886 | {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, 887 | {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, 888 | {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, 889 | {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, 890 | {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, 891 | {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, 892 | {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, 893 | {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, 894 | {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, 895 | {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, 896 | {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, 897 | {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, 898 | {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, 899 | {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, 900 | {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, 901 | {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, 902 | {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, 903 | {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, 904 | {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, 905 | {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, 906 | ] 907 | 908 | [[package]] 909 | name = "virtualenv" 910 | version = "20.28.0" 911 | requires_python = ">=3.8" 912 | summary = "Virtual Python Environment builder" 913 | groups = ["dev"] 914 | dependencies = [ 915 | "distlib<1,>=0.3.7", 916 | "filelock<4,>=3.12.2", 917 | "importlib-metadata>=6.6; python_version < \"3.8\"", 918 | "platformdirs<5,>=3.9.1", 919 | ] 920 | files = [ 921 | {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, 922 | {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, 923 | ] 924 | 925 | [[package]] 926 | name = "win32-setctime" 927 | version = "1.1.0" 928 | requires_python = ">=3.5" 929 | summary = "A small Python utility to set file creation time on Windows" 930 | groups = ["default"] 931 | marker = "sys_platform == \"win32\"" 932 | files = [ 933 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 934 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 935 | ] 936 | 937 | [[package]] 938 | name = "yarl" 939 | version = "1.17.1" 940 | requires_python = ">=3.9" 941 | summary = "Yet another URL library" 942 | groups = ["default"] 943 | dependencies = [ 944 | "idna>=2.0", 945 | "multidict>=4.0", 946 | "propcache>=0.2.0", 947 | ] 948 | files = [ 949 | {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91"}, 950 | {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da"}, 951 | {file = "yarl-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec"}, 952 | {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21"}, 953 | {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948"}, 954 | {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04"}, 955 | {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3"}, 956 | {file = "yarl-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d"}, 957 | {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba"}, 958 | {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17"}, 959 | {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5"}, 960 | {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822"}, 961 | {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f"}, 962 | {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931"}, 963 | {file = "yarl-1.17.1-cp310-cp310-win32.whl", hash = "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b"}, 964 | {file = "yarl-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243"}, 965 | {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217"}, 966 | {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988"}, 967 | {file = "yarl-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75"}, 968 | {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca"}, 969 | {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74"}, 970 | {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f"}, 971 | {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d"}, 972 | {file = "yarl-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11"}, 973 | {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0"}, 974 | {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3"}, 975 | {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe"}, 976 | {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860"}, 977 | {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4"}, 978 | {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4"}, 979 | {file = "yarl-1.17.1-cp311-cp311-win32.whl", hash = "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7"}, 980 | {file = "yarl-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3"}, 981 | {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61"}, 982 | {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d"}, 983 | {file = "yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139"}, 984 | {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5"}, 985 | {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac"}, 986 | {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463"}, 987 | {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147"}, 988 | {file = "yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7"}, 989 | {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685"}, 990 | {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172"}, 991 | {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7"}, 992 | {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da"}, 993 | {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c"}, 994 | {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199"}, 995 | {file = "yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96"}, 996 | {file = "yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df"}, 997 | {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488"}, 998 | {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374"}, 999 | {file = "yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac"}, 1000 | {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170"}, 1001 | {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8"}, 1002 | {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938"}, 1003 | {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e"}, 1004 | {file = "yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556"}, 1005 | {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67"}, 1006 | {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8"}, 1007 | {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3"}, 1008 | {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0"}, 1009 | {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299"}, 1010 | {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258"}, 1011 | {file = "yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2"}, 1012 | {file = "yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda"}, 1013 | {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6"}, 1014 | {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159"}, 1015 | {file = "yarl-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95"}, 1016 | {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004"}, 1017 | {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383"}, 1018 | {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e"}, 1019 | {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934"}, 1020 | {file = "yarl-1.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c"}, 1021 | {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29"}, 1022 | {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71"}, 1023 | {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55"}, 1024 | {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857"}, 1025 | {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5"}, 1026 | {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f"}, 1027 | {file = "yarl-1.17.1-cp39-cp39-win32.whl", hash = "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473"}, 1028 | {file = "yarl-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138"}, 1029 | {file = "yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06"}, 1030 | {file = "yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47"}, 1031 | ] 1032 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.pdm] 2 | distribution = true 3 | 4 | [tool.pdm.build] 5 | includes = [ 6 | "nonebot_plugin_genshin_cos", 7 | ] 8 | [build-system] 9 | requires = ["pdm-backend"] 10 | build-backend = "pdm.backend" 11 | 12 | [project] 13 | name = "nonebot-plugin-genshin-cos" 14 | version = "0.3.5" 15 | description = "米游社原神cos图获取" 16 | authors = [ 17 | {name = "Cvandia",email = "106718176+Cvandia@users.noreply.github.com"}, 18 | ] 19 | dependencies = [ 20 | "nonebot-plugin-apscheduler>=0.1.3", 21 | "nonebot-adapter-onebot>=2.2.0", 22 | "nonebot2>=2.2.0", 23 | "httpx>=0.19.0", 24 | "aiofiles>=0.7.0", 25 | "pathlib>=1.0.1", 26 | "ujson>=5.5.0", 27 | ] 28 | requires-python = "<4,>=3.9" 29 | readme = "README.md" 30 | license = {text = "MIT"} 31 | 32 | [dependency-groups] 33 | dev = ["pre-commit>=4.0.1"] 34 | -------------------------------------------------------------------------------- /res/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cvandia/nonebot-plugin-genshin-cos/98ea56a2242dba57e86ba412f2999c54636b0fd1/res/ico.png -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cvandia/nonebot-plugin-genshin-cos/98ea56a2242dba57e86ba412f2999c54636b0fd1/tests/__init__.py --------------------------------------------------------------------------------