NoneBot2,基于Python的聊天机器人

NoneBot2,基于Python的聊天机器人

  • 第一步,配置python
  • 第二步,配置[go-cqhttp](https://github.com/Mrs4s/go-cqhttp)
  • 第三步,配置[NoneBot](https://61d3d9dbcadf413fd3238e89--nonebot2.netlify.app/)

NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架,它基于 Python 的类型注解和异步特性,能够为你的需求实现提供便捷灵活的支持。

NoneBot2 具有丰富的插件生态系统,可以实现多种功能,例如自动回复、天气查询、消息推送等等。此外,它还提供了完善的文档和示例代码,方便用户快速上手和开发自己的插件。

如果你是一名 Python 程序员,想要开发一个聊天机器人,那么 NoneBot2 绝对是你的不二之选。你可以在官方文档中了解更多关于 NoneBot2 的详细信息和使用方法。

首先,你需要明白的是NoneBot2的运行是需要python运行环境来支持,因此我们首先需要配置好python环境;再有,以QQ聊天机器人举例,NoneBot2本身并不包含与QQ服务器通信的底层协议实现,因此无法独立搭建聊天机器人。与 QQ 服务器通信的底层协议实现可以有多种选择,如 CoolQ HTTP API 协议、Mirai 协议、go-cqhttp 协议等。因此,在使用 nonebot 框架搭建 QQ 机器人时,您还需要选择一个底层协议实现来与 QQ 服务器通信,这里我们以go-cqhttp为例

综上所述,如果我们要搭建一个属于自己的QQ机器人,需要进行如下几步:

  1. 要搭建一个安装 Python 是作为 nonebot 运行的基础环境;
  2. 配置 go-cqhttp 是为了实现与 QQ 服务器的通信,并提供 QQ 机器人的服务;
  3. 配置 nonebot 是将 go-cqhttp 和 Python 代码连接起来,实现具体的 QQ 机器人功能。

下面将直接用云服务器进行部署,毕竟如果你要开个机器人肯定是24小时一直服务,因此,这里以腾讯云的Centos为例部署。

第一步,配置python

首先你得先按照Python,需要注意的是,NoneBot 仅支持 Python 3.7.3 以上版本,这里以安装Python3.9.9为例:

由于CentOS7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。所以我们要额外安装Python3,而且系统一般允许多个版本的python同时存在。

我们先来查看python安装位置,一般是位于/usr/bin/python目录下。

$ which python
>> /usr/bin/python

下面介绍安装Python3的方法:

  1. 安装依赖包(切记安装)

    yum -y groupinstall "Development tools"
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    

    在安装 Python 之前需要安装必要的开发工具和库。

    当您运行第一个命令 yum -y groupinstall development tools 时,它会安装一组常用的开发工具,用于在 Linux 系统上构建软件。这些工具包括编译器、链接器和其他用于构建软件的实用程序。

    接下来的命令 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 安装 Python 所需的其他开发库。这些库提供了压缩和加密功能、数据库访问支持以及 GUI 工具包(如 Tkinter)等功能。

    通过在安装 Python 之前安装这些工具和库,您可以确保您的系统具备构建和运行 Python 程序所需的所有必要组件。

    同时,补充个小知识点:在 yum 命令中,-y 参数是指定在执行安装或卸载操作时不需要手动确认。如果没有使用 -y 参数,则在安装或卸载软件包时,yum 会提示您确认操作,需要手动输入 y 才能继续执行操作。

    使用 -y 参数可以使 yum 命令在执行操作时自动确认,避免了人工交互的过程,方便自动化脚本和批量操作。但是,使用 -y 参数也需要注意,因为这样可能会导致不必要的安装或卸载,所以在使用时需要谨慎。

  2. 下载Python3安装包
    大家可根据自己需求下载不同版本的Python3,我下载的是Python3.9.9

    wget https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz
    
  3. 新建python3存放目录

    mkdir /usr/local/python3
    
  4. 安装Python3

    解压压缩包,进入解压目录,指定安装目录,安装Python3。

    tar -xvJf  Python-3.9.9.tar.xz # 该命令将 Python 的源代码文件(压缩文件)解压缩到当前目录中。
    cd Python-3.9.9 # 将当前工作目录更改为 Python 源代码所在的目录,以便在这个目录下执行后续的命令。
    ./configure --prefix=/usr/local/python3 # 运行配置脚本,为 Python 的构建过程设置参数。--prefix 选项指定 Python 的安装目录,这里设置为 /usr/local/python3。这意味着 Python 将被安装到 /usr/local/python3 目录中。
    yum install libffi-devel -y # 这个命令会安装 libffi-devel 开发包,该开发包是 Python 某些模块的依赖项。在安装 Python 的某些版本(如 Python 3.7 及以上版本)时,需要先安装此包。
    make && make install # 这个命令会构建和安装 Python。make 命令编译源代码,并生成可执行文件。make install 命令将编译好的文件安装到指定的目录中(在这里是 /usr/local/python3)。这样,Python 就已经成功安装到了系统中。
    

    在 Python 3.4 及以后的版本中,pip 被包含在了 Python 的安装包中,因此在安装 Python 3.4 及以后的版本时,pip 也会被一同安装。

    如果您使用的是 Python 3.4 及以后的版本,那么在安装完成后,您可以通过在终端中输入 pip 命令来验证 pip 是否已经安装成功。

    对于早期版本的 Python(例如 Python 2.x 系列和 Python 3.3 及以前的版本),pip 并不会自动安装。您需要手动安装 pip。yum -y install python-pipyum -y install python3-pip

  5. 创建软链接

    ln -s /usr/local/python3/bin/python3 /usr/bin/python3
    ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
    

    在 Linux 系统中,通常使用 pythonpip 命令来分别执行 Python 解释器和 pip 包管理器。在您安装了多个版本的 Python 时,可能会出现需要切换 Python 版本的情况。此时,您可以使用软链接来指定默认版本。

    创建软链接的命令是 ln -s 源文件 目标文件,其中 -s 表示创建软链接。在这里,/usr/local/python3/bin/python3 是您要创建软链接的源文件,而 /usr/bin/python3 是软链接的目标文件。这样,当您执行 python3 命令时,实际上会调用 /usr/local/python3/bin/python3 解释器。

    同样,/usr/local/python3/bin/pip3 是源文件,/usr/bin/pip3 是目标文件,执行 pip3 命令时,实际上会调用 /usr/local/python3/bin/pip3 包管理器。

    通过创建软链接,您可以轻松地切换不同版本的 Python,并指定默认版本。但是,需要注意的是,软链接只是一个指向源文件的快捷方式,源文件被删除或移动时,软链接也将失效。

  6. 安装完成,输入python3测试

    NoneBot2,基于Python的聊天机器人_第1张图片

    安装成功

第二步,配置go-cqhttp

go-cqhttp 是一个基于 go 语言开发的,轻量、原生跨平台、高效、可扩展的 QQ 机器人框架,支持多种协议和多个 QQ 用户同时连接,可轻松实现 QQ 消息收发、群消息管理、帐号管理、事件处理等功能。

以腾讯云轻量级服务器centos7为例,配置go-cqhttp的流程如下:

  1. 在github上下载最新的版本go-cqhttp,根据你的系统选择下载安装包,这里我们选择arm64 Linux

    系统类型 可执行文件 压缩文件
    Intel 版 Macos Not available go-cqhttp_darwin_amd64.tar.gz
    M1 版 Macos Not available go-cqhttp_darwin_arm64.tar.gz
    32 位 Linux Not available go-cqhttp_linux_386.tar.gz
    64 位 Linux Not available go-cqhttp_linux_amd64.tar.gz
    arm64 Linux Not available go-cqhttp_linux_arm64.tar.gz
    armv7 Linux Not available go-cqhttp_linux_armv7.tar.gz
    32 位 Windows go-cqhttp_windows_386.exe go-cqhttp_windows_386.zip
    64 位 Windows go-cqhttp_windows_amd64.exe go-cqhttp_windows_amd64.zip
    arm64 Windows go-cqhttp_windows_arm64.exe go-cqhttp_windows_arm64.zip
    armv7 Windows go-cqhttp_windows_armv7.exe go-cqhttp_windows_armv7.zip
    wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc4/go-cqhttp_linux_amd64.tar.gz
    

    (一定要注意你的安装目录)

  2. 解压安装设置并登录机器人QQ

    tar -xzvf go-cqhttp_linux_amd64.tar.gz
    

    解压后cd到解压的目录里执行ssh命令./go-cqhttp,执行这个命令会在当前文件夹下生成几个文件。重点关注config.yml文件,你需要在这个文件中设置QQ(和 QQ密码)

    # go-cqhttp 默认配置文件
    account: # 账号相关
      uin: # QQ账号
      password: '' # 密码为空时使用扫码登录
      encrypt: false  # 是否开启密码加密
      status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
      relogin: # 重连设置
        delay: 3   # 首次重连延迟, 单位秒
        interval: 3   # 重连间隔
        max-times: 0  # 最大重连次数, 0为无限制
    ......
    

    设置好后可以重启go-cqhttp。

  3. 重启后,第一次登录因为异地需要验证,可以选择扫码登录。

    • 如果你的服务器和手机不在同一个局域网内,会提示网络环境复杂

      解决办法:在本地电脑调试成功后,会在go-cqhttp所在的文件夹中生成session.token文件,将session.token文件传到云服务器中go-cqhttp所在的文件夹内即可

    • 提示登录失败: 密码错误或账号被冻结

      解决办法:在运行一次go-cqhttp后,可以发现其文件夹内会生成一个device.json文件,将device.josn中的protocol=5改为protocol=2即可

    这里你可能会出现其他bug,可以访问其GitHub,查看issue,看看有无解决办法。如下:

    https://github.com/Mrs4s/go-cqhttp/issues

  4. 由于我们想要其24小时运营,因此可以给它设置为后台运行,并进行进程守护

    1. 设置后台运行

      nohup ./go-cqhttp
      

      nohup ./go-cqhttp 是一个命令,它的作用是在后台运行 go-cqhttp。

      nohup 是 Linux 系统中一个命令,用于让命令在后台运行,并且忽略掉 Hangup 信号。Hangup 信号通常是在用户退出登录时发送给当前进程的,如果没有使用 nohup 命令,当用户退出登录时,进程也会被关闭。

      ./go-cqhttp 则是一个运行 go-cqhttp 的命令,其中 ./ 表示在当前目录下执行,go-cqhttp 是 go-cqhttp 的可执行文件名。因此,nohup ./go-cqhttp 的作用是在后台运行 go-cqhttp,并且忽略掉 Hangup 信号,这样即使当前用户退出登录,进程也会继续在后台运行。

      需要注意的是,在使用 nohup 命令运行程序时,程序的输出信息将不再显示在终端上,而是保存在当前目录下的 nohup.out 文件中,您可以使用 tail -f nohup.out 命令来实时查看输出信息。

    2. 进程守护:

      pm2 start ./go-cqhttp --name="go-cqhttp" 
      pm2 save 
      pm2 startup
      

      **pm2**是一个用于管理 Node.js 进程的工具,它可以帮助我们轻松地启动、停止、重启和监控 Node.js 进程。在这里,我们使用 **pm2**来启动 go-cqhttp 进程,并将其命名为 go-cqhttp,方便我们后续管理进程。使用 **pm2启动进程后,可以通过 pm2 list命令查看当前运行的进程列表,也可以通过 pm2 stoppm2 restartpm2 delete**命令来停止、重启、删除进程。

  5. 测试

    接下来我们进行http通信测试,首先需要在config.yml配置http通信

    如果你是本地服务器,配置IP地址以及端口号以127.0.0.1:5700为例,运行go-cqhttp。

    • 浏览器访问下面网址,测试使用机器人QQ发送消息给好友

      http://127.0.0.1:5700/send_private_msg?user_id=接收消息的好友QQ号码&message=这里输入发送的信息内容

      执行成功会返回一段响应数据{"data":{"message_id":xxxx},"retcode":0,"status":"ok"} 说明发送成功了

    • 给qq群发送消息测试,成功同样会返回上面一样的数据"status":"ok”

      http://127.0.0.1:5700/send_group_msg?group_id=接收消息QQ群号&message=这里输入发送的信息内容

更多详情内容,请访问go-cqhttp相关文档:https://docs.go-cqhttp.org/

第三步,配置NoneBot

直接进入正题,根据以下步骤进行None Bot的配置:

  1. 下载安装机器人依赖

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

    python3 -m pip install nb-cli
    

    如果没有安装的话,可以执行下面这段命令安装nonebot2

    python3 -m pip install nonebot2
    
  2. 安装cqhttp适配器

    python3 -m pip install nonebot-adapter-cqhttp
    

    nonebot 是一个基于 Python 的 QQ 机器人开发框架,它本身只提供了一些高级 API 和插件,方便开发者编写 QQ 机器人的功能。但是,与 QQ 服务器通信的底层协议实现是多种多样的,如 go-cqhttp、Mirai、CoolQ 等,这些协议实现之间的 API 不尽相同。因此,开发 QQ 机器人需要先选择一个合适的协议实现,然后再编写对应的适配器,以便将协议实现和 nonebot 框架连接起来,实现 QQ 机器人的功能。

    适配器可以理解为是一个桥梁,它的作用是将底层协议实现和 nonebot 框架连接起来,使它们能够互相通信。在使用 nonebot 框架开发 QQ 机器人时,需要先根据所选的底层协议实现,选择相应的适配器,然后根据适配器提供的 API 编写 QQ 机器人的功能。

    举个例子,如果您选择使用 go-cqhttp 作为底层协议实现,那么您需要安装 go-cqhttp,并选择 go-cqhttp 适配器。这个适配器将 go-cqhttp 和 nonebot 框架连接起来,使得您可以通过 nonebot 框架来编写 QQ 机器人的功能,并且 go-cqhttp 可以帮助您与 QQ 服务器通信。

    因此,在使用 nonebot 框架开发 QQ 机器人时,需要根据所选的底层协议实现,选择相应的适配器,并将其与 nonebot 框架结合使用,以实现 QQ 机器人的功能。

  3. 修改go-cqhttp配置

    修改配置 config.yml文件,找到如下位置,修改地址及端口号,后面nonebot机器人安装要用到的

    ......
    # 反向WS设置
      - ws-reverse:
          # 反向WS Universal 地址
          # 注意 设置了此项地址后下面两项将会被忽略
          universal: ws://127.0.0.1:53245/cqhttp/ws
          # 反向WS API 地址
          api: ws://127.0.0.1:53245/cqhttp/api
          # 反向WS Event 地址
          event: ws://127.0.0.1:53245/cqhttp/event
    ......
    
  4. 新建nonebot qq机器人项目

    如果你已经按照推荐方式安装了 nb-cli,使用它创建一个空项目:

    nb create
    
    

    根据引导进行项目配置,完成后会在当前目录下创建一个项目目录,项目目录内包含 bot.py

    如果未安装 nb-cli,使用你最熟悉的编辑器或 IDE,创建一个名为 bot.py 的文件,内容如下(这里以 onebot.v11适配器为例):

    import nonebot
    from nonebot.adapters.onebot.v11 import Adapter as ONEBOT_V11Adapter
    
    nonebot.init()
    app = nonebot.get_asgi()
    
    driver = nonebot.get_driver()
    driver.register_adapter(ONEBOT_V11Adapter)
    
    nonebot.load_builtin_plugins("echo")
    nonebot.load_from_toml("pyproject.toml")
    
    if __name__ == "__main__":
        nonebot.logger.warning("Always use `nb run` to start the bot instead of manually running!")
        nonebot.run(app="__mp_main__:app")
    
  5. 继续配置编辑 .env.prod 文件端口,这里的53245就是上面设置的cqhttp端口一致,第四行是超级管理员qq

    DRIVER=~fastapi
    HOST=127.0.0.1  # 配置 NoneBot 监听的 IP/主机名
    PORT=53245  # 配置 NoneBot 监听的端口
    DEBUG=true  # 开启 debug 模式 **请勿在生产环境开启**
    SUPERUSERS=["123456789", "987654321"]  # 配置 NoneBot 超级用户
    NICKNAME=["awesome", "bot"]  # 配置机器人的昵称
    COMMAND_START='["/"]'   # 配置命令起始字符
    

    在命令行使用如下命令即可运行这个 NoneBot 实例:

    # nb-cli
    nb run
    # 其他
    python3 bot.py
    

    运行后会产生类似如下日志:

    09-14 21:02:00 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
    09-14 21:02:00 [INFO] nonebot | Running NoneBot...
    09-14 21:02:00 [INFO] uvicorn | Started server process [1234]
    09-14 21:02:00 [INFO] uvicorn | Waiting for application startup.
    09-14 21:02:00 [INFO] uvicorn | Application startup complete.
    09-14 21:02:00 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:53245 (Press CTRL+C to quit)
    

至此,所有的配置都over了

我们来看一下最终效果:

NoneBot2,基于Python的聊天机器人_第2张图片

声明:本博客为基础学习性质,想要更加深入了解请自行研究官方文档

你可能感兴趣的:(python,笔记,python,机器人,NoneBot,CQHTTP)