OneBotConnecter 0.1.0__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.
- onebotconnecter-0.1.0/LICENSE +21 -0
- onebotconnecter-0.1.0/PKG-INFO +59 -0
- onebotconnecter-0.1.0/README.md +23 -0
- onebotconnecter-0.1.0/pyproject.toml +22 -0
- onebotconnecter-0.1.0/setup.cfg +4 -0
- onebotconnecter-0.1.0/src/OneBotConnecter/MessageType.py +325 -0
- onebotconnecter-0.1.0/src/OneBotConnecter/OneBot.py +715 -0
- onebotconnecter-0.1.0/src/OneBotConnecter/__init__.py +2 -0
- onebotconnecter-0.1.0/src/OneBotConnecter.egg-info/PKG-INFO +59 -0
- onebotconnecter-0.1.0/src/OneBotConnecter.egg-info/SOURCES.txt +10 -0
- onebotconnecter-0.1.0/src/OneBotConnecter.egg-info/dependency_links.txt +1 -0
- onebotconnecter-0.1.0/src/OneBotConnecter.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Sugar51243
|
|
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,59 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: OneBotConnecter
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 基于websocket(服务器正向)连接的onebot11通用python接口
|
|
5
|
+
Author-email: Sugar51243 <1733682365@qq.com>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2025 Sugar51243
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/Sugar51243/OneBotConnecter
|
|
29
|
+
Project-URL: Issues, https://github.com/Sugar51243/OneBotConnecter/issues
|
|
30
|
+
Classifier: Programming Language :: Python :: 3
|
|
31
|
+
Classifier: Operating System :: OS Independent
|
|
32
|
+
Requires-Python: >=3.9
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
License-File: LICENSE
|
|
35
|
+
Dynamic: license-file
|
|
36
|
+
|
|
37
|
+
# OneBotConnecter
|
|
38
|
+
本项目为onebot协议的非官方python整合, 允许用户快捷连接ws服务器,并收发信息。<br>
|
|
39
|
+
本项目基于ll2接口开发。理论上面对其他基于onebot-11协议的接口同样可以运行,但是毕竟没实际测试过,本人不担保可以100%顺利运行。
|
|
40
|
+
|
|
41
|
+
### !!!!!!
|
|
42
|
+
项目本身不包括任何机器人接口,请自行安装支持onebot协议的机器人接口并完成登录,再运行本项目!!!
|
|
43
|
+
|
|
44
|
+
## 项目结构
|
|
45
|
+
项目本身仅包括两个文件,OneBot.py及MessageType.py。<br>
|
|
46
|
+
OneBot负责服务器的直接连接及信息的IO处理。<br>
|
|
47
|
+
MessageType负责信息发送的数据包构造。<br>
|
|
48
|
+
换而言之,需要 查询/修改 对服务器直接交互或信息收集行为的情况下,请直接查询或修改 [OneBot.py](https://github.com/Sugar51243/OneBotConnecter/blob/main/OneBotConnecter/OneBot.py)。需要 查询/修改 向服务器发送的数据包内容或格式,请直接查询或修改 [MessageType.py](https://github.com/Sugar51243/OneBotConnecter/blob/main/OneBotConnecter/MessageType.py)。
|
|
49
|
+
|
|
50
|
+
## 使用教程
|
|
51
|
+
本项目基于python异步运行,请确保asyncio库已被引入。<br>
|
|
52
|
+
使用方法很简单:<br>
|
|
53
|
+
1.构造收集到信息时需要运行的脚本函数,填入参数为(机器人本体bot, 信息数据包message)<br>
|
|
54
|
+
2.通过本库创建OneBot对象并填入机器人基本信息,填入参数为(服务器地址, 管理员id, 机器人别称)<br>
|
|
55
|
+
3.运行对象的run函数,并填入1步骤的脚本函数为参数,开始连接并监听服务器推送<br>
|
|
56
|
+
具体可参考本项目的[example文件](https://github.com/Sugar51243/OneBotConnecter/blob/main/examples/test.py),个人认为已经写得很清楚了。
|
|
57
|
+
|
|
58
|
+
## 安装
|
|
59
|
+
`pip install git+https://github.com/sugar51243/OneBotConnecter.git`
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# OneBotConnecter
|
|
2
|
+
本项目为onebot协议的非官方python整合, 允许用户快捷连接ws服务器,并收发信息。<br>
|
|
3
|
+
本项目基于ll2接口开发。理论上面对其他基于onebot-11协议的接口同样可以运行,但是毕竟没实际测试过,本人不担保可以100%顺利运行。
|
|
4
|
+
|
|
5
|
+
### !!!!!!
|
|
6
|
+
项目本身不包括任何机器人接口,请自行安装支持onebot协议的机器人接口并完成登录,再运行本项目!!!
|
|
7
|
+
|
|
8
|
+
## 项目结构
|
|
9
|
+
项目本身仅包括两个文件,OneBot.py及MessageType.py。<br>
|
|
10
|
+
OneBot负责服务器的直接连接及信息的IO处理。<br>
|
|
11
|
+
MessageType负责信息发送的数据包构造。<br>
|
|
12
|
+
换而言之,需要 查询/修改 对服务器直接交互或信息收集行为的情况下,请直接查询或修改 [OneBot.py](https://github.com/Sugar51243/OneBotConnecter/blob/main/OneBotConnecter/OneBot.py)。需要 查询/修改 向服务器发送的数据包内容或格式,请直接查询或修改 [MessageType.py](https://github.com/Sugar51243/OneBotConnecter/blob/main/OneBotConnecter/MessageType.py)。
|
|
13
|
+
|
|
14
|
+
## 使用教程
|
|
15
|
+
本项目基于python异步运行,请确保asyncio库已被引入。<br>
|
|
16
|
+
使用方法很简单:<br>
|
|
17
|
+
1.构造收集到信息时需要运行的脚本函数,填入参数为(机器人本体bot, 信息数据包message)<br>
|
|
18
|
+
2.通过本库创建OneBot对象并填入机器人基本信息,填入参数为(服务器地址, 管理员id, 机器人别称)<br>
|
|
19
|
+
3.运行对象的run函数,并填入1步骤的脚本函数为参数,开始连接并监听服务器推送<br>
|
|
20
|
+
具体可参考本项目的[example文件](https://github.com/Sugar51243/OneBotConnecter/blob/main/examples/test.py),个人认为已经写得很清楚了。
|
|
21
|
+
|
|
22
|
+
## 安装
|
|
23
|
+
`pip install git+https://github.com/sugar51243/OneBotConnecter.git`
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=42", "websockets"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "OneBotConnecter"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name="Sugar51243", email="1733682365@qq.com" },
|
|
10
|
+
]
|
|
11
|
+
description = "基于websocket(服务器正向)连接的onebot11通用python接口"
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
requires-python = ">=3.9"
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Operating System :: OS Independent",
|
|
17
|
+
]
|
|
18
|
+
license = {file = "LICENSE"}
|
|
19
|
+
|
|
20
|
+
[project.urls]
|
|
21
|
+
Homepage = "https://github.com/Sugar51243/OneBotConnecter"
|
|
22
|
+
Issues = "https://github.com/Sugar51243/OneBotConnecter/issues"
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
import random
|
|
3
|
+
from typing import Literal
|
|
4
|
+
|
|
5
|
+
#抽象类: 信息(发送)
|
|
6
|
+
class Message(ABC):
|
|
7
|
+
def __init__(self): pass
|
|
8
|
+
@abstractmethod
|
|
9
|
+
def to_dict(self): return {}
|
|
10
|
+
@abstractmethod
|
|
11
|
+
def returnData(self): return []
|
|
12
|
+
|
|
13
|
+
# 文字信息
|
|
14
|
+
class TextMessage(Message):
|
|
15
|
+
|
|
16
|
+
text = ""
|
|
17
|
+
|
|
18
|
+
def __init__(self, data: str):
|
|
19
|
+
self.text = data
|
|
20
|
+
|
|
21
|
+
def to_dict(self):
|
|
22
|
+
msg = {
|
|
23
|
+
"type": "text",
|
|
24
|
+
"data": {
|
|
25
|
+
"text": self.text
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return msg
|
|
29
|
+
|
|
30
|
+
def returnData(self):
|
|
31
|
+
return [self.to_dict()]
|
|
32
|
+
|
|
33
|
+
# 回复信息
|
|
34
|
+
class ReplyMessage(Message):
|
|
35
|
+
|
|
36
|
+
message_id: int
|
|
37
|
+
|
|
38
|
+
def __init__(self, message_id: int):
|
|
39
|
+
self.message_id = message_id
|
|
40
|
+
|
|
41
|
+
def to_dict(self):
|
|
42
|
+
msg = {
|
|
43
|
+
"type": "reply",
|
|
44
|
+
"data": {
|
|
45
|
+
"id": self.message_id
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return msg
|
|
49
|
+
|
|
50
|
+
def returnData(self):
|
|
51
|
+
return [self.to_dict()]
|
|
52
|
+
|
|
53
|
+
# 图片信息
|
|
54
|
+
class ImageMessage(Message):
|
|
55
|
+
|
|
56
|
+
data: str
|
|
57
|
+
|
|
58
|
+
def __init__(self, data: str):
|
|
59
|
+
self.data = data
|
|
60
|
+
|
|
61
|
+
def to_dict(self):
|
|
62
|
+
msg = {
|
|
63
|
+
"type": "image",
|
|
64
|
+
"data": {
|
|
65
|
+
"file": self.data
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return msg
|
|
69
|
+
|
|
70
|
+
def returnData(self):
|
|
71
|
+
return [self.to_dict()]
|
|
72
|
+
|
|
73
|
+
# 表情信息
|
|
74
|
+
class EmojiMessage(Message):
|
|
75
|
+
|
|
76
|
+
data: str
|
|
77
|
+
|
|
78
|
+
def __init__(self, id: str):
|
|
79
|
+
self.id = id
|
|
80
|
+
|
|
81
|
+
def to_dict(self):
|
|
82
|
+
msg = {
|
|
83
|
+
"type": "face",
|
|
84
|
+
"data": {
|
|
85
|
+
"id": self.id
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return msg
|
|
89
|
+
|
|
90
|
+
def returnData(self):
|
|
91
|
+
return [self.to_dict()]
|
|
92
|
+
|
|
93
|
+
# 语音信息
|
|
94
|
+
class RecordMessage(Message):
|
|
95
|
+
|
|
96
|
+
data: str
|
|
97
|
+
|
|
98
|
+
def __init__(self, data: str):
|
|
99
|
+
self.data = data
|
|
100
|
+
|
|
101
|
+
def to_dict(self):
|
|
102
|
+
msg = {
|
|
103
|
+
"type": "record",
|
|
104
|
+
"data": {
|
|
105
|
+
"file": self.data
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return msg
|
|
109
|
+
|
|
110
|
+
def returnData(self):
|
|
111
|
+
return [self.to_dict()]
|
|
112
|
+
|
|
113
|
+
# 视频信息
|
|
114
|
+
class VideoMessage(Message):
|
|
115
|
+
|
|
116
|
+
data: str
|
|
117
|
+
|
|
118
|
+
def __init__(self, data: str):
|
|
119
|
+
self.data = data
|
|
120
|
+
|
|
121
|
+
def to_dict(self):
|
|
122
|
+
msg = {
|
|
123
|
+
"type": "video",
|
|
124
|
+
"data": {
|
|
125
|
+
"file": self.data
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return msg
|
|
129
|
+
|
|
130
|
+
def returnData(self):
|
|
131
|
+
return [self.to_dict()]
|
|
132
|
+
|
|
133
|
+
# 超级表情: 骰子信息
|
|
134
|
+
class DiceMessage(Message):
|
|
135
|
+
|
|
136
|
+
result: int
|
|
137
|
+
|
|
138
|
+
def __init__(self, result: int = None):
|
|
139
|
+
self.result = result
|
|
140
|
+
|
|
141
|
+
def to_dict(self):
|
|
142
|
+
if self.result == None:
|
|
143
|
+
self.result = random.randint(1,6)
|
|
144
|
+
msg = {
|
|
145
|
+
"type": "dice",
|
|
146
|
+
"data": {
|
|
147
|
+
"result": self.result
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return msg
|
|
151
|
+
|
|
152
|
+
def returnData(self):
|
|
153
|
+
return [self.to_dict()]
|
|
154
|
+
|
|
155
|
+
# 超级表情: 猜拳信息
|
|
156
|
+
class RPSMessage(Message):
|
|
157
|
+
|
|
158
|
+
def __init__(self): pass
|
|
159
|
+
|
|
160
|
+
def to_dict(self):
|
|
161
|
+
msg = {
|
|
162
|
+
"type": "rps",
|
|
163
|
+
"data": {}
|
|
164
|
+
}
|
|
165
|
+
return msg
|
|
166
|
+
|
|
167
|
+
def returnData(self):
|
|
168
|
+
return [self.to_dict()]
|
|
169
|
+
|
|
170
|
+
# QQ音乐卡片信息
|
|
171
|
+
class QQMusicMessage(Message):
|
|
172
|
+
|
|
173
|
+
id: int
|
|
174
|
+
|
|
175
|
+
def __init__(self, id: int):
|
|
176
|
+
self.id = id
|
|
177
|
+
|
|
178
|
+
def to_dict(self):
|
|
179
|
+
msg = {
|
|
180
|
+
"type": "music",
|
|
181
|
+
"data": {
|
|
182
|
+
"type": "qq",
|
|
183
|
+
"id": self.id
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return msg
|
|
187
|
+
|
|
188
|
+
def returnData(self):
|
|
189
|
+
return [self.to_dict()]
|
|
190
|
+
|
|
191
|
+
# 网易云音乐卡片信息
|
|
192
|
+
class Music163Message(Message):
|
|
193
|
+
|
|
194
|
+
id: int
|
|
195
|
+
|
|
196
|
+
def __init__(self, id: int):
|
|
197
|
+
self.id = id
|
|
198
|
+
|
|
199
|
+
def to_dict(self):
|
|
200
|
+
msg = {
|
|
201
|
+
"type": "music",
|
|
202
|
+
"data": {
|
|
203
|
+
"type": "163",
|
|
204
|
+
"id": self.id
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return msg
|
|
208
|
+
|
|
209
|
+
def returnData(self):
|
|
210
|
+
return [self.to_dict()]
|
|
211
|
+
|
|
212
|
+
# 自定义音乐卡片信息
|
|
213
|
+
class CustomMusicMessage(Message):
|
|
214
|
+
|
|
215
|
+
url: str
|
|
216
|
+
audio: str
|
|
217
|
+
title: str
|
|
218
|
+
image: str
|
|
219
|
+
|
|
220
|
+
def __init__(self, url: str, audio: str, title: str, image: str):
|
|
221
|
+
self.url = url
|
|
222
|
+
self.audio = audio
|
|
223
|
+
self.title = title
|
|
224
|
+
self.image = image
|
|
225
|
+
|
|
226
|
+
def to_dict(self):
|
|
227
|
+
msg = {
|
|
228
|
+
"type": "music",
|
|
229
|
+
"data": {
|
|
230
|
+
"type": "custom",
|
|
231
|
+
"audio": self.url,
|
|
232
|
+
"audio": self.audio,
|
|
233
|
+
"title": self.title,
|
|
234
|
+
"image": self.image
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return msg
|
|
238
|
+
|
|
239
|
+
def returnData(self):
|
|
240
|
+
return [self.to_dict()]
|
|
241
|
+
|
|
242
|
+
# 卡片信息
|
|
243
|
+
class PrivateCardMessage(Message):
|
|
244
|
+
|
|
245
|
+
data: str
|
|
246
|
+
|
|
247
|
+
def __init__(self, data: str):
|
|
248
|
+
self.data = data
|
|
249
|
+
|
|
250
|
+
def to_dict(self):
|
|
251
|
+
msg = {
|
|
252
|
+
"type": "json",
|
|
253
|
+
"data": {
|
|
254
|
+
"data": self.data
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return msg
|
|
258
|
+
|
|
259
|
+
def returnData(self):
|
|
260
|
+
return [self.to_dict()]
|
|
261
|
+
|
|
262
|
+
# 合并转发信息
|
|
263
|
+
class PrivateCardMessage(Message):
|
|
264
|
+
|
|
265
|
+
data: Message
|
|
266
|
+
|
|
267
|
+
def __init__(self, data: Message):
|
|
268
|
+
self.data = data
|
|
269
|
+
|
|
270
|
+
def to_dict(self):
|
|
271
|
+
msg = {
|
|
272
|
+
"type": "json",
|
|
273
|
+
"data": {
|
|
274
|
+
"content": self.data.returnData()
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return msg
|
|
278
|
+
|
|
279
|
+
def returnData(self):
|
|
280
|
+
return [self.to_dict()]
|
|
281
|
+
|
|
282
|
+
# @信息
|
|
283
|
+
class AtMessage(Message):
|
|
284
|
+
|
|
285
|
+
qq: str
|
|
286
|
+
|
|
287
|
+
def __init__(self, qq: int | Literal["all"]):
|
|
288
|
+
if type(qq) == int:
|
|
289
|
+
qq = str(qq)
|
|
290
|
+
self.qq = qq
|
|
291
|
+
|
|
292
|
+
def to_dict(self):
|
|
293
|
+
msg = {
|
|
294
|
+
"type": "at",
|
|
295
|
+
"data": {
|
|
296
|
+
"qq": self.qq
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return msg
|
|
300
|
+
|
|
301
|
+
def returnData(self):
|
|
302
|
+
return [self.to_dict()]
|
|
303
|
+
|
|
304
|
+
# 信息链
|
|
305
|
+
class MessageChain(Message):
|
|
306
|
+
|
|
307
|
+
data: list[dict]
|
|
308
|
+
|
|
309
|
+
def __init__(self, data: list[Message|str]):
|
|
310
|
+
temp = []
|
|
311
|
+
for msg in data:
|
|
312
|
+
if type(msg) == str:
|
|
313
|
+
msg = TextMessage(msg)
|
|
314
|
+
msg = msg.to_dict()
|
|
315
|
+
temp.append(msg)
|
|
316
|
+
self.data = temp
|
|
317
|
+
|
|
318
|
+
def add(self, message):
|
|
319
|
+
self.data.extend(message.returnData())
|
|
320
|
+
|
|
321
|
+
def to_dict(self):
|
|
322
|
+
return {}
|
|
323
|
+
|
|
324
|
+
def returnData(self):
|
|
325
|
+
return self.data
|
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
try:
|
|
2
|
+
from OneBotConnecter.MessageType import Message, ReplyMessage, AtMessage, MessageChain
|
|
3
|
+
except:
|
|
4
|
+
print("File [OneBotMessageType.py] missing")
|
|
5
|
+
raise Exception()
|
|
6
|
+
from typing import Literal
|
|
7
|
+
import os
|
|
8
|
+
moduleList = ["traceback", "asyncio", "json", "websockets"]
|
|
9
|
+
for module in moduleList:
|
|
10
|
+
try:
|
|
11
|
+
exec(f"import {module}")
|
|
12
|
+
except:
|
|
13
|
+
os.system("pip install " + module)
|
|
14
|
+
exec(f"import {module}")
|
|
15
|
+
|
|
16
|
+
def _on_message(bot, message):
|
|
17
|
+
print(message)
|
|
18
|
+
|
|
19
|
+
#机器人接口连接
|
|
20
|
+
class OneBot:
|
|
21
|
+
_uri: str = None #机器人地址
|
|
22
|
+
bot = None #连接本体
|
|
23
|
+
owner: list[str] = None #机器人管理员
|
|
24
|
+
botName: list[str] = [] #机器人名称
|
|
25
|
+
nickname: str = None
|
|
26
|
+
botAcc: int = None
|
|
27
|
+
testMode = False #调试模式
|
|
28
|
+
#构造体
|
|
29
|
+
def __init__(self, uri: str, owner: list[str] = [], botName: list[str] = []):
|
|
30
|
+
self._uri = uri
|
|
31
|
+
self.owner = owner
|
|
32
|
+
self.botName = botName
|
|
33
|
+
#建立连接 (WS正向)
|
|
34
|
+
async def run(self, on_message: __module__ = _on_message, sleep_time: int = 1):
|
|
35
|
+
async with websockets.connect(self._uri) as websocket:
|
|
36
|
+
self.bot = websocket
|
|
37
|
+
message = await self.bot.recv()
|
|
38
|
+
print(f"\n地址{self._uri}连接已完成")
|
|
39
|
+
await self.get_login_info()
|
|
40
|
+
print(f"机器人账号: {self.botAcc}")
|
|
41
|
+
print(f"机器人管理员: {self.owner}")
|
|
42
|
+
print(f"机器人名称: {self.botName}")
|
|
43
|
+
print(f"开始监听机器人信息推送\n")
|
|
44
|
+
while True:
|
|
45
|
+
task = asyncio.create_task(self._receive_messages(on_message))
|
|
46
|
+
try:
|
|
47
|
+
result = task.result()
|
|
48
|
+
except Exception:
|
|
49
|
+
if self.testMode: traceback.print_exc()
|
|
50
|
+
await asyncio.sleep(sleep_time)
|
|
51
|
+
#收到信息时
|
|
52
|
+
async def _receive_messages(self, callback: __module__):
|
|
53
|
+
try:
|
|
54
|
+
message = await self.bot.recv()
|
|
55
|
+
message = json.loads(message)
|
|
56
|
+
if message["meta_event_type"] == "lifecycle" and message["sub_type"] != "connect":
|
|
57
|
+
print("机器人账号已掉线")
|
|
58
|
+
elif message["meta_event_type"] == "heartbeat" and message["status"]["online"] != True:
|
|
59
|
+
print("机器人账号已掉线")
|
|
60
|
+
except: pass
|
|
61
|
+
try:
|
|
62
|
+
if message["post_type"] != "meta_event" and self.bot != None:
|
|
63
|
+
try:
|
|
64
|
+
await callback(self, message)
|
|
65
|
+
except Exception as e:
|
|
66
|
+
traceback.print_exc()
|
|
67
|
+
except: print(message)
|
|
68
|
+
#为信息发送构造数据包
|
|
69
|
+
def _createDataPack(self, action: str, params: dict):
|
|
70
|
+
data = {
|
|
71
|
+
"action": action,
|
|
72
|
+
"params": params
|
|
73
|
+
}
|
|
74
|
+
return json.dumps(data)
|
|
75
|
+
#把数据包发送至机器人端口,并收集处理结果
|
|
76
|
+
async def _sendToServer(self, action: str, params: dict):
|
|
77
|
+
datapack = self._createDataPack(action, params)
|
|
78
|
+
if self.testMode:print(f"数据包发送: {datapack}")
|
|
79
|
+
await self.bot.send(datapack)
|
|
80
|
+
try:
|
|
81
|
+
callback = await self.bot.recv()
|
|
82
|
+
message = json.loads(callback)
|
|
83
|
+
if self.testMode: print(f"数据包返回: {message}")
|
|
84
|
+
return message
|
|
85
|
+
except: return None
|
|
86
|
+
#调试模式开关
|
|
87
|
+
def test(self, testMode: bool = False):
|
|
88
|
+
self.testMode = testMode
|
|
89
|
+
# =====------API------===== #
|
|
90
|
+
# ------好友----- #
|
|
91
|
+
#点赞
|
|
92
|
+
async def send_like(self, user_id: int, times=1):
|
|
93
|
+
params = {
|
|
94
|
+
"user_id": user_id,
|
|
95
|
+
"times": times
|
|
96
|
+
}
|
|
97
|
+
callback = await self._sendToServer("send_like", params)
|
|
98
|
+
return callback
|
|
99
|
+
#好友列表
|
|
100
|
+
async def get_friend_list(self):
|
|
101
|
+
params = {}
|
|
102
|
+
callback = await self._sendToServer("get_friend_list", params)
|
|
103
|
+
return callback
|
|
104
|
+
#好友列表(带分组)
|
|
105
|
+
async def get_friends_with_category(self):
|
|
106
|
+
params = {}
|
|
107
|
+
callback = await self._sendToServer("get_friends_with_category", params)
|
|
108
|
+
return callback
|
|
109
|
+
#删除好友
|
|
110
|
+
async def delete_friend(self, user_id: int):
|
|
111
|
+
params = {
|
|
112
|
+
"user_id": user_id
|
|
113
|
+
}
|
|
114
|
+
callback = await self._sendToServer("delete_friend", params)
|
|
115
|
+
return callback
|
|
116
|
+
#处理好友申请
|
|
117
|
+
async def set_friend_add_request(self, flag: str, approve: bool, remark: str = None):
|
|
118
|
+
params = {
|
|
119
|
+
"flag": flag,
|
|
120
|
+
"approve": approve,
|
|
121
|
+
"remark": remark
|
|
122
|
+
}
|
|
123
|
+
callback = await self._sendToServer("set_friend_add_request", params)
|
|
124
|
+
return callback
|
|
125
|
+
#设置好友备注
|
|
126
|
+
async def set_friend_remark(self, user_id: int, remark: str = None):
|
|
127
|
+
params = {
|
|
128
|
+
"user_id": user_id,
|
|
129
|
+
"remark": remark
|
|
130
|
+
}
|
|
131
|
+
callback = await self._sendToServer("set_friend_remark", params)
|
|
132
|
+
return callback
|
|
133
|
+
#获取好友或群友信息
|
|
134
|
+
async def get_stranger_info(self, user_id: int):
|
|
135
|
+
params = {
|
|
136
|
+
"user_id": user_id
|
|
137
|
+
}
|
|
138
|
+
callback = await self._sendToServer("get_stranger_info", params)
|
|
139
|
+
return callback
|
|
140
|
+
#设置个人头像
|
|
141
|
+
async def set_qq_avatar(self, file: int):
|
|
142
|
+
params = {
|
|
143
|
+
"file": file
|
|
144
|
+
}
|
|
145
|
+
callback = await self._sendToServer("set_qq_avatar", params)
|
|
146
|
+
return callback
|
|
147
|
+
#好友戳一戳
|
|
148
|
+
async def friend_poke(self, user_id: int):
|
|
149
|
+
params = {
|
|
150
|
+
"user_id": user_id
|
|
151
|
+
}
|
|
152
|
+
callback = await self._sendToServer("friend_poke", params)
|
|
153
|
+
return callback
|
|
154
|
+
#获取我赞过谁列表
|
|
155
|
+
async def get_profile_like(self, start: int=0, count: int=20):
|
|
156
|
+
params = {
|
|
157
|
+
"start": start,
|
|
158
|
+
"count": count
|
|
159
|
+
}
|
|
160
|
+
callback = await self._sendToServer("get_profile_like", params)
|
|
161
|
+
return callback
|
|
162
|
+
#获取谁赞过我列表
|
|
163
|
+
async def get_profile_like_me(self, start: int=0, count: int=20):
|
|
164
|
+
params = {
|
|
165
|
+
"start": start,
|
|
166
|
+
"count": count
|
|
167
|
+
}
|
|
168
|
+
callback = await self._sendToServer("get_profile_like_me", params)
|
|
169
|
+
return callback
|
|
170
|
+
#获取官方机器人QQ号范围
|
|
171
|
+
async def get_robot_uin_range(self):
|
|
172
|
+
params = {}
|
|
173
|
+
callback = await self._sendToServer("get_robot_uin_range", params)
|
|
174
|
+
return callback
|
|
175
|
+
#移动好友分组
|
|
176
|
+
async def set_friend_category(self, user_id: int, category_id: int):
|
|
177
|
+
params = {
|
|
178
|
+
"user_id": user_id,
|
|
179
|
+
"category_id": category_id
|
|
180
|
+
}
|
|
181
|
+
callback = await self._sendToServer("set_friend_category", params)
|
|
182
|
+
return callback
|
|
183
|
+
#获取QQ头像
|
|
184
|
+
async def get_qq_avatar(self, user_id: int):
|
|
185
|
+
params = {
|
|
186
|
+
"user_id": user_id
|
|
187
|
+
}
|
|
188
|
+
callback = await self._sendToServer("get_qq_avatar", params)
|
|
189
|
+
return callback
|
|
190
|
+
#获取被过滤好友请求
|
|
191
|
+
async def get_doubt_friends_add_request(self, count: int):
|
|
192
|
+
params = {
|
|
193
|
+
"count": count
|
|
194
|
+
}
|
|
195
|
+
callback = await self._sendToServer("get_doubt_friends_add_request", params)
|
|
196
|
+
return callback
|
|
197
|
+
#处理被过滤好友请求
|
|
198
|
+
async def set_doubt_friends_add_request(self, flag: str):
|
|
199
|
+
params = {
|
|
200
|
+
"flag": flag
|
|
201
|
+
}
|
|
202
|
+
callback = await self._sendToServer("set_doubt_friends_add_request", params)
|
|
203
|
+
return callback
|
|
204
|
+
# ------群组----- #
|
|
205
|
+
#群列表
|
|
206
|
+
async def get_group_list(self, no_cache: bool = False):
|
|
207
|
+
params = {
|
|
208
|
+
"no_cache": no_cache
|
|
209
|
+
}
|
|
210
|
+
callback = await self._sendToServer("get_group_list", params)
|
|
211
|
+
return callback
|
|
212
|
+
#群详情
|
|
213
|
+
async def get_group_info(self, group_id: int):
|
|
214
|
+
params = {
|
|
215
|
+
"group_id": group_id
|
|
216
|
+
}
|
|
217
|
+
callback = await self._sendToServer("get_group_info", params)
|
|
218
|
+
return callback
|
|
219
|
+
#群成员列表
|
|
220
|
+
async def get_group_member_list(self, group_id: int, no_cache: bool = False):
|
|
221
|
+
params = {
|
|
222
|
+
"group_id": group_id,
|
|
223
|
+
"no_cache": no_cache
|
|
224
|
+
}
|
|
225
|
+
callback = await self._sendToServer("get_group_member_list", params)
|
|
226
|
+
return callback
|
|
227
|
+
#获取群成员信息
|
|
228
|
+
async def get_group_member_info(self, group_id: int, user_id: int, no_cache: bool = False):
|
|
229
|
+
params = {
|
|
230
|
+
"group_id": group_id,
|
|
231
|
+
"user_id": user_id,
|
|
232
|
+
"no_cache": no_cache
|
|
233
|
+
}
|
|
234
|
+
callback = await self._sendToServer("get_group_member_info", params)
|
|
235
|
+
return callback
|
|
236
|
+
#群员戳一戳
|
|
237
|
+
async def group_poke(self, group_id: int, user_id: int):
|
|
238
|
+
params = {
|
|
239
|
+
"group_id": group_id,
|
|
240
|
+
"user_id": user_id
|
|
241
|
+
}
|
|
242
|
+
callback = await self._sendToServer("group_poke", params)
|
|
243
|
+
return callback
|
|
244
|
+
#获取群系统消息
|
|
245
|
+
async def get_group_system_msg(self):
|
|
246
|
+
params = {}
|
|
247
|
+
callback = await self._sendToServer("get_group_system_msg", params)
|
|
248
|
+
return callback
|
|
249
|
+
#处理加群请求
|
|
250
|
+
async def set_group_add_request(self, flag: str, approve: bool = True, reason: str = " "):
|
|
251
|
+
params = {
|
|
252
|
+
"flag": flag,
|
|
253
|
+
"approve": approve,
|
|
254
|
+
"reason": reason
|
|
255
|
+
}
|
|
256
|
+
callback = await self._sendToServer("set_group_add_request", params)
|
|
257
|
+
return callback
|
|
258
|
+
#退群
|
|
259
|
+
async def set_group_leave(self, group_id: int):
|
|
260
|
+
params = {
|
|
261
|
+
"group_id": group_id
|
|
262
|
+
}
|
|
263
|
+
callback = await self._sendToServer("set_group_leave", params)
|
|
264
|
+
return callback
|
|
265
|
+
#设置群管理员
|
|
266
|
+
async def set_group_admin(self, group_id: int, user_id: int, enable: bool):
|
|
267
|
+
params = {
|
|
268
|
+
"group_id": group_id,
|
|
269
|
+
"user_id": user_id,
|
|
270
|
+
"enable": enable
|
|
271
|
+
}
|
|
272
|
+
callback = await self._sendToServer("set_group_admin", params)
|
|
273
|
+
return callback
|
|
274
|
+
#设置群名片
|
|
275
|
+
async def set_group_card(self, group_id: int, user_id: int, card: str = " "):
|
|
276
|
+
params = {
|
|
277
|
+
"group_id": group_id,
|
|
278
|
+
"user_id": user_id,
|
|
279
|
+
"card": card
|
|
280
|
+
}
|
|
281
|
+
callback = await self._sendToServer("set_group_card", params)
|
|
282
|
+
return callback
|
|
283
|
+
#群禁言
|
|
284
|
+
async def set_group_ban(self, group_id: int, user_id: int, duration: int = 0):
|
|
285
|
+
params = {
|
|
286
|
+
"group_id": group_id,
|
|
287
|
+
"user_id": user_id,
|
|
288
|
+
"duration": duration
|
|
289
|
+
}
|
|
290
|
+
callback = await self._sendToServer("set_group_ban", params)
|
|
291
|
+
return callback
|
|
292
|
+
#群全体禁言
|
|
293
|
+
async def set_group_whole_ban(self, group_id: int, enable: bool = False):
|
|
294
|
+
params = {
|
|
295
|
+
"group_id": group_id,
|
|
296
|
+
"enable": enable
|
|
297
|
+
}
|
|
298
|
+
callback = await self._sendToServer("set_group_whole_ban", params)
|
|
299
|
+
return callback
|
|
300
|
+
#获取被禁言群员列表
|
|
301
|
+
async def get_group_shut_list(self, group_id: int):
|
|
302
|
+
params = {
|
|
303
|
+
"group_id": group_id
|
|
304
|
+
}
|
|
305
|
+
callback = await self._sendToServer("get_group_shut_list", params)
|
|
306
|
+
return callback
|
|
307
|
+
#设置群名
|
|
308
|
+
async def set_group_name(self, group_id: int, group_name: str):
|
|
309
|
+
params = {
|
|
310
|
+
"group_id": group_id,
|
|
311
|
+
"group_name": group_name
|
|
312
|
+
}
|
|
313
|
+
callback = await self._sendToServer("set_group_name", params)
|
|
314
|
+
return callback
|
|
315
|
+
#批量踢出群成员
|
|
316
|
+
async def batch_delete_group_member(self, group_id: int, user_ids: list[int]):
|
|
317
|
+
params = {
|
|
318
|
+
"group_id": group_id,
|
|
319
|
+
"user_ids": user_ids
|
|
320
|
+
}
|
|
321
|
+
callback = await self._sendToServer("batch_delete_group_member", params)
|
|
322
|
+
return callback
|
|
323
|
+
#批量踢出群成员
|
|
324
|
+
async def set_group_kick(self, group_id: int, user_id: int, reject_add_request: bool = False):
|
|
325
|
+
params = {
|
|
326
|
+
"group_id": group_id,
|
|
327
|
+
"user_id": user_id,
|
|
328
|
+
"reject_add_request": reject_add_request
|
|
329
|
+
}
|
|
330
|
+
callback = await self._sendToServer("set_group_kick", params)
|
|
331
|
+
return callback
|
|
332
|
+
#设置群头衔
|
|
333
|
+
async def set_group_special_title(self, group_id: int, user_id: int, special_title: str = " "):
|
|
334
|
+
params = {
|
|
335
|
+
"group_id": group_id,
|
|
336
|
+
"user_id": user_id,
|
|
337
|
+
"special_title": special_title
|
|
338
|
+
}
|
|
339
|
+
callback = await self._sendToServer("set_group_special_title", params)
|
|
340
|
+
return callback
|
|
341
|
+
#群荣誉
|
|
342
|
+
async def get_group_honor_info(self, group_id: int, type: Literal["all","talkative","performer","legend","strong_newbie","emotion"] = "all"):
|
|
343
|
+
params = {
|
|
344
|
+
"group_id": group_id,
|
|
345
|
+
"type": type
|
|
346
|
+
}
|
|
347
|
+
callback = await self._sendToServer("get_group_honor_info", params)
|
|
348
|
+
return callback
|
|
349
|
+
#获取群精华消息
|
|
350
|
+
async def get_essence_msg_list(self, group_id: int):
|
|
351
|
+
params = {
|
|
352
|
+
"group_id": group_id
|
|
353
|
+
}
|
|
354
|
+
callback = await self._sendToServer("get_essence_msg_list", params)
|
|
355
|
+
return callback
|
|
356
|
+
#设置群精华消息
|
|
357
|
+
async def get_essenset_essence_msgce_msg_list(self, message_id: int):
|
|
358
|
+
params = {
|
|
359
|
+
"message_id": message_id
|
|
360
|
+
}
|
|
361
|
+
callback = await self._sendToServer("set_essence_msg", params)
|
|
362
|
+
return callback
|
|
363
|
+
#删除群精华消息
|
|
364
|
+
async def delete_essence_msg(self, message_id: int):
|
|
365
|
+
params = {
|
|
366
|
+
"message_id": message_id
|
|
367
|
+
}
|
|
368
|
+
callback = await self._sendToServer("delete_essence_msg", params)
|
|
369
|
+
return callback
|
|
370
|
+
#获取群 @全体成员 剩余次数
|
|
371
|
+
async def get_group_at_all_remain(self, group_id: int):
|
|
372
|
+
params = {
|
|
373
|
+
"group_id": group_id
|
|
374
|
+
}
|
|
375
|
+
callback = await self._sendToServer("get_group_at_all_remain", params)
|
|
376
|
+
return callback
|
|
377
|
+
#发送群公告
|
|
378
|
+
async def send_group_notice(self, group_id: int, content: str = "默认公告测试", image: str = None):
|
|
379
|
+
params = {
|
|
380
|
+
"group_id": group_id,
|
|
381
|
+
"content": content,
|
|
382
|
+
"image": image
|
|
383
|
+
}
|
|
384
|
+
callback = await self._sendToServer("_send_group_notice", params)
|
|
385
|
+
return callback
|
|
386
|
+
#获取群公告
|
|
387
|
+
async def get_group_notice(self, group_id: int):
|
|
388
|
+
params = {
|
|
389
|
+
"group_id": group_id
|
|
390
|
+
}
|
|
391
|
+
callback = await self._sendToServer("_get_group_notice", params)
|
|
392
|
+
return callback
|
|
393
|
+
#群打卡
|
|
394
|
+
async def send_group_sign(self, group_id: int):
|
|
395
|
+
params = {
|
|
396
|
+
"group_id": group_id
|
|
397
|
+
}
|
|
398
|
+
callback = await self._sendToServer("send_group_sign", params)
|
|
399
|
+
return callback
|
|
400
|
+
#设置群消息接收方式
|
|
401
|
+
async def set_group_msg_mask(self, group_id: int, mask: Literal[1,2,3,4] = 1):
|
|
402
|
+
params = {
|
|
403
|
+
"group_id": group_id,
|
|
404
|
+
"mask": mask
|
|
405
|
+
}
|
|
406
|
+
callback = await self._sendToServer("set_group_msg_mask", params)
|
|
407
|
+
return callback
|
|
408
|
+
#设置群备注
|
|
409
|
+
async def set_group_remark(self, group_id: int, remark: str = " "):
|
|
410
|
+
params = {
|
|
411
|
+
"group_id": group_id,
|
|
412
|
+
"remark": remark
|
|
413
|
+
}
|
|
414
|
+
callback = await self._sendToServer("set_group_remark", params)
|
|
415
|
+
return callback
|
|
416
|
+
#获取已过滤的加群通知
|
|
417
|
+
async def get_group_ignore_add_request(self, group_id: int):
|
|
418
|
+
params = {
|
|
419
|
+
"group_id": group_id
|
|
420
|
+
}
|
|
421
|
+
callback = await self._sendToServer("get_group_ignore_add_request", params)
|
|
422
|
+
return callback
|
|
423
|
+
# ------消息----- #
|
|
424
|
+
#发送私聊消息
|
|
425
|
+
async def send_private_msg(self, user_id: int, message: Message):
|
|
426
|
+
params = {
|
|
427
|
+
"user_id": user_id,
|
|
428
|
+
"message": message.returnData()
|
|
429
|
+
}
|
|
430
|
+
callback = await self._sendToServer("send_private_msg", params)
|
|
431
|
+
return callback
|
|
432
|
+
#发送群聊消息
|
|
433
|
+
async def send_group_msg(self, group_id: int, message: Message):
|
|
434
|
+
params = {
|
|
435
|
+
"group_id": group_id,
|
|
436
|
+
"message": message.returnData()
|
|
437
|
+
}
|
|
438
|
+
callback = await self._sendToServer("send_group_msg", params)
|
|
439
|
+
return callback
|
|
440
|
+
#长连接接收消息
|
|
441
|
+
async def events(self):
|
|
442
|
+
params = {}
|
|
443
|
+
callback = await self._sendToServer("_events", params)
|
|
444
|
+
return callback
|
|
445
|
+
#转发单条好友消息
|
|
446
|
+
async def forward_friend_single_msg(self, message_id: int, user_id: int):
|
|
447
|
+
params = {
|
|
448
|
+
"message_id": message_id,
|
|
449
|
+
"user_id": user_id
|
|
450
|
+
}
|
|
451
|
+
callback = await self._sendToServer("forward_friend_single_msg", params)
|
|
452
|
+
return callback
|
|
453
|
+
#转发单条群消息
|
|
454
|
+
async def forward_group_single_msg(self, message_id: int, group_id: int):
|
|
455
|
+
params = {
|
|
456
|
+
"message_id": message_id,
|
|
457
|
+
"group_id": group_id
|
|
458
|
+
}
|
|
459
|
+
callback = await self._sendToServer("forward_group_single_msg", params)
|
|
460
|
+
return callback
|
|
461
|
+
#获取消息详情
|
|
462
|
+
async def get_msg(self, message_id: int):
|
|
463
|
+
params = {
|
|
464
|
+
"message_id": message_id
|
|
465
|
+
}
|
|
466
|
+
callback = await self._sendToServer("get_msg", params)
|
|
467
|
+
return callback
|
|
468
|
+
#撤回消息
|
|
469
|
+
async def delete_msg(self, message_id: int):
|
|
470
|
+
params = {
|
|
471
|
+
"message_id": message_id
|
|
472
|
+
}
|
|
473
|
+
callback = await self._sendToServer("delete_msg", params)
|
|
474
|
+
return callback
|
|
475
|
+
#获取消息文件详情
|
|
476
|
+
async def get_file(self, file: str):
|
|
477
|
+
params = {
|
|
478
|
+
"file": file
|
|
479
|
+
}
|
|
480
|
+
callback = await self._sendToServer("get_file", params)
|
|
481
|
+
return callback
|
|
482
|
+
#获取消息图片详情
|
|
483
|
+
async def get_image(self, file: str):
|
|
484
|
+
params = {
|
|
485
|
+
"file": file
|
|
486
|
+
}
|
|
487
|
+
callback = await self._sendToServer("get_image", params)
|
|
488
|
+
return callback
|
|
489
|
+
#获取消息语音详情
|
|
490
|
+
async def get_record(self, file: str, out_format: str = "mp3"):
|
|
491
|
+
params = {
|
|
492
|
+
"file": file,
|
|
493
|
+
"out_format": out_format
|
|
494
|
+
}
|
|
495
|
+
callback = await self._sendToServer("get_record", params)
|
|
496
|
+
return callback
|
|
497
|
+
#表情回应消息
|
|
498
|
+
async def set_msg_emoji_like(self, message_id: int, emoji_id: int):
|
|
499
|
+
params = {
|
|
500
|
+
"message_id": message_id,
|
|
501
|
+
"emoji_id": emoji_id
|
|
502
|
+
}
|
|
503
|
+
callback = await self._sendToServer("set_msg_emoji_like", params)
|
|
504
|
+
return callback
|
|
505
|
+
#取消消息表情回应
|
|
506
|
+
async def unset_msg_emoji_like(self, message_id: int, emoji_id: int):
|
|
507
|
+
params = {
|
|
508
|
+
"message_id": message_id,
|
|
509
|
+
"emoji_id": emoji_id
|
|
510
|
+
}
|
|
511
|
+
callback = await self._sendToServer("unset_msg_emoji_like", params)
|
|
512
|
+
return callback
|
|
513
|
+
#获取好友历史消息记录
|
|
514
|
+
async def get_friend_msg_history(self, user_id: int, message_seq: int = 0, count: int = 20):
|
|
515
|
+
params = {
|
|
516
|
+
"user_id": user_id,
|
|
517
|
+
"message_seq": message_seq,
|
|
518
|
+
"count": count
|
|
519
|
+
}
|
|
520
|
+
callback = await self._sendToServer("get_friend_msg_history", params)
|
|
521
|
+
return callback
|
|
522
|
+
#获取群历史消息
|
|
523
|
+
async def get_group_msg_history(self, group_id: int, message_seq: int = 0, count: int = 20):
|
|
524
|
+
params = {
|
|
525
|
+
"group_id": group_id,
|
|
526
|
+
"message_seq": message_seq,
|
|
527
|
+
"count": count
|
|
528
|
+
}
|
|
529
|
+
callback = await self._sendToServer("get_group_msg_history", params)
|
|
530
|
+
return callback
|
|
531
|
+
#获取转发消息详情
|
|
532
|
+
async def get_forward_msg(self, message_id: str):
|
|
533
|
+
params = {
|
|
534
|
+
"message_id": message_id
|
|
535
|
+
}
|
|
536
|
+
callback = await self._sendToServer("get_forward_msg", params)
|
|
537
|
+
return callback
|
|
538
|
+
#标记消息已读
|
|
539
|
+
async def mark_msg_as_read(self, message_id: int):
|
|
540
|
+
params = {
|
|
541
|
+
"message_id": message_id
|
|
542
|
+
}
|
|
543
|
+
callback = await self._sendToServer("mark_msg_as_read", params)
|
|
544
|
+
return callback
|
|
545
|
+
#语音消息转文字
|
|
546
|
+
async def voice_msg_to_text(self, message_id: int):
|
|
547
|
+
params = {
|
|
548
|
+
"message_id": message_id
|
|
549
|
+
}
|
|
550
|
+
callback = await self._sendToServer("voice_msg_to_text", params)
|
|
551
|
+
return callback
|
|
552
|
+
#发送群 Ai 语音
|
|
553
|
+
async def send_group_ai_record(self, character: str, group_id: int, text: str):
|
|
554
|
+
params = {
|
|
555
|
+
"character": character,
|
|
556
|
+
"group_id": group_id,
|
|
557
|
+
"text": text
|
|
558
|
+
}
|
|
559
|
+
callback = await self._sendToServer("send_group_ai_record", params)
|
|
560
|
+
return callback
|
|
561
|
+
#回复指定信息
|
|
562
|
+
async def reply_to_message(self, getMessage, sendMessage):
|
|
563
|
+
try:
|
|
564
|
+
group_id = getMessage["group_id"]
|
|
565
|
+
user_id = getMessage["user_id"]
|
|
566
|
+
message_id = getMessage["message_id"]
|
|
567
|
+
msg = MessageChain([ReplyMessage(message_id), AtMessage(user_id), " "])
|
|
568
|
+
msg.add(sendMessage)
|
|
569
|
+
callback = await self.send_group_msg(group_id, msg)
|
|
570
|
+
except:
|
|
571
|
+
user_id = getMessage["user_id"]
|
|
572
|
+
message_id = getMessage["message_id"]
|
|
573
|
+
msg = MessageChain([ReplyMessage(message_id), " "])
|
|
574
|
+
msg.add(sendMessage)
|
|
575
|
+
callback = await self.send_private_msg(user_id, msg)
|
|
576
|
+
return callback
|
|
577
|
+
# ------文件----- #
|
|
578
|
+
#上传群文件
|
|
579
|
+
async def upload_group_file(self, group_id: int, file: str, name: str):
|
|
580
|
+
params = {
|
|
581
|
+
"group_id": group_id,
|
|
582
|
+
"file": file,
|
|
583
|
+
"name": name
|
|
584
|
+
}
|
|
585
|
+
callback = await self._sendToServer("upload_group_file", params)
|
|
586
|
+
return callback
|
|
587
|
+
#删除群文件
|
|
588
|
+
async def delete_group_file(self, group_id: int, file_id: str):
|
|
589
|
+
params = {
|
|
590
|
+
"group_id": group_id,
|
|
591
|
+
"file_id": file_id
|
|
592
|
+
}
|
|
593
|
+
callback = await self._sendToServer("delete_group_file", params)
|
|
594
|
+
return callback
|
|
595
|
+
#移动群文件
|
|
596
|
+
async def move_group_file(self, group_id: int, file_id: str, parent_directory: str, target_directory: str):
|
|
597
|
+
params = {
|
|
598
|
+
"group_id": group_id,
|
|
599
|
+
"file_id": file_id,
|
|
600
|
+
"parent_directory": parent_directory,
|
|
601
|
+
"target_directory": target_directory
|
|
602
|
+
}
|
|
603
|
+
callback = await self._sendToServer("move_group_file", params)
|
|
604
|
+
return callback
|
|
605
|
+
#创建群文件文件夹
|
|
606
|
+
async def create_group_file_folder(self, group_id: int, name: str):
|
|
607
|
+
params = {
|
|
608
|
+
"group_id": group_id,
|
|
609
|
+
"name": name
|
|
610
|
+
}
|
|
611
|
+
callback = await self._sendToServer("create_group_file_folder", params)
|
|
612
|
+
return callback
|
|
613
|
+
#删除群文件文件夹
|
|
614
|
+
async def delete_group_folder(self, group_id: int, folder_id: str):
|
|
615
|
+
params = {
|
|
616
|
+
"group_id": group_id,
|
|
617
|
+
"folder_id": folder_id
|
|
618
|
+
}
|
|
619
|
+
callback = await self._sendToServer("delete_group_folder", params)
|
|
620
|
+
return callback
|
|
621
|
+
#获取群文件系统信息
|
|
622
|
+
async def get_group_file_system_info(self, group_id: int):
|
|
623
|
+
params = {
|
|
624
|
+
"group_id": group_id
|
|
625
|
+
}
|
|
626
|
+
callback = await self._sendToServer("get_group_file_system_info", params)
|
|
627
|
+
return callback
|
|
628
|
+
#获取群根目录文件列表
|
|
629
|
+
async def get_group_root_files(self, group_id: int):
|
|
630
|
+
params = {
|
|
631
|
+
"group_id": group_id
|
|
632
|
+
}
|
|
633
|
+
callback = await self._sendToServer("get_group_root_files", params)
|
|
634
|
+
return callback
|
|
635
|
+
#获取群子目录文件列表
|
|
636
|
+
async def get_group_files_by_folder(self, group_id: int, folder_id: str):
|
|
637
|
+
params = {
|
|
638
|
+
"group_id": group_id,
|
|
639
|
+
"folder_id": folder_id
|
|
640
|
+
}
|
|
641
|
+
callback = await self._sendToServer("get_group_files_by_folder", params)
|
|
642
|
+
return callback
|
|
643
|
+
#重命名群文件文件夹名
|
|
644
|
+
async def rename_group_file_folder(self, group_id: int, folder_id: str, new_folder_name: str):
|
|
645
|
+
params = {
|
|
646
|
+
"group_id": group_id,
|
|
647
|
+
"folder_id": folder_id,
|
|
648
|
+
"new_folder_name": new_folder_name
|
|
649
|
+
}
|
|
650
|
+
callback = await self._sendToServer("rename_group_file_folder", params)
|
|
651
|
+
return callback
|
|
652
|
+
#获取群文件资源链接
|
|
653
|
+
async def get_group_file_url(self, group_id: int, folder_id: str):
|
|
654
|
+
params = {
|
|
655
|
+
"group_id": group_id,
|
|
656
|
+
"folder_id": folder_id
|
|
657
|
+
}
|
|
658
|
+
callback = await self._sendToServer("get_group_file_url", params)
|
|
659
|
+
return callback
|
|
660
|
+
#获取私聊文件资源链接
|
|
661
|
+
async def get_private_file_url(self, file_id: str, user_id: int):
|
|
662
|
+
params = {
|
|
663
|
+
"file_id": file_id,
|
|
664
|
+
"user_id": user_id
|
|
665
|
+
}
|
|
666
|
+
callback = await self._sendToServer("get_private_file_url", params)
|
|
667
|
+
return callback
|
|
668
|
+
#上传私聊文件
|
|
669
|
+
async def upload_private_file(self, user_id: int, file: str, name: str):
|
|
670
|
+
params = {
|
|
671
|
+
"user_id": user_id,
|
|
672
|
+
"file": file,
|
|
673
|
+
"name": name
|
|
674
|
+
}
|
|
675
|
+
callback = await self._sendToServer("upload_private_file", params)
|
|
676
|
+
return callback
|
|
677
|
+
#上传闪传文件
|
|
678
|
+
async def upload_flash_file(self, title: str, paths: list[str]):
|
|
679
|
+
params = {
|
|
680
|
+
"title": title,
|
|
681
|
+
"paths": paths
|
|
682
|
+
}
|
|
683
|
+
callback = await self._sendToServer("upload_flash_file", params)
|
|
684
|
+
return callback
|
|
685
|
+
#下载闪传文件
|
|
686
|
+
async def download_flash_file(self, share_link: str):
|
|
687
|
+
params = {
|
|
688
|
+
"share_link": share_link
|
|
689
|
+
}
|
|
690
|
+
callback = await self._sendToServer("download_flash_file", params)
|
|
691
|
+
return callback
|
|
692
|
+
#获取闪传文件详情
|
|
693
|
+
async def get_flash_file_info(self, share_link: str):
|
|
694
|
+
params = {
|
|
695
|
+
"share_link": share_link
|
|
696
|
+
}
|
|
697
|
+
callback = await self._sendToServer("get_flash_file_info", params)
|
|
698
|
+
return callback
|
|
699
|
+
#下载文件到缓存目录
|
|
700
|
+
async def download_file(self, url: str, name: str, headers: list[str]):
|
|
701
|
+
params = {
|
|
702
|
+
"url": url,
|
|
703
|
+
"name": name,
|
|
704
|
+
"headers": headers
|
|
705
|
+
}
|
|
706
|
+
callback = await self._sendToServer("download_file", params)
|
|
707
|
+
return callback
|
|
708
|
+
#
|
|
709
|
+
#获取登录号信息
|
|
710
|
+
async def get_login_info(self):
|
|
711
|
+
callback = await self._sendToServer("get_login_info", {})
|
|
712
|
+
self.botAcc = callback["data"]["user_id"]
|
|
713
|
+
self.nickname = callback["data"]["nickname"]
|
|
714
|
+
self.botName.append(self.nickname)
|
|
715
|
+
return callback
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
from .OneBot import OneBot
|
|
2
|
+
from .MessageType import Message, TextMessage, ReplyMessage, ImageMessage, EmojiMessage, RecordMessage, VideoMessage, DiceMessage, RPSMessage, QQMusicMessage, Music163Message, CustomMusicMessage, PrivateCardMessage, PrivateCardMessage, AtMessage, MessageChain
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: OneBotConnecter
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 基于websocket(服务器正向)连接的onebot11通用python接口
|
|
5
|
+
Author-email: Sugar51243 <1733682365@qq.com>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2025 Sugar51243
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/Sugar51243/OneBotConnecter
|
|
29
|
+
Project-URL: Issues, https://github.com/Sugar51243/OneBotConnecter/issues
|
|
30
|
+
Classifier: Programming Language :: Python :: 3
|
|
31
|
+
Classifier: Operating System :: OS Independent
|
|
32
|
+
Requires-Python: >=3.9
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
License-File: LICENSE
|
|
35
|
+
Dynamic: license-file
|
|
36
|
+
|
|
37
|
+
# OneBotConnecter
|
|
38
|
+
本项目为onebot协议的非官方python整合, 允许用户快捷连接ws服务器,并收发信息。<br>
|
|
39
|
+
本项目基于ll2接口开发。理论上面对其他基于onebot-11协议的接口同样可以运行,但是毕竟没实际测试过,本人不担保可以100%顺利运行。
|
|
40
|
+
|
|
41
|
+
### !!!!!!
|
|
42
|
+
项目本身不包括任何机器人接口,请自行安装支持onebot协议的机器人接口并完成登录,再运行本项目!!!
|
|
43
|
+
|
|
44
|
+
## 项目结构
|
|
45
|
+
项目本身仅包括两个文件,OneBot.py及MessageType.py。<br>
|
|
46
|
+
OneBot负责服务器的直接连接及信息的IO处理。<br>
|
|
47
|
+
MessageType负责信息发送的数据包构造。<br>
|
|
48
|
+
换而言之,需要 查询/修改 对服务器直接交互或信息收集行为的情况下,请直接查询或修改 [OneBot.py](https://github.com/Sugar51243/OneBotConnecter/blob/main/OneBotConnecter/OneBot.py)。需要 查询/修改 向服务器发送的数据包内容或格式,请直接查询或修改 [MessageType.py](https://github.com/Sugar51243/OneBotConnecter/blob/main/OneBotConnecter/MessageType.py)。
|
|
49
|
+
|
|
50
|
+
## 使用教程
|
|
51
|
+
本项目基于python异步运行,请确保asyncio库已被引入。<br>
|
|
52
|
+
使用方法很简单:<br>
|
|
53
|
+
1.构造收集到信息时需要运行的脚本函数,填入参数为(机器人本体bot, 信息数据包message)<br>
|
|
54
|
+
2.通过本库创建OneBot对象并填入机器人基本信息,填入参数为(服务器地址, 管理员id, 机器人别称)<br>
|
|
55
|
+
3.运行对象的run函数,并填入1步骤的脚本函数为参数,开始连接并监听服务器推送<br>
|
|
56
|
+
具体可参考本项目的[example文件](https://github.com/Sugar51243/OneBotConnecter/blob/main/examples/test.py),个人认为已经写得很清楚了。
|
|
57
|
+
|
|
58
|
+
## 安装
|
|
59
|
+
`pip install git+https://github.com/sugar51243/OneBotConnecter.git`
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
src/OneBotConnecter/MessageType.py
|
|
5
|
+
src/OneBotConnecter/OneBot.py
|
|
6
|
+
src/OneBotConnecter/__init__.py
|
|
7
|
+
src/OneBotConnecter.egg-info/PKG-INFO
|
|
8
|
+
src/OneBotConnecter.egg-info/SOURCES.txt
|
|
9
|
+
src/OneBotConnecter.egg-info/dependency_links.txt
|
|
10
|
+
src/OneBotConnecter.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
OneBotConnecter
|