文章目录
- 一、本文目的:
- 二、实现历程:
- 三、开发过程
- 1.准备工作
- 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https://github.com/Mrs4s/go-cqhttp/releases)
- 2.python环境的配置
- 2.程序配置
- 3.python程序开发
- 4.常用API
- 拓展 API 及与 OneBot 标准有略微差异的 API
- 四、心得
前言:
程序上云的服务器搭建步骤已经发布,大家可以移步至此查看:【0基础QQ机器人开发二】服务器篇
一、本文目的:
前段时间由于学习原因产生了一个自动化管理QQ群的需求,在我几天的努力之下,通过各种学习CV,终于实现了该需求,但是因为这个项目并不是很完美,里面有些许的bug,导致身为完美主义的我很快就将其弃用,等过了一段时间想将其完善一下的时候,发现之前在项目中所需要的知识已经忘得一干二净,因此有了这篇博客,这也是我在学习编程路上的一大痛点,因此,以后我会坚持发文,巩固学习,也希望大家可以互相监督,共同进步!!!
同时也可以为想要打造自己的QQ机器人的同学提供一点点经验.
二、实现历程:
有了需求之后,我便开始了我的面向百度编程,一开始想要通过web端QQ实现,结果突然想起web端qq已经停运,因此想要借助win32这个库,通过程序界面实现自动化,结果还是太年轻了,作为一个六边形小白,我连pywin32的库都看不太懂,因此继续面向百度编程,终于我在网上发现了不知道哪位大佬写的基于一个我也不知道的语言开发的框架go-cqhttp,但是不知为何网站打不开,大家自行试一下吧.
三、开发过程
1.准备工作
我们需要准备go-cqhttp以及python环境(基于windows下的python环境开发)
1.cq-http的下载地址:Releases · Mrs4s/go-cqhttp (github.com)
进去之后我们可以看到有众多版本可以选择,大家根据电脑选择即可:打开go-cqhttp_windows_amd64.zip进行下载
之后的解压不用我多说了吧
2.python环境的配置
Python环境配置教程(超详细图文版)_qq_35789981的博客-CSDN博客_python环境配置
2.程序配置
1.将go-cqhttp解压之后出现会三个文件
我们双击go-cqhttp.exe文件
这时候会出现如下界面:
我们无脑确认就可以
2.这时候我们发现文件里多出了一个.bat文件
.bat文件是批处理文件,我们可以通过运行.bat文件运行我们提前在里面写好的cmd命令
这时我们运行.bat文件,出现如下窗口
这里我们输入0再回车,选择HTTP通信
- 这时文件中又多出了一个config.yml文件
4.重点来了
这个配置文件就是一直让我出错,出bug的根源,这里是我配置好的,可以直接复制到你的.yml文件中用,只需要吧QQ账号和密码(密码为空时会使用扫码登陆)替换成你的即可(.yml文件可以直接用记事本打开)
这里说几个我认为比较重要的点:
-
heartbeat是心跳频率,貌似是用于防止腾讯把你踢下线的,不需要可以改为-1
-
5700端口是用于向服务器发送请求的端口 -
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: falseheartbeat:# 心跳频率, 单位秒# -1 为关闭心跳interval: 5message:# 上报数据类型# 可选: string,arraypost-format: string# 是否忽略无效的CQ码, 如果为假将原样发送ignore-invalid-cqcode: false# 是否强制分片发送消息# 分片发送将会带来更快的速度# 但是兼容性会有些问题force-fragment: false# 是否将url分片发送fix-url: false# 下载图片等请求网络代理proxy-rewrite: ''# 是否上报自身消息report-self-message: false# 移除服务端的Reply附带的Atremove-reply-at: false# 为Reply附加更多信息extra-reply-data: false# 跳过 Mime 扫描, 忽略错误数据skip-mime-scan: falseoutput:# 日志等级 trace,debug,info,warn,errorlog-level: warn# 日志时效 单位天. 超过这个时间之前的日志将会被自动删除. 设置为 0 表示永久保留.log-aging: 15# 是否在每次启动时强制创建全新的文件储存日志. 为 false 的情况下将会在上次启动时创建的日志文件续写log-force-new: true# 是否启用日志颜色log-colorful: true# 是否启用 DEBUGdebug: 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=aladdinrate-limit:enabled: false # 是否启用限速frequency: 1 # 令牌回复频率, 单位秒bucket: 1 # 令牌桶大小database: # 数据库相关设置leveldb:# 是否启用内置leveldb数据库# 启用将会增加10-20MB的内存占用和一定的磁盘空间# 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能enable: true# 媒体文件缓存, 删除此项则使用缓存文件(旧版行为)cache:image: data/image.dbvideo: 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 jsonListenSocket = 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 Nonedef 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_jsondata = {'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.喜欢本文的同学不妨点个关注,我会持续更新一些有趣的内容~~