https://github.com/afraidjpg/rbq-go
目标是成为一个对插件开发友好的一个qq bot插件框架
https://github.com/afraidjpg/rbq-go
bot go go-cqhttp golang qq qq-bot qqbot
Last synced: 3 months ago
JSON representation
目标是成为一个对插件开发友好的一个qq bot插件框架
- Host: GitHub
- URL: https://github.com/afraidjpg/rbq-go
- Owner: afraidjpg
- License: mit
- Created: 2022-02-10T08:10:17.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2023-10-18T07:00:47.000Z (over 2 years ago)
- Last Synced: 2025-12-17T12:19:09.374Z (6 months ago)
- Topics: bot, go, go-cqhttp, golang, qq, qq-bot, qqbot
- Language: Go
- Homepage:
- Size: 275 KB
- Stars: 4
- Watchers: 1
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.MD
- License: LICENSE.md
- Support: support/plugin.go
Awesome Lists containing this project
README
rbq-go
一个以go-cqhttp为后端的插件开发框架

[](https://github.com/Mrs4s/go-cqhttp)
## 写在前面
这是一个个人学习性质的项目,不能提供任何可靠性保证,包括但不限于:**代码安全与质量,相关文档,issue回复的及时性等**。
基于上述理由,本项目的更新速度可能会十分缓慢(就是懒)。如果star高了,用的人多了,项目变得活跃了,那我应该会变得很积极(手动狗头)
一个人的力量是有限的,所以如果你愿意使用,并在使用过程中有任何问题、新的feature/代码修改建议,欢迎提出issue,我会尽可能的回复并改进。
PS: rbq = **r**o**b**ot **q**q
简介
rbq-go是一个以go-cqhttp为后端的插件开发框架,它的目标是提供一个简单、易用的插件开发环境,通过封装go-cqhttp的api,使插件开发者可以更简单的与qq交互。
项目灵感来自于许久以前写着玩儿的时候,发现要写一堆代码去调用后端,感觉很麻烦,于是有了写这个项目的念头,我但愿这个项目能够帮助到你。
为了保持项目简单易懂,项目会 **尽量避免使用过于复杂的设计**
,降低学习成本。同时保留高级功能的空间,使之可以胜任复杂场景。期望是不再需要理解以及再封装onebot的文档,即可简单的开发插件
## 安装
```
go get -u github.com/afraidjpg/rbq-go
```
## 使用
示例代码请 [点击这里](./example)
```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](https://github.com/Mrs4s/go-cqhttp/releases)
- 启动 `go-cqhttp` 并使用选择正向websocket连接
- 运行你的程序
插件选项
`BindPlugin`的第二个参数是一个`*PluginOption`类型的变量,可以为插件设置一些选项,例如:
```go
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码
### 使用示例
```go
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 同步,可以[点击这里](https://github.com/Mrs4s/go-cqhttp)查看README中对CQ码的描述
| CQ码 | 进度 | 收发限制 | 备注 |
|:---------:|:---:|:----:|-----------------------------------------------------------------------|
| face | 完成 | 收&发 | | |
| record | 完成 | 收&发 | ⚠️可能存在问题,具体查看该[issue](https://github.com/Mrs4s/go-cqhttp/issues/1749) |
| 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对象,
然后调用对应的方法即可
### 使用示例
```go
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 | 完成 |
## 全局信息
内置了一些全局变量,在程序启动后可以从中获取一些全局性的信息
### 使用
```go
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 | 获取群列表 |