开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
🎃一、预备知识
前言
由于篇幅较长,因为在这里将整体思路进行一个梳理,以便于读者能更好的理解我写的每一步的用意。
- 首先需要借助anaconda创建虚拟环境。
- 之后创建一个文件夹,用pycharm打开这个文件夹。也就是在这个文件夹下创建我们的项目。
- 在pycharm的terminal,也就是终端下执行:
pip install nb-cli
来配置nonebot2. - 之后我们安装和配置go-cqhttp
- 都配置成功之后,我们先运行pycharm中我们经过上面一系列步骤生成的bot.py文件。
- 再之后,运行go-cqhttp。
- 到这里就成功搭建好了一个qq机器人啦。
1.1 QQ机器人?
所谓实现安卓手机QQ协议就是把QQ.apk大卸八块,反编译找到关键源代码,比如登录之类,数据传输协议抓包查看,通过这些手段自己实现一个QQ客户端的意思,那么自己实现的客户端就可以进行功能扩展,算是制作QQ机器人的基础。
因为能用反编译+抓包的方式实现自己的QQ客户端,所以QQ机器人框架雨后春笋般涌现,由此诞生了一些优秀的机器人。
但是在2020.8.2凌晨2:00腾讯开始封杀,因此一堆qq机器人框架陆续跑路和消失。
其中Mirai 也是一个上面跑路的机器人框架,可能是因为mirai强调并且切实实行了“一切开发旨在学习,请勿用于非法用途”的准则,我估计是这个确保了mirai能安心地继续存在。
一切开发旨在学习,请勿用于非法用途 mirai 是完全免费且开放源代码的软件,仅供学习和娱乐用途使用 mirai 不会通过任何方式强制收取费用,或对使用者提出物质条件 mirai 由整个开源社区维护,并不是属于某个个体的作品,所有贡献者都享有其作品的著作权。 所以只要不是用于非法盈利之类的用途,是不会收到腾讯的律师函的。
1.2 pycharm打开命令行或Terminal的方法
Pycharm的下方工具栏中有两个窗口:Python Console和Terminal(如下图) 其中,Python Console叫做Python控制台,即Python交互模式:Terminal叫做终端,即命令行模式. Python交互模式主要有两种:CPython用>>>作为提示符,而IPython用In [序号]:作为提示符. Python交互式模式可以直接输入代码,然后执行,并立刻得到结果,因此Python交互模式主要是为了调试Python代码用的. 命令行模式与系统的CMD类似。如下图
1.3 脚手架
什么是脚手架 可以理解为是用来提高项目整个流程的工具,从初始化到开发,再到构建部署等。在整个过程中会帮我们完成一些比较复杂,且与实际业务并不太相关的工作。
脚手架的作用或必要性
- 自动化:创建项目,运行,构建,部署;这些事情都可以用过一句简单的命令完成。
- 标准化:模板标准化;开发规范标准化;发布流程标准化;
- 数据化:研发过程系统化、数据化,使得研发过程可量化
简单来说,脚手架是为了保证各施工过程顺利进行而搭设的工作平台。 在前端范畴中 脚手架是一个工具,安装完脚手架之后可以通过一些命令来快速实现 我们项目基础环境的搭建,不用一个一个自己去配置各种文件,帮我们自动生成了规范性的项目文件目录。
1.4 cqhttp
cqhttp 本质上是个无头 qq 客户端,可以用来接收和发送 QQ 信息,通过与 cqhttp 交互便能实现 bot 的功能。
单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。
1.5 go-cqhttp
使用 mirai 以及 MiraiGo 开发的 cqhttp golang 原生实现, 并在 cqhttp 原版 的基础上做了部分修改和拓展。
兼容性 接口
- HTTP API
- 反向HTTP POST
- 正向WebSocket
- 反向WebSocket
扩展支持
- HTTP POST多点上报
- 反向WS多点连接
- 修改群名
- 消息撤回事件
- 解析/发送 回复消息
- 解析/发送 合并转发
- 使用代理请求网络图片
MiraiGo就是GO语言实现的安卓QQ协议,API很原始,相当于一个类库,go-cqhttp是在MiraiGo的基础之上封装的HTTP协议和Websocket协议接口的框架,得益于GO语言先天的优势(资源占用少,运行简单,协程并发高),总之就是性能高,引用项目原话
1.6 机器人标准OneBot
之前的各种框架都只是机器人的各种实现,每个框架之间接口都不通用,编程语言也不尽相同,想要开发一个自己的机器人,换一套框架所有的代码都要推到重来,所以亟需一个规范统一各个框架,所以OneBot 诞生了,先来看看OneBot 是啥:
OneBot 标准 一个聊天机器人应用接口标准
- 简单
- 接口简单易懂,可轻松接入。
- 兼容性
- 兼容原 CQHTTP 插件,零负担迁移。
兼容原 CQHTTP 插件,这个标准和CQHTTP有啥关系?CQHTTP是酷Q的一个插件,这个插件可以提供HTTP协议的接口供第三方系统调用,这样就和具体语言无关,什么语言都可以调用机器人接口实现自己的逻辑,而且基于CQHTTP 已经实现了很多功能的机器人了,详情见上面优秀机器人框架,为了不让以前所有的优秀代码都要推倒重来,所以OneBot 干脆直接在CQHTTP 的基础之上指定标准,这就是典型的先有实现,后有标准的例子。
在这个标准的基础之上,有了各种编程语言的实现,我们称之为生态,如下
理论上,基于 OneBot 标准开发的任何 SDK、框架和机器人应用,都可以无缝地在下面的不同实现中切换。
- 下边是onebot的愿景个人感觉任重而道远!
😽二、使用虚拟环境来搭建
使用虚拟环境的用处当你一个库需要特定的包的时候,如果你直接使用本地的可能会出现n多的问题,因此下面的步骤我推荐在虚拟环境中进行。
2.1 在anaconda中创建虚拟环境
具体步骤可以参考我的这篇博客:人工智能实战篇之----- 环境配置与使用 注意的是python版本>=3.8
2.2 在在pycharm中使用anaconda的虚拟环境
这一步可以基于Nonebot2安装,也就是下边步骤中,在一个位置创建好一个文件夹之后,用pycharm打开项目,在该项目中使用anaconda的虚拟环境。
- 第一步、选择设置:
- 选择新增python解释器:
- 第三步、选择添加:
- 手动添加解释器
🦁 三、Nonebot2安装
需要注意的是,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
-
之后输入项目名,以及配置 仅仅选择第一个频道就可以了,不要选多个会导致报错。
-
之后就会生成项目如下:
- src/plugins: 用于存放编写的 bot 插件
- .env、.env.dev、.env.prod: 各环境配置文件
- bot.py: bot 入口文件
- pyproject.toml: 项目插件配置文件
- Dockerfile、docker-compose.yml: Docker 镜像配置文件
🐶 四、项目配置
4.1 bot.py文件的配置
bot.py中我们使用默认生成的就可以了。
4.2.env文件的配置
NoneBot 在启动时将会从系统环境变量或者 .env 文件中寻找变量 ENVIRONMENT (大小写不敏感),默认值为 prod。 这将引导 NoneBot 从系统环境变量或者 .env.{ENVIRONMENT} 文件中进一步加载具体配置。
.env 文件是基础环境配置文件,该文件中的配置项在不同环境下都会被加载,但会被 .env.{ENVIRONMENT} 文件中的配置所覆盖。
我们在 .env 文件中写入当前环境信息使用默认的就可以了。
ENVIRONMENT=dev
4.3 env.dev文件配置
因为在.env文件中已经添加了ENVIRONMENT=dev,这里需要配置一下env.dev文件信息
HOST=127.0.0.1
PORT=8890
LOG_LEVEL=DEBUG
FASTAPI_RELOAD=true
4.4 env.pord配置
配置信息如下
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= # 留空则从系统环境变量读取,如不存在则为空字符串
👻 五、go-cqhttp安装与使用
5.1 下载与安装
GitHub链接:go-cqhttp
点进去之后,因为是在window下的,所以选择如下 下载之后将放入项目下:
5.2 go-cqhttp的配置
-
运行powershell到当前目录下,实现这个的方式有多种:
-
在go-cqhttp文件所在的文件夹的空白处,打开powershell(shift+鼠标右键在此次打开power shell)
-
先打开powershell,之后通过cd到当前目录下。
-
在文件目录显示栏输入,powershell,
-
-
在powershell中键入命令:
.\go-cqhttp_windows_amd64.exe
websocker与http关系大概如下图,具体可以在网上搜索 -
选择成功后按回车,此时提示:默认配置文件已生成,请修改 config.yml 后重新启动! 关闭power shell,我们会发现原来的go-cqhttp所在的目录下会出现一个config.yml文件。
5.3 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 # 引用默认中间件
到这里go-cqhttp就已经配置好了。
🐹 六、开启实战
开启实例
6.1 开启nonebot。
右键点击运行bot.py
Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
运行之后可能会出现该错误。
该错误引起的原因是端口占用,可能是其他应用占用,多数是前面python开启的端口未关闭。
我们有两种解决方式:
- 方法一:不用默认的端口8080,而是选择其余端口,如8890。推荐使用方法一
- 方法二:查看占用端口的应用,并关闭。具体步骤如下
- 打开cmd窗口,输入
netstat -ano|findstr 8080
其中8080端口是默认开启的端口 返回的信息包含占用端口的引用和PID,如: - 关闭应用:
方法1:打开任务管理器,找到PID对应的程序,直接结束。(判断是否是重要程序) 方法2:通过cmd直接关闭,
taskkill /pid 8080 -t -f
- 打开cmd窗口,输入
如果都无误的话,运行结果如下
6.2 开启go-cqhttp
回到原来go-cqhttp所在目录文件下,打开power shell 输入
.\go-cqhttp_windows_amd64.exe
如果go-cqhttp配置成功会出现一个二维码,使用在配置文件中填写的QQ扫码登录。
登陆成功后,如图所示
6.3 小小实战
由于没有添加其余插件,所以我们只实现一个类似于hello world的命令吧!
我们选择一个别的qq对我们设置为机器人的QQ发送信息:/echo Hello world
如果成功,你的QQ机器人会返回:`Hello world``。如下图
参考文章