【Re:从零开始的QQ机器人搭建】—— 基于go-cqhttp

警告:小心智械危机(

前言

之前酷Q用的好好的,谁知道刚打完工会战不到2天tx就封了大部分机器人。所幸小部分有生力量保留了下来,必可活用于下次机器人搭建。

一、准备工作

你需要准备的只有两样东西:go-cqhttp Python 环境
实际上不止python,任何语言都可搭建后台,本文仅使用python举例子

1.快速上手go-cqhttp

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

如果能自己看懂官方文档是最好,不过鉴于笔者在搭建的时候看的有点云里雾里,还是详细写下来吧。

heartbeat:
  disabled: false # 是否开启心跳事件上报
  # 心跳频率, 单位秒
  # -1 为关闭心跳
  interval: 5
servers:
  # HTTP 通信设置
  - http:
      # 是否关闭正向HTTP服务器
      disabled: false
      # 服务端监听地址,用来收QQ信息,可自己设置其它地址
      host: 127.0.0.1
      # 服务端监听端口,用来收QQ信息,可自己设置其它端口
      port: 5700
      # 反向HTTP超时时间, 单位秒
      # 最小值为5,小于5将会忽略本项设置
      timeout: 5
      middlewares:
        <<: *default # 引用默认中间件
      # 反向HTTP POST地址列表
      post:
        - url: '127.0.0.1:8000' # 这个url用来发送信息,可自己设置其它地址
          secret: ''           # 密钥不要写,就这样空着

2.编程环境配置

post/get
二、HalloWorld(

下面来试着让机器人运作起来
监听端口使用Python 作为编程语言,其他语言原理差不多,可根据自己的需求来调整代码。

首先我们来看一下机器人的运作原理
先双击运行 go-cqhttp.exe(其实更好的方法是通过命令行运行 go-cqhttp,如下图,强烈建议这么做),出现下图的情景就说明机器人运行成功了
在这里插入图片描述
当有人对机器人发信息,或者在机器人所在的群里发信息的时候,机器人就会捕获信息和对应数据,我们来看看机器人传给我们的数据格式

本段是群聊信息的格式
{
    'anonymous': None,
    'font': 0,
    'group_id': , 这里显示群号
    'message': 'setu', 这里显示信息,本条信息为“setu”
    'message_id': -1345471362, 信息id,可用来撤回对应信息
    'message_seq': 474313, 
    'message_type': 'group', 信息类型,这里显示是群聊信息
    'post_type': 'message',
    'raw_message': 'setu',这里显示原始信息,本条信息为“setu”,以后分析数据的时候直接分析这里就行
    'self_id': 3161879130,
    'sender': {
        'age': 0,
        'area': '',
        'card': '', 信息发送者的群名片
        'level': '',
        'nickname': '', 信息发送者的QQ昵称
        'role': 'admin',
        'sex': 'unknown',
        'title': '', 信息发送者的群头衔
        'user_id':  信息发送者的QQ号码
    },
    'sub_type': 'normal',
    'time': 1619686099,
    'user_id': 信息发送者的QQ号码
}
本段是私聊信息的格式
{
    'font': 0,
    'message': 'setu',这里显示信息,本条信息为“setu”
    'message_id': -1964103618,信息id,可用来撤回对应信息
    'message_type': 'private',信息类型,这里显示是私聊信息
    'post_type': 'message',
    'raw_message': 'setu',这里显示原始信息,以后分析数据的时候直接分析这里就行
    'self_id': 3161879130,
    'sender': {
        'age': 0,
        'nickname': '',信息发送者的QQ昵称
        'sex': 'unknown',
        'user_id':  信息发送者的QQ号码
    },
    'sub_type': 'friend',信息发送者的分组,这里显示在“朋友”分组
    'target_id': , 目标QQ号码,就是你机器人的Q号
    'time': 1619687022,时间戳,不用管
    'user_id':  信息发送者的QQ号码
}

接着我们来创建两个py文件
第一个py文件(随便取什么名字),搭建一个微型服务器,用来监听和分析收到的信息

from flask import Flask, request

'''注意,这里的import api是另一个py文件,下文会提及'''
import api

app = Flask(__name__)

'''监听端口,获取QQ信息'''
@app.route('/', methods=["POST"])
def post_data():
	'下面的request.get_json().get......是用来获取关键字的值用的,关键字参考上面代码段的数据格式'
	if request.get_json().get('message_type')=='private':# 如果是私聊信息		
    	uid = request.get_json().get('sender').get('user_id') # 获取信息发送者的 QQ号码
    	message = request.get_json().get('raw_message') # 获取原始信息
    	api.keyword(message, uid) # 将 Q号和原始信息传到我们的后台
    if request.get_json().get('message_type')=='group':# 如果是群聊信息
    	gid = request.get_json().get('group_id') # 获取群号
    	uid = request.get_json().get('sender').get('user_id') # 获取信息发送者的 QQ号码
    	message = request.get_json().get('raw_message') # 获取原始信息
    	api.keyword(message, uid, gid) # 将 Q号和原始信息传到我们的后台
    	
    return 'OK'


if __name__ == '__main__':
    app.run(debug=True, host='127.0.0.1', port=8000)# 此处的 host和 port对应上面 yml文件的设置

api.py300英雄团分查询随机涩图向对应网址发送请求
import json

import requests
import re
import random

'下面这个函数用来判断信息开头的几个字是否为关键词'
'如果是关键词则触发对应功能,群号默认为空'
def keyword(message, uid, gid = None):
    if message[0:3] == '300': # 300查团分, 格式为300+游戏名称,如 “300yaq”
        return zhanji(uid, gid, message[3:len(message)])
    if message[0:4] == 'setu': # 你们懂的
        setu()


def zhanji(uid, gid, name):

	'本功能参考300英雄官方api文档写成'
	'有不理解的地方可以看看https://300report.jumpw.com/static/doc/openapi.txt'
	
    url = 'https://300report.jumpw.com/api/getrole?name=' + name
    menu = requests.get(url)
    for i in menu.json()['Rank']:
        if i['RankName'] == '团队实力排行':
            tuanfen = i['Value']
    if gid != None: # 如果是群聊信息
    	requests.get(url='http://127.0.0.1:5700/send_group_msg?group_id={0}&message={1}团分{2}'.format(gid, name, tuanfen))
   	else: # 如果是私聊信息
   		requests.get(url='http://127.0.0.1:5700/send_private_msg?user_id={0}&message={1}团分{2}'.format(uid, name, tuanfen))

''
def setu(): 
	'本功能放在下面讲,这里的功能默认只有群聊,没考虑私聊,请把机器人拉进群再发消息'
	'如果想实现私聊功能可以参考上面查战绩的代码'
    key = ''
    url = 'https://api.lolicon.app/setu?apikey=' + key + r'&size1200=true'
    menu = requests.get(url)
    setu_url = menu.json()['data'][0]['url'] # 对传回来的涩图网址进行数据提取
    requests.get(url='http://127.0.0.1:5700/send_group_msg?group_id={0}&message={1}'.format(gid, r'[CQ:image,' r'file=' + str(setu_url) + r']'))
cq码
key = ''

这里的key要去申请,请参考官方文档,以下为可能遇到的问题:

/start/key = ''

至于下面这行代码

requests.get(url='http://127.0.0.1:5700/send_group_msg?group_id={0}&message={1}'.format(gid, r'[CQ:image,' r'file=' + str(setu_url) + r']'))
message=cq码cq码message=发送图片
[CQ:image,file=]r'[CQ:image,' r'file=' + str(setu_url) + r']'

下面是演示
在这里插入图片描述
至此,基本功能原理大概都讲清楚了,读者可根据自己的喜好后续添加各种喜欢的api(比如祖安宝典,查天气,抽卡等等),希望有更多的QQ机器人开发者参与进来,也希望本教程能为你的机器人开发尽一份绵薄之力。如遇问题可在下方评论区留言。