Skip to content

目标是成为一个对插件开发友好的一个qq bot插件框架

License

Notifications You must be signed in to change notification settings

afraidjpg/rbq-go

Repository files navigation

rbq-go

一个以go-cqhttp为后端的插件开发框架

写在前面

这是一个个人学习性质的项目,不能提供任何可靠性保证,包括但不限于:代码安全与质量,相关文档,issue回复的及时性等

基于上述理由,本项目的更新速度可能会十分缓慢(就是懒)。如果star高了,用的人多了,项目变得活跃了,那我应该会变得很积极(手动狗头)

一个人的力量是有限的,所以如果你愿意使用,并在使用过程中有任何问题、新的feature/代码修改建议,欢迎提出issue,我会尽可能的回复并改进。

PS: rbq = robot qq

简介

rbq-go是一个以go-cqhttp为后端的插件开发框架,它的目标是提供一个简单、易用的插件开发环境,通过封装go-cqhttp的api,使插件开发者可以更简单的与qq交互。

项目灵感来自于许久以前写着玩儿的时候,发现要写一堆代码去调用后端,感觉很麻烦,于是有了写这个项目的念头,我但愿这个项目能够帮助到你。

为了保持项目简单易懂,项目会 尽量避免使用过于复杂的设计 ,降低学习成本。同时保留高级功能的空间,使之可以胜任复杂场景。期望是不再需要理解以及再封装onebot的文档,即可简单的开发插件

安装

go get -u github.com/afraidjpg/rbq-go

使用

示例代码请 点击这里

package main

import (
	"fmt"
	"github.com/afraidjpg/rbq-go"
)

// YourPlugin 这是你的插件本体
func YourPlugin(ctx *rbq.Context) {
	msg := ctx.GetMessage()
	if msg == "hello world" {
		ctx.Reply("welcome")
		return
	}

	ctx.Reply("test") // 发送 "test"

	ctx.AddText("boo") // 添加消息但不立刻发送
	ctx.AddText("bar")
	ctx.Reply() // 发送 "boobar"

	ctx.AddText("hello") // 添加消息但不立刻发送
	ctx.AddText(" ")
	ctx.Reply("world") // 发送 "hello world"
}

// main 方法
func main() {
	bot := rbq.NewApp()          // 新建app
	pld := bot.GetPluginLoader() // 获取插件装载器
	// 添加单个插件
	pld.BindPlugin(YourPlugin, nil)

	// 创建一个插件组,并向插件组中加入插件
	gp := pld.Group("gp", nil)
	gp.BindPlugin(YourPlugin, nil)

	// 添加插件中发生的错误
	errs := gp.GetErrors()
	if len(errs) > 0 {
		for _, err := range errs {
			fmt.Println(err)
			return
		}
	}
	// 不给参数,自动设置为 127.0.0.1:8080(go-cqhttp的默认正向websocket端口)
	bot.Run("")
}

运行

  • 下载 go-cqhttp
  • 启动 go-cqhttp 并使用选择正向websocket连接
  • 运行你的程序

插件选项

BindPlugin的第二个参数是一个*PluginOption类型的变量,可以为插件设置一些选项,例如:

package main

import (
	"fmt"
	"github.com/afraidjpg/rbq-go"
)

var SimpleOption = &rbq.PluginOption{
	Name: "example_reply", // 插件名称
	FilterFunc: []rbq.PluginFilterFunc{
		func(ctx *rbq.Context) bool {
			return ctx.IsGroup() // 只回复群消息
		},
	},
	RecoverFunc: func(ctx *rbq.Context, err any) {
		fmt.Println("插件运行错误:", err)
	}, // 当插件运行错误的时候执行的逻辑
}

func YourPlugin(ctx *rbq.Context) {
	ctx.Reply("test")
}

// 然后在绑定插件的时候使用
func main() {
	bot := rbq.NewApp()
	pld := bot.GetPluginLoader()
	pld.BindPlugin(YourPlugin, SimpleOption) // 该插件将应用上述设置

	gp := pld.Group("gp", &rbq.PluginGroupOption{SimpleOption})
	gp.BindPlugin(YourPlugin, nil) // gp组内的插件选项如果未设置,则会直接应用gp组的选项
	// ...
}

CQ码

使用示例

package yourplugin

import (
	"fmt"
	"github.com/afraidjpg/rbq-go"
)

func YourPlugin(ctx *rbq.Context) {
	// 获取该条消息中的所有CQ码,返回类型为 []CQCodeInterface,需要手动转换类型
	cq := ctx.GetAllCQCode()
	fmt.Println(cq)

	// 获取具体的某种CQ码的方式为 ctx.GetCQX(), 其中X为CQ码的类型
	// 需要注意的是,一条消息中允许存在多个相同类型的CQ码时,会返回[]*CQX
	// 如果不会返回多个,则返回*CQX 
	// 例如 ctx.GetCQAt() 获取at码
	ats := ctx.GetCQAt() // 返回 []*CQAt,获取该条消息中的所有at
	for _, at := range ats {
		fmt.Println(at.GetQQ()) // 获取at的qq号
	}

	// 发送CQ码的方式为 ctx.AddCQX(), X代表CQ码类型,且首字母大写
	// 如 At、Image、Face...
	ctx.AddCQAt(1234567)
	ctx.AddCQFace(22)
	// ...

	ctx.Reply() // 发送消息
}

支持的CQ码

CQ码的支持与 go-cqhttp 同步,可以点击这里查看README中对CQ码的描述

CQ码 进度 收发限制 备注
face 完成 收&发
record 完成 收&发 ⚠️可能存在问题,具体查看该issue
video 完成 收&发 如果没有后缀,通常为mp4
at 完成 收&发
share 完成 收&发 ⚠️对群时发送/接受时可能会失败
music 完成 收&发
reply 完成 收&发
forward 完成
node 完成
xml 未实现
json 未实现
image 完成 收&发
redbag 完成
poke 完成
cardimage 完成
tts 完成

bot API

实现了对 go-cqhttp 的 api 调用封装,可以通过 ctx.Api 或者 rbq.GetBotApi() 获取机器人api对象, 然后调用对应的方法即可

使用示例

package yourplugin

import (
	"github.com/afraidjpg/rbq-go"
	"log"
	"time"
)

func BotApi(ctx *rbq.Context) {
	msgId, _, err := ctx.Reply("阿巴阿巴阿巴")
	if err != nil {
		return
	}

	time.Sleep(time.Second * 5) // 5秒后撤回消息
	err = ctx.Api.DeleteMsg(msgId)
	// 也可以这样调用
	// err = rbq.GetBotApi().DeleteMsg(msgId)
	if err != nil {
		log.Println(err)
	}
	log.Println("撤回消息成功:", msgId)
}
分类 名称 方法名 go-cqhttp 接口名 进度
bot账号 获取登录号信息 GetLoginInfo get_login_info 完成
bot账号 设置登录号资料 SetQQProfile set_qq_profile 完成
bot账号 获取企点账号信息 GetQidianAccountInfo qidian_get_account_info 完成
bot账号 获取在线机型 GetDeviceList _get_model_show 完成
bot账号 设置在线机型 SetOnlineDevice _set_model_show 完成
bot账号 获取在线设备 GetOnlineClients get_online_clients 完成
好友信息 获取陌生人信息 GetStrangerInfo get_stranger_info 完成
好友信息 获取好友列表 GetFriendList get_friend_list 完成
好友信息 获取单向好友列表 GetUnidirectionalFriendList get_unidirectional_friend_list 完成
好友操作 删除好友 DeleteFriend delete_friend 完成
好友操作 删除单向 DeleteUnidirectionalFriend delete_unidirectional_friend 完成
消息 发送私聊消息 SendPrivateMsg send_private_msg 完成
消息 发送群消息 SendGroupMsg send_group_msg 完成
消息 发送消息 SendMsg send_msg 完成
消息 获取消息 GetMsg get_msg 完成
消息 撤回消息 DeleteMsg delete_msg 完成
消息 标记消息已读 MarkMsgAsRead mark_msg_as_read 完成
消息 获取合并转发内容 GetforwardMsg get_forward_msg 完成
消息 发送合并转发 ( 群聊 ) SendGroupForwardMsg send_group_forward_msg 完成
消息 发送合并转发 ( 好友 ) SendPrivateForwardMsg send_private_forward_msg 完成
消息 获取群消息历史记录 GetGroupMsgHistory get_group_msg_history 完成
图片 获取图片信息 GetImage get_image 完成
图片 检查是否可以发送图片 CanSendImage can_send_image 完成
图片 图片 OCR OcrImage ocr_image 完成
语音 获取语音 GetRecord get_record cqhttp未实现
语音 检查是否可以发送语音 CanSendRecord can_send_record 完成
处理 处理加好友请求 SetFriendAddRequest set_friend_add_request 完成
处理 处理加群请求/邀请 SetGroupAddRequest set_group_add_request 完成
群信息 获取群信息 GetGroupInfo get_group_info 完成
群信息 获取群列表 GetGroupList get_group_list 完成
群信息 获取群成员信息 GetGroupMemberInfo get_group_member_info 完成
群信息 获取群成员列表 GetGroupMemberList get_group_member_list 完成
群信息 获取群荣誉信息 GetGroupHonorInfo get_group_honor_info 完成
群信息 获取群系统消息 GetGroupSystemMsg get_group_system_msg 完成
群信息 获取精华消息列表 GetEssenceMsgList get_essence_msg_list 完成
群信息 获取群 @全体成员 剩余次数 GetGroupAtAllRemain get_group_at_all_remain 完成
群设置 设置群名 SetGroupName set_group_name 完成
群设置 设置群头像 SetGroupPortrait set_group_portrait 完成
群设置 设置群管理员 SetGroupAdmin set_group_admin 完成
群设置 设置群名片 ( 群备注 ) SetGroupCard set_group_card 完成
群设置 设置群专属头衔 SetGroupSpecialTitle set_group_special_title 完成
群操作 群单人禁言 SetGroupBan set_group_ban 完成
群操作 群全员禁言 SetGroupWholeBan set_group_whole_ban 完成
群操作 群匿名用户禁言 SetGroupAnonymousBan set_group_anonymous_ban cqhttp未实现
群操作 设置精华消息 SetEssenceMsg set_essence_msg 完成
群操作 删除精华消息 DeleteEssenceMsg delete_essence_msg 完成
群操作 群打卡 SendGroupSign send_group_sign 完成
群操作 群设置匿名 SetGroupAnonymous set_group_anonymous 完成
群操作 发送群公告 SendGroupNotice _send_group_notice 完成
群操作 获取群公告 GetGroupNotice _get_group_notice 完成
群操作 群组踢人 SetGroupKick set_group_kick 完成
群操作 退出群组 SetGroupLeave set_group_leave 完成
文件 上传群文件 UploadGroupFile upload_group_file 完成
文件 删除群文件 DeleteGroupFile delete_group_file 完成
文件 创建群文件文件夹 CreateGroupFileFolder create_group_file_folder 完成
文件 删除群文件文件夹 DeleteGroupFileFolder delete_group_folder 完成
文件 获取群文件系统信息 GetGroupFileSystemInfo get_group_file_system_info 完成
文件 获取群根目录文件列表 GetGroupRootFiles get_group_root_files 完成
文件 获取群子目录文件列表 GetGroupFilesByFolder get_group_files_by_folder 完成
文件 获取群文件资源链接 GetGroupFileUrl get_group_file_url 完成
文件 上传私聊文件 UploadPrivateFile upload_private_file 完成
Go-CqHttp 相关 获取 Cookies GetCookies get_cookies cqhttp未实现
Go-CqHttp 相关 获取 CSRF Token GetCsrfToken get_csrf_token cqhttp未实现
Go-CqHttp 相关 获取 QQ 相关接口凭证 GetCredentials get_credentials cqhttp未实现
Go-CqHttp 相关 获取版本信息 GetVersionInfo get_version_info 完成
Go-CqHttp 相关 获取状态 GetStatus get_status 完成
Go-CqHttp 相关 清理缓存 CleanCache clean_cache 完成
Go-CqHttp 相关 重载事件过滤器 ReloadEventFilter reload_event_filter 完成
Go-CqHttp 相关 下载文件到缓存目录 DownloadFile download_file 完成
Go-CqHttp 相关 检查链接安全性 CheckUrlSafely check_url_safely 完成
Go-CqHttp 相关 获取中文分词 ( 隐藏 API ) getWordSlices .get_word_slices 完成
Go-CqHttp 相关 对事件执行快速操作 ( 隐藏 API ) handleQuickOperation .handle_quick_operation 完成

全局信息

内置了一些全局变量,在程序启动后可以从中获取一些全局性的信息

使用

package your_package

import (
	"github.com/afraidjpg/rbq-go"
	"log"
)

func GlobalInfo(ctx *rbq.Context) {
	log.Println(ctx.GlobalInfo.GetBotQQ())
	log.Println(rbq.GetGlobalInfo().GetBotQQ())
}

可用信息

方法名 说明
GetBotQQ 获取机器人QQ号
GetBotNickname 获取机器人昵称
CanSendImg 是否可以发送图片
CanSendRecord 是否可以发送语音
GetOnlineClients 获取在线客户端列表
GetFriendList 获取好友列表
GetUnidirectionalFriendList 获取单向好友列表
GetGroupList 获取群列表

About

目标是成为一个对插件开发友好的一个qq bot插件框架

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages