前言

之前看到博客群里出现了很多机器人,感觉挺有趣的,并且github上有许多现成的框架和插件库,群友们也有相关的文章,于是便自己搭建了一个机器人,并添加了一些新功能。

相关项目和相关资料请参考参考项目及文章,在此对开源项目开发者和相关文章作者表示感谢。

此教程旨在以更简单并容易理解的方式使用go-cqhttp协议库和ZeroBot-Plugin插件合集搭建一个QQ bot(ATRI)。

注:由于源项目持续更新中,因此本教程可能会有错误;并未使用docker或screen部署,如果需要请参考参考项目及文章

准备条件

  1. linux服务器及相关知识(windows服务器也可,但不建议)
  2. python 3.8.0或以上版本及相关知识
  3. golang 1.16或以上版本及相关知识
  4. ssh工具
  5. git
  6. 一个qq号 (建议小号)
  7. 会使用搜索引擎

以上环境请自行安装,后续操作默认已安装完毕。

如果你喜欢较为直观德观察bot运行状况,可以使用图形化界面。

开始配置

本文主要使用go-cqhttp协议库和ZeroBot-Plugin插件合集搭建,关于它们的简单介绍如下:

go-cqhttp: 基于 Mirai 以及 MiraiGoOneBot Golang 原生实现

ZeroBot-Plugin : ZeroBot-Plugin 是 ZeroBot 的 实用插件合集

简单地说,go-cqhttp协议库类似于bot的服务端,ZeroBot-Plugin插件则类似于bot的后台

服务端可以向后台发送数据,并提供api供后台调用,以达到消息的发送和接收。go-cqhttp现已经实现大多数QQ功能,可查阅go-cqhttp 帮助中心

后台负责对bot接收的消息进行处理,通过编写各种功能的插件或者程序来实现各种的功能。(这意味着你并不一定要使用ZeroBot-Plugin,其他支持go-cqhttp服务的插件也可以搭建bot,也并不限制语言),本文使用的是基于go语言开发的ZeroBot-Plugin插件。如果你并不满足于它提供的功能,那建议自己添加。

搭建go-cqhttp

1、打开一个命令行/ssh,在你喜欢的位置新建一个文件夹bot,并下载go-cqhttp(当前是v1.0.0-beta6)

1
2
mkdir bot && cd bot
wget https://github.com.cnpmjs.org/Mrs4s/go-cqhttp/releases/download/v1.0.0-beta6/go-cqhttp_linux_amd64.tar.gz

2、解压并赋权

1
2
tar -zxvf go-cqhttp_linux_amd64.tar.gz
sudo chmod 777 go-cqhttp

3、运行go-cqhttp(建议使用命令运行,而不是双击)

1
./go-cqhttp

第一次运行时,会出现以下信息:

1
2
[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在
[INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

显然是让我们修改config.yml这个文件后再次运行go-cqhttp,将config.yml修改为如下内容:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# go-cqhttp 默认配置文件

account: # 账号相关
uin: 1233456 # QQ账号
password: '' # 密码为空时使用扫码登录
encrypt: false # 是否开启密码加密
status: 0 # 在线状态,详情请查看下方的在线状态表
relogin: # 重连设置
# disabled: false
delay: 3 # 重连延迟, 单位秒
interval: 0 # 重连间隔
max-times: 0 # 最大重连次数, 0为无限制

# 是否使用服务器下发的新地址进行重连
# 注意, 此设置可能导致在海外服务器上连接情况更差
use-sso-address: true

heartbeat:
# disabled: false # 是否开启心跳事件上报
# 心跳频率, 单位秒
# -1 为关闭心跳
interval: 5

message:
# 上报数据类型
# 可选: string,array
post-format: string
# 是否忽略无效的CQ码, 如果为假将原样发送
ignore-invalid-cqcode: false
# 是否强制分片发送消息
# 分片发送将会带来更快的速度
# 但是兼容性会有些问题
force-fragment: false
# 是否将url分片发送
fix-url: false
# 下载图片等请求网络代理
proxy-rewrite: ''
# 是否上报自身消息
report-self-message: false

output:
# 日志等级 trace,debug,info,warn,error
log-level: warn
# 是否启用 DEBUG
debug: false # 开启调试模式

# 默认中间件锚点
default-middlewares: &default
# 访问密钥, 强烈推荐在公网的服务器设置
access-token: ''
# 事件过滤器文件目录
filter: ''
# API限速设置
# 该设置为全局生效
# 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
# 目前该限速设置为令牌桶算法, 请参考:
# https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
rate-limit:
enabled: false # 是否启用限速
frequency: 1 # 令牌回复频率, 单位秒
bucket: 1 # 令牌桶大小

servers:
# HTTP 通信设置
- http:
# 服务端监听地址
host: 127.0.0.1
# 服务端监听端口
port: 5700
# 反向HTTP超时时间, 单位秒
# 最小值为5,小于5将会忽略本项设置
timeout: 5
middlewares:
<<: *default # 引用默认中间件
# 反向HTTP POST地址列表
post:
#- url: '' # 地址
# secret: '' # 密钥
#- url: 127.0.0.1:5701 # 地址
# secret: '' # 密钥

# 正向WS设置
- ws:
# 正向WS服务器监听地址
host: 127.0.0.1
# 正向WS服务器监听端口
port: 6700
middlewares:
<<: *default # 引用默认中间件

- ws-reverse:
# 反向WS Universal 地址
# 注意 设置了此项地址后下面两项将会被忽略
universal: ws://your_websocket_universal.server
# 反向WS API 地址
api: ws://your_websocket_api.server
# 反向WS Event 地址
event: ws://your_websocket_event.server
# 重连间隔 单位毫秒
reconnect-interval: 3000
middlewares:
<<: *default # 引用默认中间件
# pprof 性能分析服务器, 一般情况下不需要启用.
# 如果遇到性能问题请上传报告给开发者处理
# 注意: pprof服务不支持中间件、不支持鉴权. 请不要开放到公网
- pprof:
# pprof服务器监听地址
host: 127.0.0.1
# pprof服务器监听端口
port: 7700

# LambdaServer 配置
- lambda:
type: scf # 可用 scf,aws (aws未经过测试)
middlewares:
<<: *default # 引用默认中间件

# 可添加更多
#- ws-reverse:
#- ws:
#- http:

database: # 数据库相关设置
leveldb:
# 是否启用内置leveldb数据库
# 启用将会增加10-20MB的内存占用和一定的磁盘空间
# 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
enable: true

事实上,只需要配置uin 为你的bot的QQ账号post-formatArray,其他只需要保持默认(如果你知道如何修改)。

记住正向WS服务器监听端口为6700

5、修改保存并重启go-cqhttp。

此时你可以向bot发送消息,bot会接收消息,并在终端显示。

确认无误后先暂时暂停终端。

搭建ZeroBot-Plugin

作者提供了三种搭建方式,分别是本地运行,github actions和可执行文件,但是我在尝试几次后发现使用github actions编译总是报错,这里我就采取本地运行方式,可执行文件方式在我搭建时并没有,可以自己尝试。

1、新开一个终端/ssh,新建一个文件夹ZeroBot,克隆项目

1
git clone https://github.com/FloatTech/ZeroBot-Plugin.git

2、修改ZeroBot-Plugin目录下的main.go

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
27
28
29
30
31
func main() {
fmt.Print(
"\n======================[ZeroBot-Plugin]======================",
"\n", banner, "\n",
"============================================================\n",
) // 启动打印
zero.Run(zero.Config{
NickName: []string{"椛椛", "ATRI", "atri", "亚托莉", "アトリ"},
CommandPrefix: "/",

// SuperUsers 某些功能需要主人权限,可通过以下两种方式修改
// []string{}:通过代码写死的方式添加主人账号
// os.Args[1:]:通过命令行参数的方式添加主人账号
SuperUsers: append([]string{"12345678", "87654321"}, os.Args[1:]...),

Driver: []zero.Driver{
&driver.WSClient{
// OneBot 正向WS 默认使用 6700 端口
Url: "ws://127.0.0.1:6700",
AccessToken: "",
},
},
})

// 帮助
zero.OnFullMatchGroup([]string{"help", "/help", ".help", "菜单", "帮助"}, zero.OnlyToMe).SetBlock(true).SetPriority(999).
Handle(func(ctx *zero.Ctx) {
ctx.Send(banner)
})
select {}
}

按注释修改,需要修改管理员账号,以及注意OneBot 正向WS 默认使用 6700 端口,与go-cqhttp正向监听端口一致。

确认以上无误后保存退出。

3、运行run.bat

1
./run.bat

第一次运行时,将是一长串的代码编译和下载依赖过程,可能花费一段时间。

4、编译完成后保持此终端/ssh运行,然后打开之前运行go-cqhttp的终端/ssh,运行go-cqhttp:

1
./go-cqhttp

会出现以下提示:

即代表成功运行bot!大功告成!

注:当go-cqhttp和ZeroBot-Plugin同时运行时并连接成功时才能保证bot正常运行。

ATRI的扩展

如果仔细观察ZeroBot-Plugin的结构,就会发现它是由一个一个的插件程序组合起来,虽然作者一直在持续更新,但是我们显然更需要适合自己的功能。

当然,这要求你具备一定的go语言编程技术,可以参考ZeroBot/api.go at main · caicheng918/ZeroBot (github.com)来实现自己功能。

博主已在此基础上扩充了一些其他功能(如果你见过我的bot),限于博主水平,暂不开源。

参考项目及文章

再次感谢以下优秀的开源项目提供者🍭

Mrs4s/go-cqhttp: cqhttp的golang实现,轻量、原生跨平台. (github.com)

wdvxdr1123/ZeroBot: 一个基于onebot协议的机器人Go开发框架 (github.com)

FloatTech/ZeroBot-Plugin: 基于 ZeroBot 的 OneBot 插件 (github.com)

使用go-cqhttp搭建一个属于自己的机器人 | Tianli’s blog (tianli-blog.club)