敞开成长之旅!这是我参加「日新计划 12 月更文挑战」的第14天,点击查看活动概况

一、准备常识

前言

因为篇幅较长,因为在这儿将整体思路进行一个梳理,以便于读者能更好的理解我写的每一步的意图。

  1. 首要需求借助anaconda创立虚拟环境。
  2. 之后创立一个文件夹,用pycharm翻开这个文件夹。也便是在这个文件夹下创立咱们的项目。
  3. 在pycharm的terminal,也便是终端下履行:pip install nb-cli 来装备nonebot2.
  4. 之后咱们装置和装备go-cqhttp
  5. 都装备成功之后,咱们先运转pycharm中咱们经过上面一系列进程生成的bot.py文件。
  6. 再之后,运转go-cqhttp。
  7. 到这儿就成功建立好了一个qq机器人啦。

基于Nonebot2搭建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相似。如下图

基于Nonebot2搭建QQ机器人实战篇(一)

1.3 脚手架

什么是脚手架 能够理解为是用来提高项目整个流程的东西,从初始化到开发,再到构建部署等。在整个进程中会帮咱们完结一些比较复杂,且与实际业务并不太相关的作业。

脚手架的作用或必要性

  • 主动化:创立项目,运转,构建,部署;这些事情都能够用过一句简略的指令完结。
  • 规范化:模板规范化;开发规范规范化;发布流程规范化;
  • 数据化:研制进程系统化、数据化,使得研制进程可量化

简略来说,脚手架是为了确保各施工进程顺利进行而搭设的作业平台。 在前端领域中 脚手架是一个东西,装置完脚手架之后能够经过一些指令来快速完成 咱们项目根底环境的建立,不必一个一个自己去装备各种文件,帮咱们主动生成了规范性的项目文件目录。

基于Nonebot2搭建QQ机器人实战篇(一)

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的愿景个人感觉任重而道远!

基于Nonebot2搭建QQ机器人实战篇(一)
基于Nonebot2搭建QQ机器人实战篇(一)

二、运用虚拟环境来建立

运用虚拟环境的用途当你一个库需求特定的包的时候,假如你直接运用本地的或许会呈现n多的问题,因而下面的进程我推荐在虚拟环境中进行。

2.1 在anaconda中创立虚拟环境

具体进程能够参阅我的这篇博客:人工智能实战篇之—– 环境装备与运用 留意的是python版本>=3.8

2.2 在在pycharm中运用anaconda的虚拟环境

这一步能够根据Nonebot2装置,也便是下边进程中,在一个方位创立好一个文件夹之后,用pycharm翻开项目,在该项目中运用anaconda的虚拟环境。

  1. 第一步、挑选设置:
    基于Nonebot2搭建QQ机器人实战篇(一)
  2. 挑选新增python解说器:
    基于Nonebot2搭建QQ机器人实战篇(一)
  3. 第三步、挑选增加:
    基于Nonebot2搭建QQ机器人实战篇(一)
  4. 手动增加解说器
    基于Nonebot2搭建QQ机器人实战篇(一)

三、Nonebot2装置

需求留意的是,NoneBot 仅支撑 Python 3.8 以上版本

  1. 创立一个空文件夹,我的命名是(new_bot)增加到pycharm项目中。其实便是创立好文件夹之后,经过pycharm来翻开该目录。如下图

    基于Nonebot2搭建QQ机器人实战篇(一)

  2. 翻开pycharm的终端键入:` pip install nb-cli

  3. 装置成功后,在终端键入: nb create。假如装置成功会呈现下图所示,反之则装置失败。

    基于Nonebot2搭建QQ机器人实战篇(一)
    假如装置失败的话,首要查看 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 之后耐性等候即可,假如在等候一段时间后呈现如下图状况
    基于Nonebot2搭建QQ机器人实战篇(一)
    能够直接 contrl + C 结束即可。 之后重新履行: nb create

  4. 之后输入项目名,以及装备

    基于Nonebot2搭建QQ机器人实战篇(一)
    基于Nonebot2搭建QQ机器人实战篇(一)
    仅仅挑选第一个频道就能够了,不要选多个会导致报错。
    基于Nonebot2搭建QQ机器人实战篇(一)

  5. 之后就会生成项目如下:

    基于Nonebot2搭建QQ机器人实战篇(一)

  • 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下的,所以挑选如下

基于Nonebot2搭建QQ机器人实战篇(一)
下载之后将放入项目下:
基于Nonebot2搭建QQ机器人实战篇(一)

5.2 go-cqhttp的装备

  1. 运转powershell到当前目录下,完成这个的办法有多种:

    1. 在go-cqhttp文件地点的文件夹的空白处,翻开powershell(shift+鼠标右键在此次翻开power shell)

      基于Nonebot2搭建QQ机器人实战篇(一)

    2. 先翻开powershell,之后经过cd到当前目录下。

    3. 在文件目录显现栏输入,powershell,

      基于Nonebot2搭建QQ机器人实战篇(一)
      基于Nonebot2搭建QQ机器人实战篇(一)
      基于Nonebot2搭建QQ机器人实战篇(一)

  2. 在powershell中键入指令:.\go-cqhttp_windows_amd64.exe

    基于Nonebot2搭建QQ机器人实战篇(一)
    websocker与http联系大约如下图,具体能够在网上搜索
    基于Nonebot2搭建QQ机器人实战篇(一)

  3. 挑选成功后按回车,此刻提示:默许装备文件已生成,请修正 config.yml 后重新启动! 封闭power shell,咱们会发现本来的go-cqhttp地点的目录下会呈现一个config.yml文件。

    基于Nonebot2搭建QQ机器人实战篇(一)

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就已经装备好了。

基于Nonebot2搭建QQ机器人实战篇(一)

六、敞开实战

敞开实例

6.1 敞开nonebot。

右键点击运转bot.py

Error: [WinError 10013] 以一种拜访权限不允许的办法做了一个拜访套接字的测验。

运转之后或许会呈现该错误。

该错误引起的原因是端口占用,或许是其他运用占用,多数是前面python敞开的端口未封闭。

咱们有两种处理办法:

  1. 办法一:不必默许的端口8080,而是挑选其他端口,如8890。推荐运用办法一
  2. 办法二:查看占用端口的运用,并封闭。具体进程如下
    1. 翻开cmd窗口,输入netstat -ano|findstr 8080其中8080端口是默许敞开的端口 返回的信息包括占用端口的引证和PID,如:
      基于Nonebot2搭建QQ机器人实战篇(一)
    2. 封闭运用:

      办法1:翻开使命管理器,找到PID对应的程序,直接结束。(判别是否是重要程序) 办法2:经过cmd直接封闭,taskkill /pid 8080 -t -f

假如都无误的话,运转结果如下

基于Nonebot2搭建QQ机器人实战篇(一)

6.2 敞开go-cqhttp

回到本来go-cqhttp地点目录文件下,翻开power shell 输入

.\go-cqhttp_windows_amd64.exe

假如go-cqhttp装备成功会呈现一个二维码,运用在装备文件中填写的QQ扫码登录。

登陆成功后,如图所示

基于Nonebot2搭建QQ机器人实战篇(一)

6.3 小小实战

因为没有增加其他插件,所以咱们只完成一个相似于hello world的指令吧!

咱们挑选一个其他qq对咱们设置为机器人的QQ发送信息:/echo Hello world 假如成功,你的QQ机器人会返回:`Hello world“。如下图

基于Nonebot2搭建QQ机器人实战篇(一)

基于Nonebot2搭建QQ机器人实战篇(一)

参阅文章

  1. 增加链接描绘
  2. 增加链接描绘