频道成员、身份组与权限
用 channel.NewClient 包装现有的 *api.Client,即可查询频道成员、管理身份组和设置发言权限。频道客户端共用原客户端的认证和 HTTP 设置。
package guide
import (
"context"
"github.com/ProgramCX/GoQQBot/pkg/api"
"github.com/ProgramCX/GoQQBot/pkg/api/channel"
)
func members(ctx context.Context, client *api.Client, guildID string) ([]channel.Member, error) {
return channel.NewClient(client).ListMembers(ctx, guildID, channel.MemberListOptions{Limit: 100})
}频道成员列表使用本页末位成员的 User.ID 作为下一页的 After,空页表示结束。身份组成员列表则将 Next 传给 StartIndex,Next 为 "0" 时表示已到末页。
配置事件订阅
使用 WebSocket
将所需条目合并到 config.yaml 现有的 connection.websocket.intents 列表,保留其他业务订阅。保存后重启机器人。
connection:
mode: websocket
websocket:
intents:
- GUILD_MEMBERS使用 Webhook
在 QQ 机器人运营与管理后台选择 开发设置 → 事件订阅与回调。将接入方式设为 Webhook。在 接收事件配置 选择 部分接收,按事件标识勾选GUILD_MEMBER_ADD、GUILD_MEMBER_UPDATE 和 GUILD_MEMBER_REMOVE。保存设置。已选 全部接收 时,无需逐项勾选。
按任务查找官方接口
按操作选择对应的官方字段表。
| 任务 | SDK 方法 | 官方文档 |
|---|---|---|
| 成员列表和详情 | ListMembers、GetMember | 成员列表、成员详情 |
| 身份组成员 | ListRoleMembers、AddMemberRole、RemoveMemberRole | 身份组成员列表、添加成员 |
| 移除成员 | RemoveMember | 删除频道成员 |
| 身份组 | ListRoles、CreateRole、UpdateRole、DeleteRole | 获取身份组、创建身份组 |
| 子频道用户权限 | GetMemberPermissions、UpdateMemberPermissions | 获取权限、修改权限 |
| 子频道身份组权限 | GetRolePermissions、UpdateRolePermissions | 获取身份组权限、修改身份组权限 |
| 接口授权 | ListAPIPermissions、RequestAPIPermission | 可用接口权限、发送授权链接 |
| 禁言 | SetMemberMute、SetMembersMute、SetGuildMute | 指定成员禁言、批量禁言、全员禁言 |
| 在线人数与主动消息设置 | GetOnlineCount、GetMessageSettings | 在线人数、消息设置 |
事件与数据归属
通过 GUILD_MEMBERS 订阅事件。用 OnEvent 注册 message.GUILD_MEMBER_ADD、message.GUILD_MEMBER_UPDATE 或 message.GUILD_MEMBER_REMOVE,然后调用 ctx.GuildMemberChange() 读取用户、身份组和操作者。音视频或直播子频道的成员进出事件使用 ctx.AudioLiveMember(),订阅方式见接收论坛和音频事件。
注意事项
频道成员列表需要私域权限
测试全频道成员列表时,QQ 返回 40012010(应用无接口访问权限)。当前测试应用无法验证该接口的成功响应。QQ 仅向私域机器人开放此接口。权限开通后,请将机器人从频道移除,再重新添加。频道成员详情和身份组成员列表使用独立接口,两项查询在 QQ 测试中均返回成功。
- 收到频道消息不表示有管理权限。
AdminOnly()只描述按钮交互权限。服务端仍需检查业务权限和平台授权。 - 注册处理函数后,还需订阅对应事件。旧版成员事件的
joined_at和roles可能与官方示例的格式不同。若解析失败,可按实际字段读取ctx.Payload.D。官方频道成员事件 - 普通 QQ 号码无法替代 OpenID。群成员身份组与频道身份组的权限不可互用。
- 成员列表与身份组成员列表面向私域机器人。频道成员翻页时可能出现重复项,业务可按用户 ID 去重。
- 添加或移除子频道管理员身份组(ID 为
"5")的成员时,填写RoleMembershipOptions.ChannelID。创建或修改身份组时,RoleOptions中非 nil 的字段才会发送。 - 批量禁言仅返回操作成功的成员 ID。将
MuteOptions.Seconds设为"0"可解除禁言。若同时填写截止时间,则 QQ 以截止时间为准。 - 查询在线人数适用于音视频或直播子频道。