折腾NoneBot

本文最后更新于:2022年5月2日 凌晨

Pay Attention!!!

Pay Attention!!!

Pay Attention!!!

因为 NoneBot 项目更新,本篇博客内容已无参考性!!!

因为 NoneBot 项目更新,本篇博客内容已无参考性!!!

因为 NoneBot 项目更新,本篇博客内容已无参考性!!!

(等有时间了整个新的)

折腾NoneBot 2

看群里机器人挺有意思,然后翻学长GitHub(Reverier-XuFrank)的时候翻到了这个叫NoneBot的东西,就动手搞搞,刚好手头有不用的小号

全程在Manjaro下进行

参考资料

NoneBot官方手册

NoneBot官方文档

在centos上装载NoneBot2_ChenYX的博客-CSDN博客

manjaro下python创建虚拟环境 | Just for Life. (muyuuuu.github.io)

Arch/Manjaro安装deb安装包 - 简书 (jianshu.com)

virtualenvwrapper 的安装与使用 - Tiac - 博客园 (cnblogs.com)

Linux pip安装速度慢(超时报错),为pip换源 - lzping - 博客园 (cnblogs.com)

开启QBot_ChenYX的博客-CSDN博客

概览

NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。

除了起到解析事件的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。

需要注意的是,NoneBot 仅支持 Python 3.7+

Linux pip安装速度慢(超时报错),为pip换源

mkdir -p ~/.pip/
nano pip.conf

pip.conf 中内容如下:

[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
[install]

trusted-host=mirrors.aliyun.com

安装

虚拟环境

为了装载 NoneBot2 并保证相关配置包不会冲突,我们需要安装一个纯净的 python 空间。这里我们就要用到 virtualenv 工具包了。

virtualenvwrapper 是一个python项目环境管理工具,一个项目一个独立环境(可随心切换),防止不同项目依赖环境的相互污染

virtualenv 的安装

首先使用 pip 命令安装两个需要的包

如果 pip 软链接没有修改成 pip3 的话要输入 pip3

pip3 install virtualenv
pip3 install virtualenvwrapper

然后创建一个文件夹,用于存放所有的虚拟环境:

mkdir -p /usr/local/virtualenvs (目录自定义)

注意:安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:

首先查看一下 virtualenvwrapper.shpython3 的安装目录

which virtualenvwrapper.sh
which python3
(用whereis也行)

修改文件 .bashrc ,这就是用户配置文件

cd ~
sudo nano .bashrc

文件末尾添加

export WORKON_HOME=/usr/local/virtualenvs (绝对路径)
source /home/cyk/.local/bin/virtualenvwrapper.sh
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3

这里注意,WORKON_HOME的绝对路径需要填写你刚刚创建的文件夹地址。source 里要填写你刚刚 pip 安装 virtualenvwrapper 的位置,就是上面找到的

再然后更新环境变量

source ~/.bashrc

激活

在终端输入

source virtualenvwrapper.sh

创建虚拟环境

mkvirtualenv 你的虚拟环境名称

进入虚拟环境后命令行会有所变化。(一定不要sudo

如果报错了,说明我们没有给 virtualenv 创建软链接,然后就ok了

ln -s /home/cyk/.local/bin/virtualenv
 /usr/bin/virtualenv

如果出现类似virtualenv: error: argument dest: the destination . is not write-able at /usr/local/virtualenvs的错误

该错误是由于.virtualenvs没有可写的权限引起的,可对该文件赋予可读可写可执行的权限

sudo chmod 777 /usr/local/virtualenvs

之后再次创建虚拟环境

列出虚拟环境

workon

启动虚拟环境

workon [venvname(你虚拟环境的名字)]

退出虚拟环境

deactivate

删除虚拟环境

rmvirtualenv [venvname]

安装NoneBot

一定要进入虚拟环境

通过脚手架安装

使用 pip 或 其他包管理工具 安装 nb-clinonebot2 会作为其依赖被一起安装

pip3 install nb-cli

这样我们就安装完成了,可以发现这里会安装一大堆的包,如果不在虚拟环境中很难保证不会产生冲突。

我们尝试运行下面命令,在虚拟环境目录下搭建一个机器人工程进行测试

记得换好目录,我忘了……bot现在在 /home/cyk/

nb create

然后一步一步安装就行(协议端使用的是cqhttp

搭建完成后,我们可以在目录下可以看到一个和你bot名字一样的文件夹

进入后 bot.py ,就是我们的机器人初始化代码。而 src 内(或者和你bot名字一样的文件夹)的 plugins 文件夹则是我们存放机器人插件的地方

插件我们可以自己编写然后存入 plugins 中,也可以直接安装官方大佬们编写的插件使机器人可以快速上线

安装插件

插件可以通过 nb-cli 进行安装,也可以自行安装并加载插件。

# 列出所有的插件
nb plugin list
# 搜索插件
nb plugin search xxx
# 安装插件
nb plugin install xxx

加载插件

加载内置插件

bot.py 文件中添加以下行

import nonebot
from nonebot.adapters.cqhttp import Bot

nonebot.init()

driver = nonebot.get_driver()
driver.register_adapter("cqhttp", Bot)
# 注册 CQHTTP 的 Adapter

nonebot.load_builtin_plugins()
# 加载 nonebot 内置插件

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()

WARNING

目前, 内建插件仅支持 CQHTTP 的 Adapter

如果您使用的是其他 Adapter, 请移步该 Adapter 相应的文档

这将会加载 nonebot 内置的插件,它包含:

  • 命令 say:可由superuser使用,可以将消息内容由特殊纯文本转为富文本
  • 命令 echo:可由任何人使用,将消息原样返回

以上命令均需要指定机器人,即私聊、群聊内@机器人、群聊内称呼机器人昵称。参考 Rule: to_me

加载插件目录

bot.py 文件中添加以下行

import nonebot

nonebot.init()
# 加载插件目录,该目录下为各插件,以下划线开头的插件将不会被加载
nonebot.load_plugins("awesome_bot/plugins")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()

提示

加载插件目录时,目录下以 _ 下划线开头的插件将不会被加载!

不能存在相同名称的插件!

加载单个插件

bot.py 文件中添加以下行

import nonebot

nonebot.init()
# 加载一个 pip 安装的插件
nonebot.load_plugin("nonebot_plugin_status")
# 加载本地的单独插件
nonebot.load_plugin("awesome_bot.plugins.xxx")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()

其他方式

看文档

运行结果

尝试运行 nb run 或者 python bot.py,可以看到日志输出了类似如下内容

09-19 21:51:59 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
09-19 21:51:59 [INFO] nonebot | Succeeded to import "plugin_in_folder"

CQHTTP 协议使用指南

配置 CQHTTP 协议端(以 QQ 为例)

单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。

QQ 协议端举例:

这里以 go-cqhttp为例

  1. 下载 go-cqhttp 对应平台的 release 文件,点此前往

    我下载的

    go-cqhttp_1.0.0-beta4_linux_arm64.deb

    下载速度好慢的,找到个加速的网站

    Github 加速下载 - 在线工具 (zygxsq.cn)

    安装教程

    manjaro安装deb包 - 知乎 (zhihu.com)

    不过我包解出来后双击安装的~

  2. 运行 exe 文件或者使用 ./go-cqhttp 启动

  3. 生成默认配置文件并修改默认配置(机器人目录下的 config.yml )

{
  uin: 机器人QQ号
  password: 机器人密码
  encrypt_password: false
  password_encrypted: ""
  enable_db: true
  access_token: ""
  relogin: {
    enabled: true
    relogin_delay: 3
    max_relogin_times: 0
  }
  _rate_limit: {
    enabled: false
    frequency: 1
    bucket_size: 1
  }
  ignore_invalid_cqcode: false
  force_fragmented: false
  heartbeat_interval: 0
  http_config: {
    enabled: false
    host: "0.0.0.0"
    port: 5700
    timeout: 0
    post_urls: {}
  }
  ws_config: {
    enabled: false
    host: "0.0.0.0"
    port: 6700
  }
  ws_reverse_servers: [
    {
      enabled: true
      reverse_url: ws://127.0.0.1:8080/cqhttp/ws
      reverse_api_url: ws://you_websocket_api.server
      reverse_event_url: ws://you_websocket_event.server
      reverse_reconnect_interval: 3000
    }
  ]
  post_message_format: array
  use_sso_address: false
  debug: false
  log_level: ""
  web_ui: {
    enabled: false
    host: 127.0.0.1
    web_ui_port: 9999
    web_input: false
  }
}

其中 ws://127.0.0.1:8080/cqhttp/ws 中的 127.0.0.18080 应分别对应 nonebot 配置的 HOST 和 PORT。

如果要修改

在机器人目录打开终端

nano .env.dev

打开该文件,里面的 host 和 port 就是我们工程与 cqhttp 建立联系的通道地址

cqhttp 是前述 register_adapter 时传入的第一个参数,代表设置的 CQHTTPBot 适配器的路径,你可以对不同的适配器设置不同路径以作区别。

启动机器人

注意go-cqhttp目录

which go-cqhttp

我的是在/usr/bin/go-cqhttp

打开一个终端

./go-cqhttp

也可设置后台启动

nohup /usr/bin/go-cqhttp >> cqhttp.log 2>&1 &

机器人目录下打开终端(注意要在虚拟环境下

nb run

Accepted!好耶


折腾NoneBot
https://blog.ksfu.top/posts/ec36/
作者
康师傅
发布于
2021年5月29日
许可协议