Record study record life
QQ机器人搭建与部署
QQ机器人搭建与部署

QQ机器人搭建与部署

采用nonebot+gocqhttp搭建qq机器人,python编写脚本

机器人搭建所需部件官网参考链接

 

准备

什么是nb?什么是gocq?

nb文档: https://v2.nonebot.dev gocq文档: https://docs.go-cqhttp.org/ 上面是可查阅官方文档

gocq就是一个QQ,即你需要用它来登录,接收消息,发送消息;而nb则用来实现机器人的各种功能。 下面他们的项目地址

nb:https://github.com/nonebot/nonebot2 gocq:https://github.com/Mrs4s/go-cqhttp

go-cqhttp releases下载连接

b站博主搭建教学视频

guthub搭建qq机器人开源项目参考

nonebot官网qq群:768887710

go-cqhttp

  1. 前端从腾讯的服务器上接收用户的信息(或其他)
  2. 将信息传递给后端
  3. 后端对信息进行分析,调用对应的模块进行处理
  4. 后端将处理结果推送给前端
  5. 前端将处理后的结果重新发送给腾讯的服务器(或其他)

机器人发送信息用正向http

反向则是在本地搭建一个服务器,比如使用flask或者Django搭建一个路由 配置好django的urls后,在view中接受信息,即可监听事件

原理:反向http请求是直接搭建一个服务器,cqhttp监听QQ,比如别人给你发送了一个QQ信息,然后cqhttp就会把这个信息使用post的方式发送到你服务器里面,监听和发送在配置的时候不能是一个端口

 


机器人配置

安装nb

  • 安装脚手架 通过脚手架安装(官方推荐):
    pip install nb-cli
    

    安装脚手架时会自动安装nb

    安装时出现错误:

    • python版本不对
    • 缺少Microsoft Visual C++ 环境
    • …(请仔细看报错)
  • 安装适配器(使用脚手架安装时已经安装)
    pip install nonebot-adapter-onebot
    

安装gocq

deepin

我们打开工作路径(这里我新建一个bot文件夹,bot下新建cq文件夹并打开

前往 Release下载最新版,注意与你的操作系统匹配

我这里下载 go-cqhttp_1.0.0-beta8-fix2_linux_amd64.deb, 并安装。

  • cq目录下执行go-cqhttp
  • 选择反向WebSocket回车
  • 此时目录下会生成配置文件config.yml
  • 对其进行配置:
    • QQ号及密码
    • 反向ws地址

使用任何适宜的编辑器对配置文件进行编辑,在行4、5填写要用来做机器人的QQ账号与密码。行96 内容进行修改:

universal: ws://your_websocket_universal.server

修改为

universal: ws://127.0.0.1:8080/onebot/v11/ws

8080是端口号,根据实际需求填写,修改完保存即可,再次执行./go-cqhttp,即可登录成功(有的账号需要扫码登录,根据提示即可)

如图代表登陆成功,下方黄色提示暂且放下不管。

 

其他Linux发行版

下载对应release后:

  • 使用tar -xzvf [文件名]解压
  • cd设置工作目录为解压后的文件夹
  • 再执行 ./go-cqhttp
  • 按照提示配置config.yml与上方配置相同

创建nb项目

返回bot,在此处打开终端并运行:

nb create  出错则使用python3 -m nb_cli

此时按照如下步骤创建项目

  • 输入项目名称 我这里输入了robot
  • 使用 选择src文件夹
  • 选择一款预置插件,我按下空格选择echo,回车
  • 按下空格键选择noebot v11回车 (很多人这里不注意空格)

请使用任何适宜的软件(如记事本(不推荐))打开env.dev并做出修改,保证你在前面的步骤中对gocq配置的端口与此文件中的端口保持一致

PORT=8080

修改为

PORT=你使用的端口

那么现在在robot下打开终端,输入以下命令运行nonebot2:

nb run

此外,在pycharm中运行bot.py也是可行的

注意,需要让gocq和nb都运行,linux可使用进程守护一类的工具让他们后台运行,我个人是使用tmux的进程守护来解决这个问题

如图表示运行成功,你会发现gocq中的黄色提示变成了:

已连接到反向Web…..

也就是说,nb与gocq之间可以通信了

注意腾讯云服务器可能出现长消息的报错

大功告成

现在,向你的机器人发送 /echo hello 看看会发生什么吧,不出意外地,你的机器人向你回复了hello

nonebot2机器人的配置

.env.*的配置

.env.*文件为配置文件,可在任何插件中加载,官方示例

HOST=0.0.0.0  # 配置 NoneBot 监听的 IP/主机名
PORT=8080  # 配置 NoneBot 监听的端口
SUPERUSERS=["123456789", "987654321"]  # 配置 NoneBot 超级用户
NICKNAME=["awesome", "bot"]  # 配置机器人的昵称
COMMAND_START=["/", ""]  # 配置命令起始字符
COMMAND_SEP=["."]  # 配置命令分割字符

# Custom Configs
CUSTOM_CONFIG1="config in env file"
CUSTOM_CONFIG2=  # 留空则从系统环境变量读取,如不存在则为空字符串

你可以将其复制到.env.dev

  • 其中COMMAND_START=["/", ""]是对命令起始字符进行配置,当你遇到 怎么让命令没有/也能被机器人识别这个问题时,请对它进行配置。这样,你的命令前就不同加/
  • 形如custom这样的配置,你可以自定义,只要确保为JSON格式即可,且大小写不敏感, 你可以配置如:
    BAN=["123456"]
    

    则在插件中可通过以下方式来调用(后续使用插件会讲)

    import nonebot
    myconfig = nonebot.get_driver().config.ban
    

其他配置

就我个人而言,使用.env.*是最常使用的,此外还可通过系统环境变量、bot.py来配置,参见官方:基本配置


nonebot2机器人的使用

bot.py中默认生成的内容如下

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import nonebot
from nonebot.adapters.onebot.v11 import Adapter as ONEBOT_V11Adapter

# Custom your logger
#
# from nonebot.log import logger, default_format
# logger.add("error.log",
# rotation="00:00",
# diagnose=False,
# level="ERROR",
# format=default_format)

# You can pass some keyword args config to init function
nonebot.init()
app = nonebot.get_asgi()

driver = nonebot.get_driver()
driver.register_adapter(ONEBOT_V11Adapter)

nonebot.load_builtin_plugins("echo")

# Please DO NOT modify this file unless you know what you are doing!
# As an alternative, you should use command `nb` or modify `pyproject.toml` to load plugins
nonebot.load_from_toml("pyproject.toml")

# Modify some config / config depends on loaded configs
#
# config = driver.config
# do something...


if __name__ == "__main__":
nonebot.logger.warning("Always use `nb run` to start the bot instead of manually running!")
nonebot.run(app="__mp_main__:app")

阅读注释后(看不懂请使用翻译)我们大可去掉其中的注释,改为:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
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")

这里的 nonebot.load_builtin_plugins("echo") 是加载此前选择的预置插件,剩下是写插件

编写插件

 

参考视频链接

[bot教学二]-nonebot聊天bot的插件编写哔哩哔哩bilibili

赞赏

微信赞赏 支付宝赞赏

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

一条评论