NoneBot2,基于Python的聊天机器人
创始人
2024-06-01 01:11:53
0

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测试

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myB3jFx3-1678427983272)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a67a6491-bb37-4e64-92ad-72f67be00c5f/Untitled.png)]

    安装成功

第二步,配置go-cqhttp

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

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

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

    系统类型可执行文件压缩文件
    Intel 版 MacosNot availablego-cqhttp_darwin_amd64.tar.gz
    M1 版 MacosNot availablego-cqhttp_darwin_arm64.tar.gz
    32 位 LinuxNot availablego-cqhttp_linux_386.tar.gz
    64 位 LinuxNot availablego-cqhttp_linux_amd64.tar.gz
    arm64 LinuxNot availablego-cqhttp_linux_arm64.tar.gz
    armv7 LinuxNot availablego-cqhttp_linux_armv7.tar.gz
    32 位 Windowsgo-cqhttp_windows_386.exego-cqhttp_windows_386.zip
    64 位 Windowsgo-cqhttp_windows_amd64.exego-cqhttp_windows_amd64.zip
    arm64 Windowsgo-cqhttp_windows_arm64.exego-cqhttp_windows_arm64.zip
    armv7 Windowsgo-cqhttp_windows_armv7.exego-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_V11Adapternonebot.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了

我们来看一下最终效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeRI14H8-1678427983275)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d384c2a2-882d-452c-84b3-1bfe17e49279/Untitled.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFxZ7IWW-1678427983276)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4ec65a12-3b0e-41bb-9a33-a8d0dc776601/Untitled.png)]

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

相关内容

热门资讯

诚信的英语作文【经典3篇】 篇一:诚信的英语作文In today's society, integrity plays a cr...
英语作文的文章的正文【精选3... 英语作文的文章的正文 篇一Global Warming and Its Effects on the...
黑骏马英语读后感【通用3篇】 黑骏马英语读后感 篇一《黑骏马》是法国作家让·吉诺的作品,通过讲述一个关于马和人之间的深厚情感的故事...
我的爱好英语作文【通用6篇】 我的爱好英语作文 篇一我的爱好英语英语是我最喜欢的学科,也是我的爱好之一。我对英语的热爱始于我上小学...
浙江今年四级英语作文【最新3... 浙江今年四级英语作文 篇一Title: The Importance of Environmenta...
国庆节英语作文 精选国庆节英语作文10篇  在日常学习、工作抑或是生活中,许多人都有过写作文的经历,对作文都不陌生吧...
谜语用英语怎么读【实用3篇】 谜语用英语怎么读 篇一How to Read Riddles in EnglishIntroduct...
火星的英语作文(优选4篇) 火星的英语作文 篇一Exploring the Mysteries of MarsMars, als...
我的饮食习惯英语作文my e... 我的饮食习惯英语作文篇一:My Eating HabitsI have always been co...
写我的好朋友英语作文【最新6... My Best Friend - Part 1I would like to introduce m...
四年级英语作文50字(通用3... 四年级英语作文50字 篇一:My Summer VacationI had a great summ...
忙碌的周末 英文作文(推荐3... Busy WeekendEssay OneLast weekend, I had a very bu...
英语作文(优秀6篇) 英语作文 篇一Title: The Importance of Learning a Second ...
练字的英语作文【通用6篇】 练字的英语作文 篇一:The Benefits of Practicing CalligraphyC...
番茄炒鸡蛋英语作文(实用4篇... Tomato and Egg Stir-Fry: A Classic Chinese DishTom...
my best friend... my best friend作文(精选23篇)  在现实生活或工作学习中,大家都经常接触到作文吧,作...
我的家庭英语作文(推荐6篇) 我的家庭英语作文 篇一My FamilyMy family consists of four mem...
春节的英语作文(优质6篇) 春节的英语作文 篇一The Spring FestivalThe Spring Festival, ...
端午节初中英语作文(精彩6篇... 端午节初中英语作文 篇一The Dragon Boat FestivalThe Dragon Boa...
作文 外语与母语(经典3篇) 作文 外语与母语 篇一外语与母语的重要性语言是人类交流的工具,而外语和母语则是我们生活中最常使用的两...