这是一个个人学习性质的项目,不能提供任何可靠性保证,包括但不限于:代码安全与质量,相关文档,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组的选项
// ...
}
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码的支持与 go-cqhttp 同步,可以点击这里查看README中对CQ码的描述
CQ码 | 进度 | 收发限制 | 备注 |
---|---|---|---|
face | 完成 | 收&发 | |
record | 完成 | 收&发 | |
video | 完成 | 收&发 | 如果没有后缀,通常为mp4 |
at | 完成 | 收&发 | |
share | 完成 | 收&发 | |
music | 完成 | 收&发 | |
reply | 完成 | 收&发 | |
forward | 完成 | 收 | |
node | 完成 | 发 | |
xml | 未实现 | ||
json | 未实现 | ||
image | 完成 | 收&发 | |
redbag | 完成 | 收 | |
poke | 完成 | 发 | |
cardimage | 完成 | 发 | |
tts | 完成 | 发 |
实现了对 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 | 获取群列表 |