【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学

前言:
程序上云的服务器搭建步骤已经发布,大家可以移步至此查看:【0基础QQ机器人开发二】服务器篇

一、本文目的:

前段时间由于学习原因产生了一个自动化管理QQ群的需求,在我几天的努力之下,通过各种学习CV,终于实现了该需求,但是因为这个项目并不是很完美,里面有些许的bug,导致身为完美主义的我很快就将其弃用,等过了一段时间想将其完善一下的时候,发现之前在项目中所需要的知识已经忘得一干二净,因此有了这篇博客,这也是我在学习编程路上的一大痛点,因此,以后我会坚持发文,巩固学习,也希望大家可以互相监督,共同进步!!!

同时也可以为想要打造自己的QQ机器人的同学提供一点点经验.


二、实现历程:

有了需求之后,我便开始了我的面向百度编程,一开始想要通过web端QQ实现,结果突然想起web端qq已经停运,因此想要借助win32这个库,通过程序界面实现自动化,结果还是太年轻了,作为一个六边形小白,我连pywin32的库都看不太懂,因此继续面向百度编程,终于我在网上发现了不知道哪位大佬写的基于一个我也不知道的语言开发的框架基于go语言开发的框架go-cqhttp


三、开发过程

1.准备工作

搭建一个QQ机器人需要什么?

  • 一台windows电脑
  • 一台云服务器

我们需要准备go-cqhttp以及python环境,如果想要把机器人部署在服务器上可以去腾讯云买一个服务器,服务器相当于一个远程的电脑,由专人维护而且稳定性高,可以实现7*24小时的运行,有了云服务器即可实现QQ机器人24小时在线啦,所以推荐大家使用服务器运行,什么?都3202年了你还没有服务器!赶紧去腾讯云买一个,具体教程选购云服务器,下面就跟上我的步伐,let’s go!!!

1.cq-http的下载地址:Releases · Mrs4s/go-cqhttp (github.com)

友情提示:如果登录不上github,大家可以通过我的百度云连接下载,我提供了x86机器的windows版和linux版两个包

进去之后我们可以看到有众多版本可以选择,大家根据电脑选择即可
不管你部署在哪里,都必须要安装windows版本,这个具体原因后面再说。

  • 如果要部署在服务器,可以再服务器使用uanem -a查看机器的架构,一般服务器都是x86_64所以我们选择linux_amd64.deb的版本即可在这里插入图片描述

    • 如果要部署在windows可以点击show all 25 assets选择windows_amd64.zip即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sxqF87XX-1659249632172)(https://raw.githubusercontent.com/175603a/Figurebed/main/img/202207311305753.png)]
下载好后

  • 如果要在windows上进行部署,直接解压可以看到如下安装包,在这里插入图片描述

  • 如果要在linux服务器上进行部署,如果下载的是deb包,可以直接使用sudo dpkg -i go-cqhttp_1.1.0_adm64.deb即可安装成功

2. 运行
windows平台

再windows平台下直接打开解压好的压缩包,运行go-cqhttp.exe即可运行
可能会出现如下弹窗,点击仍要运行
在这里插入图片描述
一直点确定即可

在这里插入图片描述最后可以看到文件夹多出了一个.bat文件 双击运行
在这里插入图片描述
运行后选择0 回车再关掉窗口
在这里插入图片描述

可以看到又多出了一个config.yml文件,这是文件用来设置我们要登陆的qq号以及一些其他的配置信息,双击使用记事本打开在这里插入图片描述
在相应位置输入账号和密码
在这里插入图片描述
保存并关闭

重点来了!!!
电脑要和登录qq的手机处于同一局域网下,也就是连接同一个wifi
然后双击go-cqhttp.bat运行
未完待续。。。
一下内容为之前写的,版本有些老了

  • linux平台在安装好后直接输入命令go-cqhttp即可运行

第一次运行会生成一个config.yml文件,这个文件是用来配置我们要登录的qq号和密码以及一些其他配置的文件

  • windows平台直接双击使用记事本打开config.yml,在相应的位置输入你的qq号
  • linux平台需要使用文本编辑器来编辑文件。
2.python环境的配置

在linux服务器上安装python,一般服务器都会自带python开发环境


2.程序配置

1.将go-cqhttp解压之后出现会三个文件

在这里插入图片描述

我们双击go-cqhttp.exe文件

这时候会出现如下界面:

在这里插入图片描述

我们无脑确认就可以

2.这时候我们发现文件里多出了一个.bat文件在这里插入图片描述

.bat文件是批处理文件,我们可以通过运行.bat文件运行我们提前在里面写好的cmd命令

这时我们运行.bat文件,出现如下窗口

在这里插入图片描述

这里我们输入0再回车,选择HTTP通信

  1. 这时文件中又多出了一个config.yml文件

在这里插入图片描述

4.重点来了

这个配置文件就是一直让我出错,出bug的根源,这里是我配置好的,可以直接复制到你的.yml文件中用,只需要吧QQ账号和密码(密码为空时会使用扫码登陆)替换成你的即可(.yml文件可以直接用记事本打开)

这里说几个我认为比较重要的点:

  • heartbeat是心跳频率,貌似是用于防止腾讯把你踢下线的,不需要可以改为-1

  • 在这里插入图片描述
    5700端口是用于向服务器发送请求的端口

  • image-20220731134222408
    5701端口是用于监听返回的消息的端口

  • max-retries最好设置为0,因为第一次用的时候发现一条消息总是接收好几遍,原来是这个参数搞的鬼

以上两个端口如果跟你电脑使用的端口有重复可以进行修改,防止出问题

# go-cqhttp 默认配置文件

account: # 账号相关
  uin: 123456 # QQ账号
  password: '' # 密码为空时使用扫码登录
  encrypt: false  # 是否开启密码加密
  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
  relogin: # 重连设置
    delay: 3   # 首次重连延迟, 单位秒
    interval: 3   # 重连间隔
    max-times: 0  # 最大重连次数, 0为无限制

  # 是否使用服务器下发的新地址进行重连
  # 注意, 此设置可能导致在海外服务器上连接情况更差
  use-sso-address: true
  # 是否允许发送临时会话消息
  allow-temp-session: false

heartbeat:
  # 心跳频率, 单位秒
  # -1 为关闭心跳
  interval: 5

message:
  # 上报数据类型
  # 可选: string,array
  post-format: string
  # 是否忽略无效的CQ码, 如果为假将原样发送
  ignore-invalid-cqcode: false
  # 是否强制分片发送消息
  # 分片发送将会带来更快的速度
  # 但是兼容性会有些问题
  force-fragment: false
  # 是否将url分片发送
  fix-url: false
  # 下载图片等请求网络代理
  proxy-rewrite: ''
  # 是否上报自身消息
  report-self-message: false
  # 移除服务端的Reply附带的At
  remove-reply-at: false
  # 为Reply附加更多信息
  extra-reply-data: false
  # 跳过 Mime 扫描, 忽略错误数据
  skip-mime-scan: false

output:
  # 日志等级 trace,debug,info,warn,error
  log-level: warn
  # 日志时效 单位天. 超过这个时间之前的日志将会被自动删除. 设置为 0 表示永久保留.
  log-aging: 15
  # 是否在每次启动时强制创建全新的文件储存日志. 为 false 的情况下将会在上次启动时创建的日志文件续写
  log-force-new: true
  # 是否启用日志颜色
  log-colorful: true
  # 是否启用 DEBUG
  debug: false # 开启调试模式

# 默认中间件锚点
default-middlewares: &default
  # 访问密钥, 强烈推荐在公网的服务器设置
  access-token: ''
  # 事件过滤器文件目录
  filter: ''
  # API限速设置
  # 该设置为全局生效
  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
  # 目前该限速设置为令牌桶算法, 请参考:
  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
  rate-limit:
    enabled: false # 是否启用限速
    frequency: 1  # 令牌回复频率, 单位秒
    bucket: 1     # 令牌桶大小

database: # 数据库相关设置
  leveldb:
    # 是否启用内置leveldb数据库
    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable: true

  # 媒体文件缓存, 删除此项则使用缓存文件(旧版行为)
  cache:
    image: data/image.db
    video: data/video.db

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

  - http: # HTTP 通信设置
      address: 0.0.0.0:5700 # HTTP监听地址
      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: 0         # 最大重试,0 时禁用
      #  retries-interval: 1500 # 重试时间,单位毫秒,0 时立即
      #- url: http://127.0.0.1:5701/ # 地址
      #  secret: ''                  # 密钥
      #  max-retries: 10             # 最大重试,0 时禁用
      #  retries-interval: 1000      # 重试时间,单位毫秒,0 时立即

5.当我们配置好以后,运行go-cqhttp.bat文件,按照提示进行登陆即可

出现如下界面即表示登陆成功

在这里插入图片描述

3.python程序开发

在这里我先为大家提供简单的接收发送消息的代码以及一些官方文档中的API,等有时间有人看了我再上传一些自己写的代码

import requests
import socket
import json

ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ListenSocket.bind(('localhost', 5701))
ListenSocket.listen(100)

HttpResponseHeader = '''HTTP/1.1 200 OK
Content-Type: text/html
'''

def request_to_json(msg):
    for i in range(len(msg)):
        if msg[i]=="{" and msg[-1]=="}":
            return json.loads(msg[i:])
    return None


def rev_msg():
    Client, Address = ListenSocket.accept()
    Request = Client.recv(1024).decode(encoding='utf-8')
    # print(Request)
    rev_json=request_to_json(Request)
    Client.sendall((HttpResponseHeader).encode(encoding='utf-8'))
    Client.close()
    return rev_json


data = {
    'user_id': 123456,# QQ号
    'message': '你好',# 消息内容
    'auto_escape': False
}
cq_url = "http://127.0.0.1:5700/send_private_msg"
rev = requests.post(cq_url, data=data)
print(rev.url)

if __name__ == '__main__':
    print('============start==================')
    while True:
        rev_msg = rev_msg()
        user_id = rev_msg.setdefault('user_id')
        raw_message = rev_msg.setdefault('raw_message')
        print(f'您收到了来自{user_id}{raw_message}')

4.常用API

API功能
/send_private_msg发送私聊消息
/send_group_msg发送群消息
/send_msg发送消息
/delete_msg撤回信息
/set_group_kick群组踢人
/set_group_ban群组单人禁言
/set_group_whole_ban群组全员禁言
/set_group_admin群组设置管理员
/set_group_card设置群名片(群备注)
/set_group_name设置群名
/set_group_leave退出群组
/set_group_special_title设置群组专属头衔
/set_friend_add_request处理加好友请求
/set_group_add_request处理加群请求/邀请
/get_login_info获取登录号信息
/get_stranger_info获取陌生人信息
/get_friend_list获取好友列表
/get_group_info获取群信息
/get_group_list获取群列表
/get_group_member_info获取群成员信息
/get_group_member_list获取群成员列表
/get_group_honor_info获取群荣誉信息
/can_send_image检查是否可以发送图片
/can_send_record检查是否可以发送语音
/get_version_info获取版本信息
/set_restart重启 go-cqhttp
/.handle_quick_operation对事件执行快速操作
拓展 API 及与 OneBot 标准有略微差异的 API
拓展 API功能
/set_group_portrait设置群头像
/get_image获取图片信息
/get_msg获取消息
/get_forward_msg获取合并转发内容
/send_group_forward_msg发送合并转发(群)
/.get_word_slices获取中文分词
/.ocr_image

四、心得

1.本文中有些知识点我还没来得及写下来,等过段时间我再继续整理

2.有需求才会有动力,通过这次QQ机器人的需求,我学习了TCP/IP协议,socket网络编程,requests库,json库等等,在此过程中收获颇丰,相较于看视频学习和看书学习,这样边学边用的过程极大地提高了知识点的复用性和实用性,因此也建议大家可以采用这样的方式来学习!!!

3.由于本人小白一枚,文中的不足之处还请各位童鞋多多指出!栓Q!!!

4.喜欢本文的同学不妨点个关注,我会持续更新一些有趣的内容~~

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针到处飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值