使用shamrock在手机上搭建QQ机器人

前言

高考完了,终于有时间了,于是回来将自己的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': ''
    }
}

这样,就是正常的受到消息了,最基础的连接构建完毕。

(未完待续)

All posts

Other pages