Go-CqHttp是一款完全免费的QQ机器人框架,基于OneBot协议,它可以抓取QQ消息数据包并返回json格式的数据,可以根据群内消息或CQ码判断并用Python、Java等语言回复

下载地址:https://github.com/Mrs4s/go-cqhttp。开源协议:AGPL-3.0 license

[warning]此机器人仅作为学习使用,请勿使用机器人进行如刷屏广告、辱骂他人等违背中华人民共和国和香港特别行政区法律法规的行为,如发生,造成的情况、责任与作者无关[/warning]

1.安装

官方文档:https://docs.go-cqhttp.org/guide/#go-cqhttp

Go-CqHttp安装比较简单,首先到Github项目里下载主程序,最好下载最新版

这篇文章以windows系统为例。

安装好后,不要直接打开,在当前路径下打开CMD窗口,输入文件名打开

选择完毕后,看到“默认配置文件已生成,请修改 config.yml 后重新启动!”按下Ctrl+C退出

在与程序同目录下会生成一个config.yml配置文件,可以用记事本打开

然后主要修改红框标注位置就行

完成之后保存,再次在CMD内运行主程序

密码登录

当看到:网络诊断完成. 未发现问题,代表完成登录。可以用小号给登录机器人的账号发消息测试是否成功登录

如果发生:登录失败、限制登陆等问题,可以尝试先用扫码登录登录后再尝试密码登录

扫码登录

扫码登陆需要在device.json里将协议设置为手表协议

当看到:网络诊断完成. 未发现问题,代表完成登录。可以用小号给登录机器人的账号发消息测试是否成功登录

2.发送对接

以上都完成后,下面就是接入了

再次打开config.yml,翻到最底下一般来说有预留的配置文件,但是测试了几次之后发现有可能不会正常生成

我就拿一个完整的配置文件给大家做样例了

地址根据实际情况填写,本地就填127.0.0.1,端口需要记住

servers:
  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
  #- http: # http 通信
  #- ws:   # 正向 Websocket
  #- ws-reverse: # 反向 Websocket
  #- pprof: #性能分析服务器

  - http: # HTTP 通信设置
      address: 0.0.0.0:5700 # HTTP监听地址
      version: 11     # OneBot协议版本, 支持 11/12
      timeout: 5      # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
      long-polling:   # 长轮询拓展
        enabled: false       # 是否开启
        max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
      middlewares:
        <<: *default # 引用默认中间件
      post:           # 反向HTTP POST地址列表
      - url: http://127.0.0.1:5701/ # 地址
        #secret: ''                  # 密钥
        max-retries: 10             # 最大重试,0 时禁用
        retries-interval: 1000      # 重试时间,单位毫秒,0 时立即

再次运行,使用浏览器访问:http://127.0.0.1:5700/send_msg?message_type=private&user_id=测试QQ号&message=%E6%B5%8B%E8%AF%95123456,将“测试QQ号”替换成小号的QQ号,然后看是否发送了一条消息给小号

测试成功后就可以进行回报对接了

3.回报对接

对接本文章用的是Python-Flask,当然也可以用其他的语言对接

首先,我们先按照如图创建一个Flask项目:

from flask import Flask,request

app = Flask(__name__)


@app.route('/',methods=['POST'])
def hello_world():
    return 'Hello World!'
if __name__ == '__main__':
    app.run(host='127.0.0.1',port=5701)

允许协议需要包含POST协议,运行端口需要跟配置文件里的相同。

然后可以定义一个send()方法

import requests as req
def send(msg:str,id:int,type:str):
    if type=='sl':
        data = {'message_type': 'private',
                'user_id': id,
                'message': msg
                }
        res = req.post('http://127.0.0.1:5700/send_msg', json=data)
        if res.status_code==200:
            print('发送成功:'+msg+','+str(id)+'-Private')
    else:
        data = {'message_type': 'group',
                'group_id': id,
                'message': msg
                }
        res = req.post('http://127.0.0.1:5700/send_msg', json=data)
        if res.status_code==200:
            print('发送成功:'+msg+','+str(id)+'-Group')

"http://127.0.0.1:5700/"需要跟配置文件的adress监听地址相同,send_msg不变

参考:https://docs.go-cqhttp.org/

这样一个发送方法就完成了,然后获取POST回报Json的数据

需要用到request模块(from flask import request)

dataraw=request.get_json()
print(dataraw)

dataraw就是取到的json数据,为字典格式,可以直接取数据

下面列举几种常见的回报数据,可以根据post_type判断回报数据类型:

心跳包:

{'post_type': 'meta_event', 'meta_event_type': 'heartbeat', 'time': 1683272941, 'self_id': 3239858968, 'status': {'app_enabled': True, 'app_good': True, 'app_initialized': True, 'good': True, 'online': True, 'plugins_good': None, 'stat': {'packet_received': 281, 'packet_sent': 273, 'packet_lost': 0, 'message_received': 0, 'message_sent': 0, 'disconnect_times': 0, 'lost_times': 0, 'last_message_time': 0}}, 'interval': 5000}

消息(群聊内):

{'post_type': 'message', 'message_type': 'group', 'time': 1683273003, 'self_id': 3239858968, 'sub_type': 'normal', 'group_id': 657497883, 'message_seq': 1210, 'raw_message': '11111', 'message_id': 1202351978, 'user_id': 1651766989, 'anonymous': None, 'font': 0, 'message': '11111', 'sender': {'age': 0, 'area': '', 'card': '', 'level': '', 'nickname': 'Lonic', 'role': 'member', 'sex': 'unknown', 'title': '', 'user_id': 1651766989}}

消息(私聊):

{'post_type': 'meta_event', 'meta_event_type': 'heartbeat', 'time': 1683273046, 'self_id': 3239858968, 'status': {'app_enabled': True, 'app_good': True, 'app_initialized': True, 'good': True, 'online': True, 'plugins_good': None, 'stat': {'packet_received': 289, 'packet_sent': 279, 'packet_lost': 0, 'message_received': 2, 'message_sent': 0, 'disconnect_times': 0, 'lost_times': 0, 'last_message_time': 1683273046}}, 'interval': 5000}

主要就看post_type、message_type以及message就行。

3.样例

from flask import Flask,request
import requests as req
app = Flask(__name__)

def send(msg:str,id:int,type:str):
    if type=='sl':
        data = {'message_type': 'private',
                'user_id': id,
                'message': msg
                }
        res = req.post('http://127.0.0.1:5700/send_msg', json=data)
        if res.status_code==200:
            print('发送成功:'+msg+','+str(id)+'-Private')
    else:
        data = {'message_type': 'group',
                'group_id': id,
                'message': msg
                }
        res = req.post('http://127.0.0.1:5700/send_msg', json=data)
        if res.status_code==200:
            print('发送成功:'+msg+','+str(id)+'-Group')

@app.route('/',methods=['POST'])
def hello_world():
    dataraw=request.get_json()
    if dataraw['post_type']=='message':
        if dataraw['message'].find('你好')!=-1:
            if dataraw['message_type']=='private':
                send('你好!',dataraw['user_id'],'sl')
            else:
                send('你好!',dataraw['group_id'],'grp')

    print(dataraw)
    return 'Hello World!'
if __name__ == '__main__':
    app.run(host='127.0.0.1',port=5701)

这段代码作用是当收到消息带有关键词:你好 的时候自动回复:你好!

4.CQ-Code

官方文档:https://docs.go-cqhttp.org/cqcode/

样例:

发送图片:[CQ:image,file=http://baidu.com/1.jpg,type=flash]

type参数:flash闪图,show:修图,不写默认普通图片

@某人:[CQ:at,qq=1145141919810]

剩下的可以通过将图片或表情包发给机器人,再从后台获得对应的CQcode

5.完成

Go-CqHttp还有很多好玩的功能(定位,戳一戳等),可以在Go-CqHttp官网看到这些功能的介绍