nonebot-plugin-randpic 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 HuParry
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.
@@ -0,0 +1,157 @@
1
+ Metadata-Version: 2.1
2
+ Name: nonebot-plugin-randpic
3
+ Version: 0.0.1
4
+ Summary: 一个通过指令随机发送你存储的图片的插件
5
+ Home-page: https://github.com/HuParry/nonebot-plugin-randpic
6
+ License: MIT
7
+ Author: HuParry
8
+ Author-email: hu_parry@qq.com
9
+ Requires-Python: >=3.8
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.8
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Dist: asyncio (>=3.4.3)
18
+ Requires-Dist: httpx (>=0.20.0,<1.0.0)
19
+ Requires-Dist: nonebot-adapter-onebot (>=2.1.5)
20
+ Requires-Dist: nonebot2 (>=2.0.0)
21
+ Project-URL: Repository, https://github.com/HuParry/nonebot-plugin-randpic
22
+ Description-Content-Type: text/markdown
23
+
24
+ <div align="center">
25
+ <a href="https://v2.nonebot.dev/store"><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/nbp_logo.png" width="180" height="180" alt="NoneBotPluginLogo"></a>
26
+ <br>
27
+ <p><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/NoneBotPlugin.svg" width="240" alt="NoneBotPluginText"></p>
28
+ </div>
29
+
30
+ <div align="center">
31
+
32
+ # nonebot-plugin-randpic
33
+
34
+ _✨ 一个发送指令就能让你的 bot 发出对应指令的图片的插件 ✨_
35
+
36
+
37
+ <a href="./LICENSE">
38
+ <img src="https://img.shields.io/github/license/HuParry/nonebot-plugin-randpic.svg" alt="license">
39
+ </a>
40
+ <a href="https://pypi.python.org/pypi/nonebot-plugin-randpic">
41
+ <img src="https://img.shields.io/pypi/v/nonebot-plugin-randpic.svg" alt="pypi">
42
+ </a>
43
+ <img src="https://img.shields.io/badge/python-3.8+-blue.svg" alt="python">
44
+
45
+ </div>
46
+
47
+ ## 📖 介绍
48
+
49
+ 这是由 [nonebot-plugin-capoo](https://github.com/HuParry/nonebot-plugin-capoo) 插件衍生而来的随机发送图片的插件,从使用上来看,这个插件远优于那个插件。
50
+
51
+ 你可以很方便地直接通过在配置文件里设置好触发指令(支持多个触发指令)后,在群聊中发送对应指令,从而使 Bot 随机发送出你所存储的图片。
52
+
53
+ 插件除了能随机发送图片,还能在群聊内直接通过指令存储图片,同时为了避免重复加入同一张图片,该插件添加了 md5 码检查。
54
+
55
+ 随机发送图片是利用的 sqlite3 库里的随机选择指令。
56
+
57
+ 注意:插件版本更新时可能会对数据库表的结构进行更新,如果你更新插件后发现数据库有报错,那么可以试着删除 `data/randpic` 路径下的 `data.db` 文件,然后重新加载插件。
58
+
59
+ 该插件的运行逻辑是:
60
+ - 自动在 Bot 项目根目录的 `data` 文件夹下创建一个 `randpic` 文件夹;
61
+ - 在你预设指令(可以是多个)后,插件会检索指令,并在 `randpic` 目录下生成所有你预设命令作为名字的文件夹,同时生成一个 `data.db` 的数据库文件;
62
+ - 之后你可以通过 Bot 存储图片,也可以直接在 `data/<预设命令>` 文件夹下存储图片。
63
+
64
+ 你可以在bot未启动期间任意修改图片文件夹内的所有内容,因为在启动bot后插件会自动做图片配置检查,因此你不用担心自己修改图片后会导致数据库与文件夹内容不同步。
65
+
66
+ **但是在启动bot后不建议修改、删除以及添加图片**,否则可能会造成一些未知bug。
67
+
68
+ 不建议你存储过多图片(指几万张甚至更多),因为没做过存储大量图片的测试。
69
+
70
+ 有任何问题可提 issue,看到会及时回复,目前功能比较简单,以后会慢慢扩充。
71
+
72
+ 由于sqlite3库是同步数据库,日后将考虑更换成orm。
73
+
74
+ ## 💿 安装
75
+
76
+ <details>
77
+ <summary>使用 nb-cli 安装</summary>
78
+ 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装
79
+
80
+ nb plugin install nonebot-plugin-randpic
81
+
82
+ </details>
83
+
84
+ <details>
85
+ <summary>使用包管理器安装</summary>
86
+ 在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令
87
+
88
+ <details>
89
+ <summary>pip</summary>
90
+
91
+ pip install nonebot-plugin-randpic
92
+ </details>
93
+ <details>
94
+ <summary>pdm</summary>
95
+
96
+ pdm add nonebot-plugin-randpic
97
+ </details>
98
+ <details>
99
+ <summary>poetry</summary>
100
+
101
+ poetry add nonebot-plugin-randpic
102
+ </details>
103
+ <details>
104
+ <summary>conda</summary>
105
+
106
+ conda install nonebot-plugin-randpic
107
+ </details>
108
+
109
+ 打开 nonebot2 项目根目录下的 `pyproject.toml` 文件, 在 `[tool.nonebot]` 部分追加写入
110
+
111
+ plugins = ["nonebot_plugin_capoo"]
112
+
113
+ </details>
114
+
115
+ ## ⚙️ 配置
116
+
117
+ 在 nonebot2 项目的`.env`文件中添加下表中的必填配置
118
+
119
+ | 配置项 | 必填 | 默认值 | 说明 |
120
+ |:---:|:----:|:---------:|:-------------------------------:|
121
+ | randpic_command_set | 否 | {"capoo"} | 预设的触发指令,默认是capoo,即capoo触发发送图片 |
122
+
123
+ 例如这样配置:
124
+ ```
125
+ randpic_command_set={"capoo", "马哥"}
126
+ ```
127
+
128
+ ## 🎉 使用
129
+ ### 指令表
130
+ | 指令 | 权限 | 需要@ | 范围 | 说明 |
131
+ |:-----:|:----:|:----:|:----:|:-----------------:|
132
+ | `<你设置的指令>` | 群员 | 否 | 群聊 | 随机发送一张对应指令的图片 |
133
+ | `添加<你设置的指令>` | 群管 | 否 | 群聊 | 让 bot 存储图片到对应文件夹下 |
134
+
135
+ ### 效果图
136
+ #### `capoo` 指令
137
+ <img src="./docs/preview.jpg" width="375" />
138
+
139
+ #### `添加capoo` 指令
140
+ <img src="./docs/preview2.jpg" width="375" />
141
+
142
+ <img src="./docs/preview3.jpg" width="375" />
143
+
144
+ #### `马哥` 指令
145
+ <img src="./docs/mage1.png" width="375" />
146
+
147
+ #### `添加马哥` 指令
148
+ <img src="./docs/mage2.png" width="375" />
149
+
150
+ <img src="./docs/mage3.png" width="375" />
151
+
152
+ ## TODO
153
+ - [x] 指令触发 bot 发送图片
154
+ - [x] 在 QQ 上让 bot 存储对应指令的图片
155
+ - [x] 每次存储图片,判断图片是否已经存在,避免重复加入
156
+ - [ ] 指定某个序号的图片发送
157
+ - [X] 由该插件衍生成一个模板插件,即仅需修改参数就能发送别的图片
@@ -0,0 +1,134 @@
1
+ <div align="center">
2
+ <a href="https://v2.nonebot.dev/store"><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/nbp_logo.png" width="180" height="180" alt="NoneBotPluginLogo"></a>
3
+ <br>
4
+ <p><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/NoneBotPlugin.svg" width="240" alt="NoneBotPluginText"></p>
5
+ </div>
6
+
7
+ <div align="center">
8
+
9
+ # nonebot-plugin-randpic
10
+
11
+ _✨ 一个发送指令就能让你的 bot 发出对应指令的图片的插件 ✨_
12
+
13
+
14
+ <a href="./LICENSE">
15
+ <img src="https://img.shields.io/github/license/HuParry/nonebot-plugin-randpic.svg" alt="license">
16
+ </a>
17
+ <a href="https://pypi.python.org/pypi/nonebot-plugin-randpic">
18
+ <img src="https://img.shields.io/pypi/v/nonebot-plugin-randpic.svg" alt="pypi">
19
+ </a>
20
+ <img src="https://img.shields.io/badge/python-3.8+-blue.svg" alt="python">
21
+
22
+ </div>
23
+
24
+ ## 📖 介绍
25
+
26
+ 这是由 [nonebot-plugin-capoo](https://github.com/HuParry/nonebot-plugin-capoo) 插件衍生而来的随机发送图片的插件,从使用上来看,这个插件远优于那个插件。
27
+
28
+ 你可以很方便地直接通过在配置文件里设置好触发指令(支持多个触发指令)后,在群聊中发送对应指令,从而使 Bot 随机发送出你所存储的图片。
29
+
30
+ 插件除了能随机发送图片,还能在群聊内直接通过指令存储图片,同时为了避免重复加入同一张图片,该插件添加了 md5 码检查。
31
+
32
+ 随机发送图片是利用的 sqlite3 库里的随机选择指令。
33
+
34
+ 注意:插件版本更新时可能会对数据库表的结构进行更新,如果你更新插件后发现数据库有报错,那么可以试着删除 `data/randpic` 路径下的 `data.db` 文件,然后重新加载插件。
35
+
36
+ 该插件的运行逻辑是:
37
+ - 自动在 Bot 项目根目录的 `data` 文件夹下创建一个 `randpic` 文件夹;
38
+ - 在你预设指令(可以是多个)后,插件会检索指令,并在 `randpic` 目录下生成所有你预设命令作为名字的文件夹,同时生成一个 `data.db` 的数据库文件;
39
+ - 之后你可以通过 Bot 存储图片,也可以直接在 `data/<预设命令>` 文件夹下存储图片。
40
+
41
+ 你可以在bot未启动期间任意修改图片文件夹内的所有内容,因为在启动bot后插件会自动做图片配置检查,因此你不用担心自己修改图片后会导致数据库与文件夹内容不同步。
42
+
43
+ **但是在启动bot后不建议修改、删除以及添加图片**,否则可能会造成一些未知bug。
44
+
45
+ 不建议你存储过多图片(指几万张甚至更多),因为没做过存储大量图片的测试。
46
+
47
+ 有任何问题可提 issue,看到会及时回复,目前功能比较简单,以后会慢慢扩充。
48
+
49
+ 由于sqlite3库是同步数据库,日后将考虑更换成orm。
50
+
51
+ ## 💿 安装
52
+
53
+ <details>
54
+ <summary>使用 nb-cli 安装</summary>
55
+ 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装
56
+
57
+ nb plugin install nonebot-plugin-randpic
58
+
59
+ </details>
60
+
61
+ <details>
62
+ <summary>使用包管理器安装</summary>
63
+ 在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令
64
+
65
+ <details>
66
+ <summary>pip</summary>
67
+
68
+ pip install nonebot-plugin-randpic
69
+ </details>
70
+ <details>
71
+ <summary>pdm</summary>
72
+
73
+ pdm add nonebot-plugin-randpic
74
+ </details>
75
+ <details>
76
+ <summary>poetry</summary>
77
+
78
+ poetry add nonebot-plugin-randpic
79
+ </details>
80
+ <details>
81
+ <summary>conda</summary>
82
+
83
+ conda install nonebot-plugin-randpic
84
+ </details>
85
+
86
+ 打开 nonebot2 项目根目录下的 `pyproject.toml` 文件, 在 `[tool.nonebot]` 部分追加写入
87
+
88
+ plugins = ["nonebot_plugin_capoo"]
89
+
90
+ </details>
91
+
92
+ ## ⚙️ 配置
93
+
94
+ 在 nonebot2 项目的`.env`文件中添加下表中的必填配置
95
+
96
+ | 配置项 | 必填 | 默认值 | 说明 |
97
+ |:---:|:----:|:---------:|:-------------------------------:|
98
+ | randpic_command_set | 否 | {"capoo"} | 预设的触发指令,默认是capoo,即capoo触发发送图片 |
99
+
100
+ 例如这样配置:
101
+ ```
102
+ randpic_command_set={"capoo", "马哥"}
103
+ ```
104
+
105
+ ## 🎉 使用
106
+ ### 指令表
107
+ | 指令 | 权限 | 需要@ | 范围 | 说明 |
108
+ |:-----:|:----:|:----:|:----:|:-----------------:|
109
+ | `<你设置的指令>` | 群员 | 否 | 群聊 | 随机发送一张对应指令的图片 |
110
+ | `添加<你设置的指令>` | 群管 | 否 | 群聊 | 让 bot 存储图片到对应文件夹下 |
111
+
112
+ ### 效果图
113
+ #### `capoo` 指令
114
+ <img src="./docs/preview.jpg" width="375" />
115
+
116
+ #### `添加capoo` 指令
117
+ <img src="./docs/preview2.jpg" width="375" />
118
+
119
+ <img src="./docs/preview3.jpg" width="375" />
120
+
121
+ #### `马哥` 指令
122
+ <img src="./docs/mage1.png" width="375" />
123
+
124
+ #### `添加马哥` 指令
125
+ <img src="./docs/mage2.png" width="375" />
126
+
127
+ <img src="./docs/mage3.png" width="375" />
128
+
129
+ ## TODO
130
+ - [x] 指令触发 bot 发送图片
131
+ - [x] 在 QQ 上让 bot 存储对应指令的图片
132
+ - [x] 每次存储图片,判断图片是否已经存在,避免重复加入
133
+ - [ ] 指定某个序号的图片发送
134
+ - [X] 由该插件衍生成一个模板插件,即仅需修改参数就能发送别的图片
@@ -0,0 +1,176 @@
1
+ from .config import Config
2
+ from httpx import AsyncClient
3
+
4
+ from nonebot.adapters.onebot.v11 import MessageSegment, Message, Event
5
+ from nonebot.adapters.onebot.v11 import GROUP, GROUP_ADMIN, GROUP_OWNER
6
+ from nonebot.plugin import on_fullmatch
7
+ import os
8
+ from nonebot.plugin import PluginMetadata
9
+ from nonebot.params import Arg
10
+ from pathlib import Path
11
+ from typing import Tuple
12
+ from nonebot import get_driver
13
+ from nonebot.log import logger
14
+ import asyncio
15
+ import hashlib
16
+ import sqlite3
17
+ from nonebot.params import Fullmatch
18
+
19
+ __plugin_meta__ = PluginMetadata(
20
+ name="随机发送图片",
21
+ description="发送自定义指令后bot会随机发出一张你所存储的图片",
22
+ usage="使用命令:<你设置的指令>",
23
+ type="application",
24
+ homepage="https://github.com/HuParry/nonebot-plugin-randpic",
25
+ config=Config,
26
+ supported_adapters={"nonebot.adapters.onebot.v11"},
27
+ )
28
+
29
+ randpic_command_set = Config.parse_obj(get_driver().config.dict()).randpic_command_set
30
+
31
+ randpic_command_tuple: Tuple[str] = tuple(randpic_command_set) # 形成指令元组
32
+ randpic_command_add_tuple = tuple("添加" + tup for tup in randpic_command_tuple) # 形成添加指令元组
33
+
34
+ randpic_path = Path() / "data" / "randpic"
35
+ randpic_command_path_tuple = tuple(randpic_path / command for command in randpic_command_tuple) # 形成指令文件夹路径元组
36
+
37
+ randpic_filename: str = 'randpic_{command}_{index}'
38
+
39
+ connection: sqlite3.Connection
40
+
41
+ # 激活驱动器
42
+ driver = get_driver()
43
+
44
+
45
+ @driver.on_startup
46
+ async def _():
47
+ logger.info("正在检查文件...")
48
+ asyncio.create_task(create_file())
49
+ logger.info("文件检查完成,欢迎使用插件!")
50
+
51
+
52
+ # 创建所需文件夹和数据库
53
+ async def create_file():
54
+ # 先创建文件夹
55
+ for path in randpic_command_path_tuple:
56
+ if not path.exists():
57
+ logger.warning('未找到{path}文件夹,准备创建{path}文件夹...'.format(path=path))
58
+ path.mkdir(parents=True, exist_ok=True)
59
+ # 创建数据库,没有数据表创建数据表
60
+
61
+ global connection
62
+ connection = sqlite3.connect(randpic_path / "data.db")
63
+ cursor = connection.cursor()
64
+ # 没有表创建表
65
+ for command in randpic_command_tuple:
66
+ cursor.execute('DROP table if exists Pic_of_{command};'.format(command=command))
67
+ cursor.execute('''
68
+ CREATE TABLE IF NOT EXISTS Pic_of_{command} (
69
+ md5 TEXT PRIMARY KEY,
70
+ img_url TEXT
71
+ )
72
+ '''.format(command=command))
73
+ connection.commit()
74
+
75
+ # 读取所有文件夹文件,调整文件夹内图片,并写入数据库
76
+ for index in range(len(randpic_command_path_tuple)):
77
+ global randpic_filename
78
+ path: Path = randpic_command_path_tuple[index]
79
+ randpic_file_list = os.listdir(path)
80
+ randpic_file_list.sort()
81
+
82
+ for i in range(len(randpic_file_list)):
83
+ filename = randpic_file_list[i]
84
+ filename_without_extension, filename_extension = os.path.splitext(filename)
85
+ new_filename = randpic_filename.format(command=randpic_command_tuple[index],
86
+ index=str(i+1))+(filename_extension if filename_extension != '' else '.jpg')
87
+ if filename_without_extension != randpic_filename:
88
+ os.rename(path / filename, path / new_filename)
89
+
90
+ # 将图片信息写入数据库
91
+ randpic_file_list = os.listdir(path)
92
+ randpic_file_list.sort()
93
+ for i in range(len(randpic_file_list)):
94
+ filename: str = randpic_file_list[i]
95
+ with (path / filename).open('rb') as f:
96
+ data = f.read()
97
+ fmd5 = hashlib.md5(data).hexdigest()
98
+
99
+ cursor = connection.cursor()
100
+ command: str = randpic_command_tuple[index]
101
+ cursor.execute(
102
+ 'INSERT or REPLACE INTO Pic_of_{command}(md5, img_url) VALUES (?, ?)'.format(command=command),
103
+ (fmd5, str(Path() / command / filename)))
104
+ connection.commit()
105
+
106
+
107
+ picture = on_fullmatch(randpic_command_tuple, permission=GROUP, priority=1, block=True)
108
+
109
+
110
+ @picture.handle()
111
+ async def pic(event: Event):
112
+ global connection
113
+ cursor = connection.cursor()
114
+ command = str(event.get_message()).strip()
115
+ cursor.execute(f'SELECT img_url FROM Pic_of_{command} ORDER BY RANDOM() limit 1')
116
+ data = cursor.fetchone()
117
+ if data is None:
118
+ await picture.finish('当前还没有图片!')
119
+ file_name = data[0]
120
+ img = randpic_path / file_name
121
+ try:
122
+ await picture.send(MessageSegment.image(img))
123
+ except:
124
+ await picture.send(f'{command}出不来了,稍后再试试吧~')
125
+
126
+
127
+ add = on_fullmatch(randpic_command_add_tuple, permission=GROUP_ADMIN | GROUP_OWNER, priority=1, block=True)
128
+
129
+
130
+ @add.got("pic", prompt="请发送图片!")
131
+ async def add_pic(args: str = Fullmatch(), pic_list: Message = Arg('pic')):
132
+ global connection
133
+ cursor = connection.cursor()
134
+ command = args.replace('添加', '')
135
+
136
+ for pic in pic_list:
137
+ if pic.type != 'image':
138
+ await add.send(pic + MessageSegment.text("\n输入格式有误,请重新触发指令!"), at_sender=True)
139
+ continue
140
+ pic_url = pic.data['url']
141
+
142
+ async with AsyncClient() as client:
143
+ resp = await client.get(pic_url, timeout=5.0)
144
+
145
+ try:
146
+ resp.raise_for_status()
147
+ except:
148
+ await add.send(
149
+ pic +
150
+ MessageSegment.text('\n保存出错了,这张请重试')
151
+ )
152
+ continue
153
+
154
+ data = resp.content
155
+ fmd5 = hashlib.md5(data).hexdigest()
156
+
157
+ cursor.execute(f'SELECT img_url FROM Pic_of_{command} where md5=?', (fmd5,))
158
+ status = cursor.fetchone()
159
+
160
+ if status is not None:
161
+ await add.send(pic + Message('\n这张已经有了,不能重复添加!') )
162
+ else:
163
+ without_extension, extension = os.path.splitext(pic_url)
164
+ randpic_cur_picnum = len(os.listdir(randpic_path/command))
165
+ file_name = (randpic_filename.format(command=command, index=str(randpic_cur_picnum+1))
166
+ +(extension if extension != '' else '.jpg'))
167
+ file_path = randpic_path/ command / file_name
168
+
169
+ try:
170
+ with file_path.open("wb") as f:
171
+ f.write(data)
172
+ cursor.execute('insert into Pic_of_{command}(md5, img_url) values (?, ?)'.format(command=command),
173
+ (fmd5, str(Path() / command / file_name)))
174
+ await add.send(pic + Message("\n导入成功!"), at_sender=True)
175
+ except:
176
+ await add.send(pic + Message("\n导入失败!"), at_sender=True)
@@ -0,0 +1,8 @@
1
+ from pydantic import BaseModel, Extra
2
+ from typing import Set
3
+
4
+
5
+ class Config(BaseModel, extra=Extra.ignore):
6
+ randpic_command_set: Set[str] = {"capoo"} # 指令集合
7
+
8
+
@@ -0,0 +1,23 @@
1
+ [tool.poetry]
2
+ name = "nonebot-plugin-randpic"
3
+ version = "0.0.1"
4
+ description = "一个通过指令随机发送你存储的图片的插件"
5
+ authors = ["HuParry <hu_parry@qq.com>"]
6
+ license = "MIT"
7
+ readme = "README.md"
8
+ packages = [{include = "nonebot_plugin_randpic"}]
9
+ homepage = "https://github.com/HuParry/nonebot-plugin-randpic"
10
+ repository = "https://github.com/HuParry/nonebot-plugin-randpic"
11
+
12
+
13
+ [tool.poetry.dependencies]
14
+ python = ">=3.8"
15
+ nonebot2 = ">=2.0.0"
16
+ nonebot-adapter-onebot = ">=2.1.5"
17
+ httpx = ">=0.20.0,<1.0.0"
18
+ asyncio = ">=3.4.3"
19
+
20
+
21
+ [build-system]
22
+ requires = ["poetry-core"]
23
+ build-backend = "poetry.core.masonry.api"