
go-Pichubot:基于 Onebot 协议的 Go 语言 QQ 机器人框架
前言
go-Pichubot 是从 python-pichubot 重构而来的 QQ 机器人框架,基于 Onebot v11 协议,通过正向 WebSocket 与 go-cqhttp 这类 Onebot 实现通信。
写它的动机是青年大学习。团组织每周有一次线上学习,成员学完要把完成截图发到 QQ 群,团支书要数谁交了谁没交。python 版的 pichubot 就是为了自动数这件事写的,后来把机器人本身抽成了框架,大学习变成跑在框架上的一个功能,见 皮丘Bot。仓库里不包含大学习部分。
安装
go get github.com/AkiinuBot/go-Pichubot
Hello World
package main
import (
Pichubot "github.com/AkiinuBot/go-Pichubot"
)
func action(eventinfo Pichubot.MessagePrivate) {
if eventinfo.Sender.UserID == 12345678 {
Pichubot.SendPrivateMsg("Hello World!", eventinfo.Sender.UserID)
}
}
func main() {
// 向监听器里添加函数
Pichubot.Listeners.OnPrivateMsg = append(Pichubot.Listeners.OnPrivateMsg, action)
// 初始化一个 Bot 并更改配置
Bot := Pichubot.NewBot()
Bot.Config = Pichubot.Config{
Loglvl: Pichubot.LOGGER_LEVEL_INFO, // 控制台与日志文件的最低日志级别
Host: "0.0.0.0:6700", // 机器人程序的 WebSocket 地址
MasterQQ: "12345678", // 机器人主人的 QQ 号
Path: "/", // WebSocket 请求的路径
MsgAwait: true, // 发送消息时随机延迟
}
Bot.Run()
}
开启 go-cqhttp(或其他 Onebot 协议的 QQ 机器人)后运行程序,用 12345678 这个 QQ 向机器人发一条私聊消息,机器人会回复 Hello World!
事件池(监听器)
框架收到机器人发来的数据包后进行解析,然后调用对应事件池内的所有函数。注册函数的方式是往数组里 append:
Pichubot.Listeners.OnPrivateMsg = append(Pichubot.Listeners.OnPrivateMsg, action)
事件池覆盖了 Onebot v11 的消息、提醒、请求、元事件四类:
| 字段名 | 对应结构体 | 说明 |
|---|---|---|
| OnPrivateMsg | MessagePrivate | 私聊消息 |
| OnGroupMsg | MessageGroup | 群聊消息 |
| OnGroupUpload | GroupUpload | 群文件上传 |
| OnGroupAdmin | GroupAdmin | 群管理员变动 |
| OnGroupDecrease | GroupDecrease | 群成员减少 |
| OnGroupIncrease | GroupIncrease | 群成员增加 |
| OnGroupBan | GroupBan | 群聊禁言 |
| OnFriendAdd | FriendAdd | 添加好友后 |
| OnGroupRecall | GroupRecall | 群消息撤回 |
| OnFriendRecall | FriendRecall | 好友消息撤回 |
| OnNotify | Notify | 戳一戳、红包运气王、群成员荣誉变更 |
| OnFriendRequest | FriendRequest | 加好友请求 |
| OnGroupRequest | GroupRequest | 加群请求或邀请 |
| OnMetaLifecycle | MetaLifecycle | 生命周期 |
| OnMetaHeartbeat | MetaHeartbeat | 心跳包 |
发消息之类的操作用封装好的方法:
Pichubot.SendPrivateMsg("Hello World!", 12345678)
// -> (map[string]interface{}, error)
长事件(Long Event)
普通的监听函数收一条消息处理一条。要做“开启之后持续接收后续消息”的功能,比如复读机,用 Pichubot.NewEvent 建一个长事件,之后符合条件的消息会通过 channel 送进来:
func repeater(eventinfo Pichubot.MessageGroup) {
if eventinfo.Message == "复读机" {
event := Pichubot.NewEvent(eventinfo.Sender.UserID, eventinfo.GroupID, "fdj")
defer event.Close()
Pichubot.SendGroupMsg("我,就是人类的本质", eventinfo.GroupID)
for {
r := <-*event.Channel // 持续获取传入 channel 的值
if r == "关闭复读机" {
Pichubot.SendGroupMsg("复读机已关闭", eventinfo.GroupID)
break
} else {
Pichubot.SendGroupMsg(r, eventinfo.GroupID)
}
}
}
}
另外需要一个注册在 OnGroupMsg 上的函数,遍历 Pichubot.LongEvents,把同一个人在同一个群里发的后续消息送进对应事件的 channel。
版本
- v0.1.x:用 Go 重写 python 版
- v0.2.x:改成 SDK 形式,业务代码和框架分开
- v0.3.x:可以通过
go get直接安装
评论
评论加载中…