
QQ机器人保姆级平民搭建方法
 如果你仅想使用python实现机器人的功能而不考虑其他的(黑产用途、手搓轮子之类的),请继续阅读
如果不是 那你完全没必要读下去
如果在阅读时发现了我的错误 烦请在评论区提出
本人技术不佳 还希望来访大佬指教
写在前面
本文由于nonebot版本更新,部分内容已不再适用,请转至基于Nonebot2和go-cqhttp的机器人搭建 新
概述
本文将叙述如何在windows下使用Nonebot2(下称nb)和go-cqhttp(下称cq)创建QQ机器人 ,若你想使用nb和cq创建机器人,你需要:
,若你想使用nb和cq创建机器人,你需要:
- Python环境(3.7.3以上)
- Python能力
- 读文档能力
- Linux能力(部署于linux)
- …
linux下部署也是一样的,
准备
什么是nb?什么是cq?
关于这部分内容,你可以从他们的官网找到:  
nb文档: https://v2.nonebot.dev
cq文档: https://docs.go-cqhttp.org/
你需要记住他们,因为你需要随时查阅文档
简单粗暴来说,cq就是一个QQ,即你需要用它来登录,接收消息,发送消息;而nb则用来实现机器人的各种功能。
如下是他们的项目地址,记得去点个star哦~  
nb:https://github.com/nonebot/nonebot2
cq:https://github.com/Mrs4s/go-cqhttp
创作本文时,nb最新版本为2.0.0a16,cq最新版本为v1.0.0-beta8-fix1,请注意内容时效!
nb 2.0.0 b1 已发版 其与a16有部分差别,注意查看官方文档
开始
安装nb
- 安装脚手架 
 通过脚手架安装(官方推荐):- 1 - pip install nb-cli - 安装脚手架时会自动安装nb - 安装时出现错误: - python版本不对
- 缺少Microsoft Visual C++ 环境
- …(请仔细看报错)
 
- 安装适配器(使用脚手架安装时已经安装) - 1 - pip install nonebot-adapter-cqhttp 
安装cq
我们打开工作路径(这里我新建一个bot文件夹,bot下新建cq文件夹并打开  
前往 Release下载最新版,注意与你的操作系统匹配
我这里下载 go-cqhttp_windows_amd64.exe, 更名为go-cqhttp.exe,双击启动。
这里按照提示点确定,最后会在当前目录生成一个go-cqhttp.bat的批处理文件
双击运行批处理文件,选择 3 反向Websocket 回车,此时会在当前文件夹生成 config.yml的配置文件
使用任何适宜的编辑器对配置文件进行编辑,在行4、5填写要用来做机器人的QQ账号与密码。行96 内容进行修改:
universal: ws://your_websocket_universal.server
修改为
universal: ws://127.0.0.1:8080/cqhttp/ws
8080是端口号,根据实际需求填写,修改完保存即可,再双击go-cqhttp.bat批处理文件,即可登录成功(有的账号需要扫码登录,根据提示即可)
如图代表登陆成功,下方黄色提示暂且放下不管。
创建nb项目
返回bot,在此处打开cmd并运行:
| 1 | nb create | 
此时按照如下步骤创建项目
- 输入项目名称我这里输入了robot
- 使用 ↓选择src文件夹
- 输入 y回车
- 按下空格键选择cqhttp回车
 (很多人这里不注意空格,还反过来问我觉得我有问题)
请使用任何适宜的软件(如记事本)打开env.dev并做出修改,保证你在前面的步骤中对cq配置的端口与此文件中的端口保持一致
PORT=8080
修改为
PORT=你使用的端口
那么现在在robot下打开cmd,输入以下命令运行nonebot2:
| 1 | nb run | 
此外,在pycharm中运行bot.py也是可行的
注意,需要让cq和nb都运行,linux可使用进程守护一类的工具让他们后台运行,我个人是宝塔面板中的进程守护来解决这个问题
如图表示运行成功,你会发现cq中的黄色提示变成了:
已连接到反向Web…..
也就是说,nb与cq之间可以通信了
大功告成
现在,向你的机器人发送 /echo 123 看看会发生什么吧,不出意外地,你的机器人向你回复了123
nonebot2机器人的配置
.env.*的配置
.env.*文件为配置文件,可在任何插件中加载,官方示例
| 1 | HOST=0.0.0.0 # 配置 NoneBot 监听的 IP/主机名 | 
你可以将其复制到.env.dev中
- 其中 - COMMAND_START=["/", ""]是对命令起始字符进行配置,当你遇到- 怎么让命令没有/也能被机器人识别这个问题时,请对它进行配置。
- DEBUG=true表示开启debug模式,当你对在进行如编写插件等的操作时,对文件做出了修改,保存文件后,nb会自动重启
- 形如custom这样的配置,你可以自定义,只要确保为JSON格式即可,且大小写不敏感, 
 你可以配置如:- 1 - BAN=["123456"] - 则在插件中可通过以下方式来调用(后续使用插件会讲) - 1 
 2- import nonebot 
 myconfig = nonebot.get_driver().config.ban
其他配置
就我个人而言,使用.env.*是最常使用的,此外还可通过系统环境变量、bot.py来配置,参见官方:基本配置
nonebot2机器人的使用
相信你再前面的章节中,已经对 .env.dev做出了修改,这里不再赘述
bot.py中默认生成的内容如下
| 1 | #!/usr/bin/env python3 | 
我们大可去掉其中的注释,改为:
| 1 | #!/usr/bin/env python3 | 
这里的 nonebot.load_builtin_plugins() 是加载本地插件,我们暂时搁置,现在讲讲如何使用别人写好的插件
使用商店中的插件
在nb的商店中,有很多插件,比如这个工作性价比插件
- 安装方法一 - 点击复制安装命令,你的剪贴板会复制这段命令: - 1 - nb plugin install nonebot_plugin_workscore - 这段命令你需要在 - robot文件夹下,打开cmd执行,他会安装插件并将配置写进- pyproject.toml中,这样你无需修改- bot.py即可在nb运行的时候加载这个插件
- 安装方法二 
 若你在方法一中遇到了安装问题,一般情况下,你可以将上述命令视作- 1 - pip install nonebot_plugin_workscore - 在任何打开的cmd中都可以执行这段命令,而值得注意的是: 
 如果你使用了方法二,你需要在- bot.py中的- nonebot.load_from_toml("pyproject.toml")前添加一句:- 1 - nonebot.load_plugin("nonebot_plugin_workscore") - 此时你的 - bot.py应该是:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16- #!/usr/bin/env python3 
 # -*- coding: utf-8 -*-
 import nonebot
 from nonebot.adapters.cqhttp import Bot
 driver = nonebot.get_driver()
 driver.register_adapter("cqhttp", Bot)
 nonebot.load_builtin_plugins()
 
 nonebot.load_plugin("nonebot_plugin_workscore")
 
 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_plugin_workscore” 这一插件 
tips: 多数情况下,在插件右上角的图标中进入他的仓库页面,你可以找到插件的详细用法
完成安装后,重启nb,你会看到
表示 “nonebot_plugin_workscore” 插件已经成功导入,在插件的仓库页面我们可以看到它的用法:
这里写的不是很详细,意思是需要艾特机器人并说算性价比即可,或者叫机器人昵称并说算性价比,
编写插件
须知
我们回顾一下我们的目录结构
| 1 | bot | 
cq在之前的操作中已经完成了他的使命,不再讨论。
robot下的src文件夹是你你再进行 nb create 的操作时自动生成的,若没有 src 文件夹,那必定会有一个 与项目名相同的文件夹,按照我的教程来说,在 robot下还有一个 robot文件夹。
继续拿 src 文件夹来说,在它下面有一个 plugins 文件夹,是插件目录,文件夹里的插件会在 nb启动时被加载。
这是在nb create 时配置好的,你可以在 pyproject.toml 看到:
| 1 | [nonebot.plugins] | 
表示这个nb项目的插件目录是 src/plugins 
接下来我将演示一个简单的插件编写,仅提供入门nb的一个思路,其他操作将写在后面,或另撰新文。
开始
官方推荐使用python包文件形式创建插件,即 :一个插件为一个文件夹,文件夹名即插件名,下含 __init__.py的文件以及其他文件,为一个合法的python包。我们创建一个名为 first_plugin 的插件,欲用它来调用一个每日早报的接口:
| 1 | src | 
以pycharm为例,在创建插件时,可选择新建下的 python包,该操作会自动生成 __init__.py:
编写
> askjson.py
我们先对askjson.py 进行编写(其实这种简单地操作没必要独立出来一个askjson文件,这里只是示例)
| 1 | import httpx | 
上述代码中使用了异步的httpx而不是requests:数据获取应尽量使用异步处理。我们访问 https://api.iyk0.com/60s这个接口,该接口会返回:
| 1 | { | 
故我们在调用 get_url()时,会返回早报的图片链接(接口正常的情况下)
> __init__.py
在该文件中编写各类事件响应及处理逻辑。
我通常默认阅读本文的宁具有一定python基础,故某些点不做解释
通常,最常见的开始姿势如下:
| 1 | import nonebot | 
- 第2行导入的on_command注册一个消息类型的命令处理器,也就是说,让机器人识别你的命令需要用到他。logger是nb 日志记录器对象。详见: NoneBot.log 模块
- 第7行中的写法中: - 60s表示命令名
- aliases表示命令别名,即- 60s、- 早报、- 六十都会响应这个事件(- 60s哈哈哈、- 早报xxx这类消息也会响应,若要只有- 60s三个字才响应,则可以使用- on_regex正则,或者进入事件后再判断)
- priority表示优先级,数值越小越优先
 
- 第8行,紧接着 - @sixty.handle()sixty被事件响应器的装饰器装饰从而成为事件响应器的事件处理函数,- handle()是简单的为事件响应器添加一个事件处理函数,这个函数将会在上一个处理函数正常返回执行完毕后立即执行。
事件处理函数中,除bot外都是可选的
- 第10行调用我们编写的函数获取到链接,12行中 - send()函数根据- event向触发事件的主体发送消息。点我查看参数- 我们在注册事件时传入了Event故这里可以直接 - sixty.send(message=xxx),我们也可以:- bot.send(event=Event,message=xxx)- 其中 - message参数是我们要发送的消息,可以是纯文本- message="你好",这里使用的- MessageSegment是nb对cq协议的适配,可用于发送CQ码等(个人理解),即:- 1 - await sixty.send(message=MessageSegment.image(img_url)) - 等价于 - 1 
 2
 3
 4
 5
 6
 7- rely=[{ 
 "type": "image",
 "data": {
 "file": img_url
 }
 }]
 await sixty.send(message=rely)- 如果你要发送文本+图片,如下写法皆可: - 1 - await sixty.send(message="今日早报"+MessageSegment.image(img_url)) - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- rely=[{ 
 "type": "text",
 "data": {
 "text": "今日早报"
 }
 },
 {
 "type": "image",
 "data": {
 "file": img_url
 }
 }]
 await sixty.send(message=rely)
 
- 现在,运行nb,向它发送 - 早报看会发生什么- 成了,此时你将在nb日志界面看到 - 其中包含了: 
- tips:发送本地图片: - 利用cq+nb作为机器人发送本地图片时,若使用相对路径,要记得 路径是相对cq的 而不是相对nb项目的 - 1 - await sixty.send(message=MessageSegment.image("file:///路径")) - 1 
 2
 3
 4
 5
 6
 7- rely=[{ 
 "type": "image",
 "data": {
 "file": "file:///路径"
 }
 }]
 await sixty.send(message=rely)
 
其他
官方在这里使用 pydantic 库对插件进行配置操作 :点击查看 。这里暂时用不到,有需要请阅读官方文档。
2021年12月25日00:40:40待续&考试加油

















 
          
         
          
        