飞道的博客

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

1780人阅读  评论(0)

🎃一、预备知识

前言

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

  1. 首先需要借助anaconda创建虚拟环境。
  2. 之后创建一个文件夹,用pycharm打开这个文件夹。也就是在这个文件夹下创建我们的项目。
  3. 在pycharm的terminal,也就是终端下执行:pip install nb-cli 来配置nonebot2.
  4. 之后我们安装和配置go-cqhttp
  5. 都配置成功之后,我们先运行pycharm中我们经过上面一系列步骤生成的bot.py文件。
  6. 再之后,运行go-cqhttp。
  7. 到这里就成功搭建好了一个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的虚拟环境。

  1. 第一步、选择设置:
  2. 选择新增python解释器:
  3. 第三步、选择添加:
  4. 手动添加解释器

🦁 三、Nonebot2安装

需要注意的是,NoneBot 仅支持 Python 3.8 以上版本

  1. 创建一个空文件夹,我的命名是(new_bot)添加到pycharm项目中。其实就是创建好文件夹之后,通过pycharm来打开该目录。如下图

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

  3. 安装成功后,在终端键入: 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

  4. 之后输入项目名,以及配置

    仅仅选择第一个频道就可以了,不要选多个会导致报错。

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

  • 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的配置

  1. 运行powershell到当前目录下,实现这个的方式有多种:

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

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

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

  2. 在powershell中键入命令:.\go-cqhttp_windows_amd64.exe
    websocker与http关系大概如下图,具体可以在网上搜索

  3. 选择成功后按回车,此时提示:默认配置文件已生成,请修改 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开启的端口未关闭。

我们有两种解决方式:

  1. 方法一:不用默认的端口8080,而是选择其余端口,如8890。推荐使用方法一
  2. 方法二:查看占用端口的应用,并关闭。具体步骤如下
    1. 打开cmd窗口,输入netstat -ano|findstr 8080其中8080端口是默认开启的端口
      返回的信息包含占用端口的引用和PID,如:
    2. 关闭应用:

      方法1:打开任务管理器,找到PID对应的程序,直接结束。(判断是否是重要程序)
      方法2:通过cmd直接关闭,taskkill /pid 8080 -t -f

如果都无误的话,运行结果如下

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``。如下图

参考文章

  1. 添加链接描述
  2. 添加链接描述

转载:https://blog.csdn.net/qq_39838607/article/details/127471195
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场