Blockbot beginning

huangx607087基于GoCq的QQ-Bot 开发日记

0x00.About

先来说说自己为什么这么想要个机器人。

2014年初,自己家里安装了wifi,然后自己当年的一部小手机联想A278t就可以联网了。于是我就可以下载了一个手机QQ开始玩(注:自己QQ虽然是2010年申请的,但自己在2010-2013年年底基本没用过QQ)。然后当年自己喜欢玩开罗游戏,单机的,一个游戏不到10M,然后加了几个讨论群。其中有个讨论群里一个自动聊天机器人,带签到功能和各种娱乐功能的。自己就感觉很好玩。然后当时就下了个coolQ,顺带着搞了点插件,放在一个群里面。到现在打开家里Windows 7的旧电脑,当年的磁盘内部文件都还在呢!

0-1

然后高考结束发现coolQ这个玩意SPFA了,感叹自己以前生活回不去之余,也就没啥搞的了(。不过开学发现Lakphy和PiCpo两位开发大佬玩树莓派搞了个基于Mirai的机器人驮载在Ubuntu系统的树莓派上,自己也很羡慕,7月4日Lakphy帮我搞的时候搞崩了。中间也搞了几次很烦躁,因为都失败了。昨天有幸在官方群里有大佬手把手教我搞,在群里大佬们的帮助下,我搞成功了。。特此写下这篇文章给以后还想开发机器人的人进行参考学习,或者给已经开发好自己bot的人开辟另一条道路。

由于自己主机已经装有Python3.7.4和很多为了打CTF的包,加上很多复杂的环境变量,为了不与自己的Windows 10实体机上的内容冲突,机器人驮载在了虚拟机上。(因为Win10的激活脚本我没搞到加上配置要求太高,Win7很多系统上的内容太旧了,并且用得不习惯,Linux我也不怎么熟悉)。于是选择与Windows 10共同点较多的 Windows 8系统作为自己Bot的Server。

本教程基本上是自己做过一遍后然后手把手教的,一切从0环境开始配起!机器人服务Server使用Windows7/8/10系统。11的可以效仿,按道理是可以的,不过我没试过

nonebot手册网址 点这里

0x01.环境的准备与配置

1o01 开发环境一览

Windows 7/8/10 系统,本博客使用的是Windows 8虚拟机系统。当然你也可以使用你Windows 7/8/10实体机,Linux大佬可以使用树莓派的Linux系统。

个人建议如果使用虚拟机,找不到Windows 10还是选择Windows 7比较好,Windows 8安装比较麻烦

Python 3.9+和VsCode,本样例中使用的是Python 3.9.6,一定要保证Python版本高于3.9

如果你已经满足了开发环境,请跳过整个0x01环境配置阶段 。

下图是空空的一个Windows 8 的截图,然后我们就可以一步一步配置环境了。可以看出,Windows 8界面跟Windows 7还是挺像的

注:如果想使用Windows虚拟机作为机器人的Server的话,可以在这里寻找激活脚本。

由于Windows 8自带浏览器是IE 11,用的比较low,我下了个Edge浏览器

1-1

1o02 Python的下载与配置(包括pip)

登录Python下载官网,选择 Python 3.9.6 ,下载页面建议选择Windows Installer(64-bit)

1-2-1

开始安装的时候,建议把下面两个勾都打上,然后点Install Now等待安装成功

1-2-2

在桌面上创建一个1.py文件右击用IDLE进行编辑,如果能按F5运行成功就算安装成功了。

1-2-3

当然,Python到现在还没有结束,我们需要配置一下Python pip。

直接在C盘根目录下搜python39,然后打开就行了

1-2-4

打开Python39这个文件夹,再打开Scripts,可以看到pip在这个文件夹中。

1-2-5

右击pip,可以看到pip的位置,将这个位置完全复制下来。

1-2-6

右击“这台电脑”,(Win7是我的电脑/Win10是此电脑),然后依次点击”高级系统设置“、”环境变量“。然后在环境变量中找到Path,点编辑。

1-2-7

将鼠标光标移到最后前面的是系统变量,千万不要删。不过Windows 10的系统变量是表格的形式,很方便

在后面加一个分号,然后把刚才复制pip的位置加到后面就行了。

1-2-8

然后我们打开cmd,输入pip,如果能出现pip菜单说明pip配置成功。配置成功截图如下

1-2-9

1o03 VSCode的下载与配置

使用VSCode,是为了在后面能够更好的编辑Python文件和各种配置文件

1-3-1

直接点机右上角Download,然后选择Windows 64版本(Linux选择Linux版本)进行下载安装即可。这里安装时可以直接无脑地Next。

到此为止,我们的必要环境配置完成。下面我们就来真正地来准备我们的机器人吧。

0x02 机器人的配置

2o01 初始内容

配置机器人首先我们会选择我们机器人的文件夹。(此处我直接选择了D盘根目录下面因为我用的是虚拟机)。

2-1-1

打开我们需要的文件夹,为方便期间,最好保证文件夹一开始为空

2-1-2

2o02 通过脚手架安装nonebot

打开cmd,在cmd中输入 pip install nb-cli 。非管理员用户需要在后面加上--user,Windows后面所有命令均如此。

2-2-1

然后他就会给你安装一大堆必要的东西。。。

安装成功的标准是你在python中输入import nonebot 不报错并且你在cmd中输入nb 会出现如下界面

2-2-2

同理,我们还要安装适配器,输入命令:pip install nonebot-adapter-cqhttp,按回车安装。装完这个后同时装一下pip install nonebot-adapter-gocq

2-2-3

这两个东西安装好之后,我们可以将内容切换到我们的文件夹中了

Windows CMD中有几个命令注意一下

1
2
3
d: (表示直接将cmd所在磁盘切换到D盘)
cd abc (表示打开所在位置的abc文件夹)
dir (查看该目录下所有文件,不是ls

然后我们就可以切换到我们要配置机器人的地方了。我这边选择的就是D盘根目录。并在此输入nb create后按回车

2-2-4

然后输入我们的项目名称,这里叫example,然后按回车

2-2-5

第二步问你文件夹名字是什么,选1和2都行,不过建议选1,因此如果左边灰色的a在1旁边,直接按回车即可

2-2-6

第三步,在里面输入一个y再按回车。

2-2-7

第四步:当灰色的a在cqhttp左边时,先按空格,然后按回车

2-2-8

然后我们的目录下就多了个文件夹,打开看看有这些东西。

2-2-9

2o03 配置Gocq

访问截图中的网址下载,下载go-cqhttp_windows_amd64.exe,19.9M的那个

2-3-1

然后exe下载好后,在example外面建立一个gocq,将下载下来的exe放进去

2-3-2

然后把该exe在cmd中运行。如果它让你输数字的话,只输入一个3就行了!

2-3-3

然后下面就要注意了,打开文件夹,里面有个config.yml文件,用VSCode打开。然后在最前面的指定位置输入你的机器人的QQ账号,密码保持空着

2-3-4

然后在最后的ws-reverse一栏里的内容改成这个样子,保存即可。

2-3-5

然后所有该配置的内容我们就都配置好了。

2o04 启动bot

重启gocq,第一次运行需要扫码登录

2-4-1

登录成功场景。此时如果挂着肯定会报错,因为还有个东西没开

2-4-2

再开一个cmd,进入example文件夹,然后给命令nb run

2-4-3

如果出现accepted的字样,并且我们开的第一个cmd不再出现新的”无法连接”的报错,说明此时已经好了。

2-4-4

私聊或者在群里@机器人 发送/echo hello world,那我们就有第一次对话了。

2-4-5

0x03 机器人插件开发

插件模板代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from nonebot import on_command
from nonebot.rule import to_me
from nonebot.typing import T_State
from nonebot.adapters import Bot, Event

weather = on_command("天气", rule=to_me(), priority=5)


@weather.handle()
async def handle_first_receive(bot: Bot, event: Event, state: T_State):
args = str(event.get_message()).strip() # 首次发送命令时跟随的参数,例:/天气 上海,则args为上海
if args:
state["city"] = args # 如果用户发送了参数则直接赋值


@weather.got("city", prompt="你想查询哪个城市的天气呢?")
async def handle_city(bot: Bot, event: Event, state: T_State):
city = state["city"]
if city not in ["上海", "北京"]:
await weather.reject("你想查询的城市暂不支持,请重新输入!")
city_weather = await get_weather(city)
await weather.finish(city_weather)


async def get_weather(city: str):
return f"{city}的天气是..."

打开我们的example机器人目录,然后发现里面还有个example,再打开这个文件夹还有个plugins,将这个代码保存成py文件,拖入就可以用了。

可以看到加载了weather的插件

3-1-1

这个时候我们的bot就可以按照里面的算法来做事了。当然,以这个插件为模板,我们可以开发更多的插件。

一定要注意的是,只有string类型的东西才能被发送出去,如果不是string类型(比如想发送数字)要先转成string类型!然后才能发出去!

3-1-2


Blockbot beginning
http://example.com/2021/07/17/Blockbot-beginning/
作者
huangx607087
发布于
2021年7月17日
许可协议