就是比较感兴趣所以去研究了,不多说。
本来打算使用nonebot和go-cqhttp搭建的,但是经过一番尝试都没能成功登录QQ,之后才发现qq官方机器人现在已经开放了个人用户在qq群的机器人部署权限。
最终选择了以Nonebot-cli和qq官方机器人为基础进行搭建
注意Nonebot是基于python制作的,安装前要确认电脑上以安装python3.7或以上版本
Bot的部署与启动
安装Nonebot-cli
nonebot-cli建议使用pipx进行安装,前往这里查看pipx的安装教程
pipx install nb-cli
在QQ开放平台注册账号并申请机器人
点击这里前往qq开放平台
跟着官网的指示应该不会有什么问题,就不细说了。
申请机器人完成之后就可以前往沙箱配置设置机器人可以进入的群聊和频道,这里必须设置好。
创建nb项目与第一次启动
在控制台中进入你想要bot所在的文件夹,运行
nb create
跟着控制台输出内容的提示进行配置的初始化
注意搭建qq的bot需要适配器至少选择QQ(QQ官方机器人)
驱动器至少选择HTTPX(HTTPX驱动器)
和websockets(websockets驱动器)
插件储存位置我选在了当前文件夹下
虚拟环境建议选是
自带的插件随便选,我这里以echo举例
之后使用任何IDE打开项目文件夹中的.dev文件进行配置
第一次打开可以看到内容如下
ENVIRONMENT=dev
DRIVER=~httpx+~websockets
我们要在后面添加内容
QQ_IS_SANDBOX=true #如果主机在bot的白名单ip里就false,否则true
COMMAND_START=["/"] #触发bot反应的命令前缀
PORT=8070 #默认端口是8080,如果已经被占用就可以换一个
QQ_BOTS='[{ #以下是qqbot的详细配置,注意中括号用单引号包围
"id":"xxxx",
"token":"xxxxxxxxxxxx",
"secret":"xxxxxxxxxxxxxx", #这三个参数在机器人管理端的开发设置中可以查到,请注意保密不要泄露给别人
"intent":{
"c2c_group_at_messages":true #这里是配置bot可以接受群聊消息
#全部的intent配置项可以前往https://github.com/nonebot/adapter-qq查询
}
}
]'
请注意内容的格式不要打错了。直接复制可能会出奇奇怪怪的问题(如果你没出就当我没说
保存之后就可以运行bot了
nb run --reload #--reload可以使bot在检测到文件变化时自动重启,这样就不需要在写插件时手动重启了
运行结果如下图所示

记得重要信息打码
当看到[EventType.READY]这一条说明bot登录成功了,接下来可以使用/echo
命令检查bot的运行情况

echo命令的作用是让机器人回复一样的内容
插件的编写
先浅写一个随机数生成练练手
如果创建项目时选择的插件位置是项目文件夹,要注意一下插件所处的目录结构如下
bot1/ #bot项目文件夹
├── bot1/ #需要创建一个同名文件夹
│ └── plugins/ #插件文件夹
│ ├── plugin1.py #插件可以是单独的一个.py文件
│ └── plugin2/ #也可以是包含__init__.py和config.py的文件夹
│ ├── __init__.py #__init__.py为插件的主文件
│ └── config.py #config.py是配置
├── .env
├── pyproject.toml
├── README.md
└── 其他文件
如果选择的是src文件夹,则位置在/src/plugins中
这里就先从最简单的开始,在plugins文件夹中创建一个range.py文件作为插件,之后打开此文件进行内容的编写。
创建事件响应器
from nonebot import on_command
range=on_command("range")
这样range就是一个对/range
响应的事件响应器
事件的处理
nonebot的事件响应器提供了一个装饰器,直接可以将其用于主函数
from nonebot.adapters import Message
from nonebot.params import CommandArg
@range.handle() #装饰器
async def ran(args:Message = CommandArg()): 这里使用args作为参数,args的内容为CommandArg()
pass #这里写主函数内容
这样子获取的输入args
的内容是一串复杂的Message类型变量,如果想要把他变成纯文本类型,可以使用
a=args.extract_plain_text()
之后便可以对a进行常规处理,最终输出的方式如下
await range.finish("xxx")
以上就是编写一个最简单的插件所需的内容
这里是我自己编写的随机数插件的源码,水平比较差还请多多指教
from nonebot import on_command # type: ignore
from nonebot.adapters import Message
from nonebot.params import CommandArg
import random
def isnum(a): #判断内容是否为数字
result=True
for i in a:
for c in i:
if c in "1234567890-":
pass
else:
result=False
break
return result
range=on_command("range")
@range.handle() #装饰器
async def ran(args:Message = CommandArg()):
a=args.extract_plain_text() #将输入转为文本
a=a.split()
if len(a)==0: #判断情况
await range.finish("请输入范围") #输出
elif isnum(a):
if len(a)==1:
if int(a[0])<=1:
await range.finish("请输入一个大于1的数")
else:
await range.finish(f"1到{a[0]}的随机数为{random.randint(1,int(a[0]))}")
elif len(a)==2:
if int(a[0])>int(a[1]): a[0],a[1]=a[1],a[0]
await range.finish(f"{a[0]}到{a[1]}的随机数为{random.randint(int(a[0]),int(a[1]))}")
else:
b=random.randint(0,len(a)-1)
await range.finish(f"选择的是{a[b]}")
elif len(a)==1:
await range.finish("只有一个怎么选啊")
else:
b=random.randint(0,len(a)-1)
await range.finish(f"选择的是{a[b]}")
实际效果如下

随机数插件测试
以上就是基于nonebot和qq官方bot的搭建过程了,其他插件的开发我后续做的时候再记在别的地方吧。