高考完了,终于有时间了,于是回来将自己的QQ机器人复活一下~
提前说明:我只是业余爱好者,不具备专业水平,只是为了做QQ机器人而学习了一点python,所以会出现各种错误。
首先,因为shamrock是基于XP框架的模块,所以需要先对QQ使用XP框架,这里不想太折腾,所以选用Lspatch。
Lspatch现在已经归档了,不过还是可以使用的。后继者有Npatch,不过我使用Npatch构建出的安装包并不能正常安装,于是用回了Lspatch。
当然,如果有直接的XP框架,就更好了。
网络上已经有很多Lspatch的教程了,这里就不多说。总之就是下载QQ的安装包,然后对其修补,如果没有什么额外需求的话,本地模式比较好一点。这里我使用的是9.0.60版本的QQ。在安卓14上成功运行了。而在安卓10上,我在一台手机上成功运行了,但是另一台又不可以。其他的版本没有进行过测试。
安装好修补后的QQ,和模块,勾选模块作用域之后登录,你应该可以在屏幕下方看见弹出一条提示框(叫做“吐司”),上面写着“加载shamrock库成功~”,这样就说明,你的准备工作已经完成了。
打开安装好的shamrock软件,这时屏幕下方的吐司上会提示“框架已激活”或者“框架未激活”。
已激活就可以跳过这一步,如果未激活的话,就试试去设置里强行停止QQ,然后重新打开。
我选择使用shamrock的被动websocket模式,因为简单()
双击“被动websocket”右侧的未配置,修改地址。这里,我修改成了“ws://127.0.0.1:9876”。
再向下,修改“接受资源群聊”,我改成自己创建的一个小群,虽然不知道这个是用来做什么的,但是姑且还是改一下,万一用到了呢。
上面两步完成时,应该会提示“动态推送配置文件成功”。
shamrock一侧的设定就完成了,现在进行后端的设定。
后端我使用qpython,因为简单()再加上之前写的nonebot2插件也是python,简单修改修改就可以用了。
安装,给定必要的权限,然后进入“扩展”那一栏,点击“pip客户端”
输入“pip install websockets”安装websockets模块。
按理来说,应该是可以直接使用nonebot2的,简单省事,但是因为nonebot2需要的依赖需要自行编译,导致无法安装,所以只好自己构建核心。
先创建一个这样的文件,看看情况:
import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
print(message)
asyncio.get_event_loop().run_until_complete(websockets.serve(echo, '127.0.0.1', 9876))
asyncio.get_event_loop().run_forever()
(在百度复制的websockets服务器端实例,做了一些修改)
现在,这个文件可以运行一个websockets服务端,来让客户端连接上,并不断打印出客户端发来的信息。
将这段代码在qpython中运行。然后现在转到shamrock一侧,打开“被动websockets”旁边的开关,然后重启QQ(即强行停止QQ,然后再打开)。
如果顺利的话,你可以在qpython那边的控制台里看到心跳包,或者是消息,它们分别长这样:
心跳包:
{
'time': (时间戳),
'self_id': (登录的QQ号)
'post_type': 'meta_event',
'meta_event_type': 'lifecycle', 'sub_type':'connect',
'status': {
'self': {
'platform': 'qq',
'user_id': (登录的QQ号)}
'online':True,
'good':True,
'qq.status': 正常'},
'interval': 15000
}
消息:
{
'time': 时间戳,
'self_id': 登录的QQ号,
'post_type': 'message',
'message_type': 'group',
'sub_type': 'normal',
'message_id': 消息id,
'group_id': 群号,
'peer_id': 登录的QQ号,
'user_id': 发送者的QQ号,
'message': [
{'data':
{'id': 消息id},
'type': 'reply'},
{'data':
{'text': '1'},
'type': 'text'}
],
'raw_message':'[CQ:reply,id=消息id]1',
'font': 0,
'sender': {
'user_id': QQ号,
'nickname': 'QQ昵称',
'card': '',
'role': 'member',
'title': '',
'level': ''
}
}
这样,就是正常的受到消息了,最基础的连接构建完毕。
(未完待续)