go-Pichubot:基于 Onebot 协议的 Go 语言 QQ 机器人框架

前言

go-Pichubot 是从 python-pichubot 重构而来的 QQ 机器人框架,基于 Onebot v11 协议,通过正向 WebSocket 与 go-cqhttp 这类 Onebot 实现通信。

仓库:AkiinuBot/go-Pichubot

写它的动机是青年大学习。团组织每周有一次线上学习,成员学完要把完成截图发到 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 直接安装

评论

评论加载中…

输入关键词开始搜索。

选择Enter 打开Esc 关闭CtrlK 唤起