QQ机器人

发布于 2022-08-27  1043 次阅读


AI 摘要

本篇文章介绍了如何使用QQ机器人,包括创建QQ账户、下载与配置、开发代码、签到功能以及数据存储与读取。在创建机器人时需要一个服务器,配置可参考教程,也可使用自己的QQ账户。通过Web Socket来获取json,提取用户发来的信息,执行签到代码。数据存储可使用json或SQLite,在实现签到板功能时需要保存用户昵称。

菜鸡开烂坑

成品:Lfhsheng/QQBot

可参考范例:sb-child/myqqbot

首先

条件

  • 创建一个QQ账户(最好),用自己的QQ账户也可以
  • 服务器(就是一台可以不关机能联网的电脑)
  • 肝(滑稽

下载与配置

根据这个教程下载适合你的版本。

打开一遍以生成config.yml,通信方式建议选择HTTP通信正向 Websocket 通信,毕竟可以直接复制粘贴代码

然后配置config.yml

第一次登录应该是需要验证的,一般就是拖滑条或者QQ扫码。

拖滑条相对简单一点,不过家用宽带不知为何会收不到Ticket,但服务器却可以。

拖滑条只需把链接复制到浏览器里,然后验证即可。

不过没关系,可以使用QQ扫码,得登录手机QQ

一切准备就绪以后,就可以编写代码了。

代码

pip uninstall -y websocket
pip install rel requests websocket-client

以下是一个复读机的例子:

import websocket
import json
import rel
import requests
def getMessage(ws,message):
    m = dict(json.loads(message))
    if m["post_type"] == "message":
        requests.get("http://127.0.0.1:5700/send_msg?user_id=&dmessage=%s" % (m["user_id"],m["message"]))
if name == "main":
    #websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://127.0.0.1:5701/",on_message=getMessage)
    ws.run_forever(dispatcher=rel) # Set dispatcher to automatic reconnection
    rel.signal(2, rel.abort) # Keyboard Interrupt
    rel.dispatch()

开发时可加入websocket.enableTrace(True),不过控制台会十分凌乱。

复读机的http端口为5700Web Socket端口为5701,可在config.yml配置。

原理

Web Socket会收到从go-cqhttp获取到的json信息,接着调用在websocket.WebSocketAppon_message定义的函数,建议加入websocket.enableTrace(True)以查看json

使用if是因为要过滤掉心跳功能产生的json

不过此复读机只适用于在与bot私聊时,在里就会报错了。

签到

有了这一些,一个能收消息和发消息的QQ机器人就已经成功一半了,接下来就是签到功能。

命令

通过Web Socket来获取json,接着再提取json中用户发来的信息,如果等于命令的话,那么就执行签到代码。

数据的存储

json比较方便用于存储数据,不过不大稳定,数据比较大的情况下建议使用SQLite,一种轻量的数据库,不过比较难。

读:

readJson = open(jsonPath, "r")
jsonDict = json.load(readJson)

写:

createJson = {"user": userList, "name": nameList,"count": countList, "day": dayList}
newJson = json.dumps(createJson)
openJson = open(jsonPath, "w")
openJson.write(newJson)
openJson.close()

数据的读取

createJson所示,我是把一个List保存到json中去的。

保存用户的name是因为我要做签到板功能,就是输出所有的签到人数与签到天数。

如果只需做签到功能,那么可以不保存name,使用json中的nickname即可。

读取时我只需要使用json模块,把json转换为Dict,然后再用四个变量分别保存usernamecountday所对应的列表即可。

对了,同一个用户在四个列表里的index都是一样的。