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.
@@ -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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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
+ OneBotConnecter