├── .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 |

4 |
5 |
6 |
7 |
8 |
9 | # nonebot-plugin-genshin-cos
10 |
11 | _⭐基于Nonebot2的一款获取米游社cos的插件⭐_
12 |
13 |
14 |
15 |
16 |
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
--------------------------------------------------------------------------------