由于篇幅较长,因为在这里将整体思路进行一个梳理,以便于读者能更好的理解我写的每一步的用意。
pip install nb-cli
来配置nonebot2.所谓实现安卓手机QQ协议就是把QQ.apk大卸八块,反编译找到关键源代码,比如登录之类,数据传输协议抓包查看,通过这些手段自己实现一个QQ客户端的意思,那么自己实现的客户端就可以进行功能扩展,算是制作QQ机器人的基础。
因为能用反编译+抓包的方式实现自己的QQ客户端,所以QQ机器人框架雨后春笋般涌现,由此诞生了一些优秀的机器人。
但是在2020.8.2凌晨2:00腾讯开始封杀,因此一堆qq机器人框架陆续跑路和消失。
其中Mirai 也是一个上面跑路的机器人框架,可能是因为mirai强调并且切实实行了“一切开发旨在学习,请勿用于非法用途”的准则,我估计是这个确保了mirai能安心地继续存在。
一切开发旨在学习,请勿用于非法用途
mirai 是完全免费且开放源代码的软件,仅供学习和娱乐用途使用
mirai 不会通过任何方式强制收取费用,或对使用者提出物质条件
mirai 由整个开源社区维护,并不是属于某个个体的作品,所有贡献者都享有其作品的著作权。
所以只要不是用于非法盈利之类的用途,是不会收到腾讯的律师函的。
Pycharm的下方工具栏中有两个窗口:Python Console和Terminal(如下图) 其中,Python Console叫做Python控制台,即Python交互模式:Terminal叫做终端,即命令行模式. Python交互模式主要有两种:CPython用>>>作为提示符,而IPython用In [序号]:作为提示符. Python交互式模式可以直接输入代码,然后执行,并立刻得到结果,因此Python交互模式主要是为了调试Python代码用的. 命令行模式与系统的CMD类似。如下图
什么是脚手架
可以理解为是用来提高项目整个流程的工具,从初始化到开发,再到构建部署等。在整个过程中会帮我们完成一些比较复杂,且与实际业务并不太相关的工作。
脚手架的作用或必要性
简单来说,脚手架是为了保证各施工过程顺利进行而搭设的工作平台。
在前端范畴中 脚手架是一个工具,安装完脚手架之后可以通过一些命令来快速实现 我们项目基础环境的搭建,不用一个一个自己去配置各种文件,帮我们自动生成了规范性的项目文件目录。
cqhttp 本质上是个无头 qq 客户端,可以用来接收和发送 QQ 信息,通过与 cqhttp 交互便能实现 bot 的功能。
单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。
使用 mirai 以及 MiraiGo 开发的 cqhttp golang 原生实现, 并在 cqhttp 原版 的基础上做了部分修改和拓展。
兼容性
接口
扩展支持
MiraiGo就是GO语言实现的安卓QQ协议,API很原始,相当于一个类库,go-cqhttp是在MiraiGo的基础之上封装的HTTP协议和Websocket协议接口的框架,得益于GO语言先天的优势(资源占用少,运行简单,协程并发高),总之就是性能高,引用项目原话
之前的各种框架都只是机器人的各种实现,每个框架之间接口都不通用,编程语言也不尽相同,想要开发一个自己的机器人,换一套框架所有的代码都要推到重来,所以亟需一个规范统一各个框架,所以OneBot 诞生了,先来看看OneBot 是啥:
OneBot 标准
一个聊天机器人应用接口标准
- 简单
- 接口简单易懂,可轻松接入。
- 兼容性
- 兼容原 CQHTTP 插件,零负担迁移。
兼容原 CQHTTP 插件,这个标准和CQHTTP有啥关系?CQHTTP是酷Q的一个插件,这个插件可以提供HTTP协议的接口供第三方系统调用,这样就和具体语言无关,什么语言都可以调用机器人接口实现自己的逻辑,而且基于CQHTTP 已经实现了很多功能的机器人了,详情见上面优秀机器人框架,为了不让以前所有的优秀代码都要推倒重来,所以OneBot 干脆直接在CQHTTP 的基础之上指定标准,这就是典型的先有实现,后有标准的例子。
在这个标准的基础之上,有了各种编程语言的实现,我们称之为生态,如下
理论上,基于 OneBot 标准开发的任何 SDK、框架和机器人应用,都可以无缝地在下面的不同实现中切换。
使用虚拟环境的用处当你一个库需要特定的包的时候,如果你直接使用本地的可能会出现n多的问题,因此下面的步骤我推荐在虚拟环境中进行。
具体步骤可以参考我的这篇博客:人工智能实战篇之----- 环境配置与使用
注意的是python版本>=3.8
这一步可以基于Nonebot2安装,也就是下边步骤中,在一个位置创建好一个文件夹之后,用pycharm打开项目,在该项目中使用anaconda的虚拟环境。
需要注意的是,NoneBot 仅支持 Python 3.8 以上版本
创建一个空文件夹,我的命名是(new_bot)添加到pycharm项目中。其实就是创建好文件夹之后,通过pycharm来打开该目录。如下图
打开pycharm的终端键入:` pip install nb-cli
安装成功后,在终端键入: nb create
。如果安装成功会出现下图所示,反之则安装失败。
如果安装失败的话,首先检查
1、pip安装环境下的 Python 版本应>= 3.8。
2、安装 NoneBot 2 之前卸载 NoneBot 1
如果都没有问题,出现的错误时:
ImportError: cannot import name ‘soft_unicode’ from ‘markupsafe’ (/root/miniconda3/lib/python3.7/site-packages/markupsafe/init.py)
解决方法是,在终端中执行:pip install --user --upgrade aws-sam-cli
之后耐心等待即可,如果在等待一段时间后出现如下图情况
可以直接 contrl + C 结束即可。
之后重新执行: nb create
bot.py中我们使用默认生成的就可以了。
NoneBot 在启动时将会从系统环境变量或者 .env 文件中寻找变量 ENVIRONMENT (大小写不敏感),默认值为 prod。
这将引导 NoneBot 从系统环境变量或者 .env.{ENVIRONMENT} 文件中进一步加载具体配置。
.env 文件是基础环境配置文件,该文件中的配置项在不同环境下都会被加载,但会被 .env.{ENVIRONMENT} 文件中的配置所覆盖。
我们在 .env 文件中写入当前环境信息使用默认的就可以了。
ENVIRONMENT=dev
因为在.env文件中已经添加了ENVIRONMENT=dev,这里需要配置一下env.dev文件信息
HOST=127.0.0.1
PORT=8890
LOG_LEVEL=DEBUG
FASTAPI_RELOAD=true
配置信息如下
HOST=127.0.0.1
PORT=8890
由于在上一步设置了端口号,这里的端口号需要与env.dev端口号相同。
env.pord配置信息较多,初学者可以不选择全部配置,按照上面配置即可。
如果有兴趣可以参考官方给出的配置信息
HOST=0.0.0.0 # 配置 NoneBot 监听的 IP/主机名
PORT=8080 # 配置 NoneBot 监听的端口
DEBUG=true # 开启 debug 模式 **请勿在生产环境开启**
SUPERUSERS=["123456789", "987654321"] # 配置 NoneBot 超级用户
NICKNAME=["awesome", "bot"] # 配置机器人的昵称
COMMAND_START=["/", ""] # 配置命令起始字符
COMMAND_SEP=["."] # 配置命令分割字符
# Custom Configs
CUSTOM_CONFIG1="config in env file"
CUSTOM_CONFIG2= # 留空则从系统环境变量读取,如不存在则为空字符串
GitHub链接:go-cqhttp
点进去之后,因为是在window下的,所以选择如下
下载之后将放入项目下:
运行powershell到当前目录下,实现这个的方式有多种:
在powershell中键入命令:.\go-cqhttp_windows_amd64.exe
websocker与http关系大概如下图,具体可以在网上搜索
选择成功后按回车,此时提示:默认配置文件已生成,请修改 config.yml 后重新启动!
关闭power shell,我们会发现原来的go-cqhttp所在的目录下会出现一个config.yml文件。
下面进行config.yml文件信息配置。
对于反向socket我们只需要配置两个位置的信息。
这里的uin输入机器人的QQ号,密码可以不用加,注意QQ号前空格不要删掉。
account: # 账号相关
uin: 123456789 # QQ账号
password: '' # 密码为空时使用扫码登录
这里需要修改universal,把后面的改成 ws://127.0.0.1:8890/cqhttp/ws
,这里的8890改成你自己的端口号,端口号和env.dev中的端口号要一致。
# 连接服务列表
servers:
# 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
#- http: # http 通信
#- ws: # 正向 Websocket
#- ws-reverse: # 反向 Websocket
#- pprof: #性能分析服务器
# 反向WS设置
- ws-reverse:
# 反向WS Universal 地址
# 注意 设置了此项地址后下面两项将会被忽略
universal: ws://127.0.0.1:8890/cqhttp/ws
# 反向WS API 地址
api: ws://your_websocket_api.server
# 反向WS Event 地址
event: ws://your_websocket_event.server
# 重连间隔 单位毫秒
reconnect-interval: 3000
middlewares:
<<: *default # 引用默认中间件
开启实例
右键点击运行bot.py
运行之后可能会出现该错误。
该错误引起的原因是端口占用,可能是其他应用占用,多数是前面python开启的端口未关闭。
我们有两种解决方式:
回到原来go-cqhttp所在目录文件下,打开power shell 输入
.\go-cqhttp_windows_amd64.exe
如果go-cqhttp配置成功会出现一个二维码,使用在配置文件中填写的QQ扫码登录。
由于没有添加其余插件,所以我们只实现一个类似于hello world的命令吧!
我们选择一个别的qq对我们设置为机器人的QQ发送信息:/echo Hello world
如果成功,你的QQ机器人会返回:`Hello world``。如下图
参考文章