敞开成长之旅!这是我参加「日新计划 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“。如下图
参阅文章
- 增加链接描绘
- 增加链接描绘