私有频道列表可见性
rev23 已把 private 频道的发送/历史/消息可见性收紧到频道成员;rev24 继续收紧频道列表:客户端 REST 与 Open API 的频道列表都按调用者身份过滤 private 频道,避免群内非成员看到私有频道元数据。本页说明可见性规则、Open API 的 userId 用法与常见问题。
public 频道:群成员可见(列表/历史/消息都对群成员开放)。
private 频道:只有频道有效成员(显式成员 ∪ 绑定用户组成员,且仍是群成员)或群主/管理员可见;其他人列表里看不到、历史读取 1003、消息不投递。
Open API 频道列表缺省没有调用者身份 → 只返回 public 频道;需要 private 频道请显式传 userId(运行期可选参数,不改变 IDL 契约声明)。
可见性矩阵
| 调用者 | public 频道 | private 频道 | 说明 |
|---|---|---|---|
| 群成员(非频道成员) | ✅ 列表可见、可读历史、可发消息(发送自动加入) | ⛔ 列表不可见;历史 1003;消息不投递 | rev23 + rev24 |
| private 频道成员 | ✅ | ✅ 列表/历史/发送 | 有效成员 = 显式成员 ∪ 用户组成员 ∩ 群成员 |
| 群主 / 管理员 | ✅ | ✅ 列表可见(管理需要) | 可管理频道,即使不在频道成员列表 |
| 非群成员 | ⛔ 客户端 REST 403/1003 | ⛔ | Open API 传 userId 时同样要求群成员 |
| 匿名 Open API(无 userId) | ✅ 返回 public 频道 | ⛔ 隐藏 | 服务端集成方需要 private 频道时传 userId |
客户端 REST
客户端调用 listSupergroupChannels(groupId)(REST GET /api/apps/{appkey}/supergroup/channels?groupId=)时,服务端用 Bearer token 解析当前用户并要求其是群成员(否则 403/1003);返回的 channels 已按可见性过滤,total 为过滤后的数量。
Open API
supergroup.channel.list 的契约声明仍只有 groupId;rev24 增加运行期可选 userId:
- 传
userId:要求用户存在(否则1004)且是群成员(否则403/1003),按该用户过滤 private 频道。 - 不传
userId:没有调用者身份 → 只返回 public 频道(private 一律隐藏)。 - 该参数不在 IDL 契约参数表/introspect 计数中(additive 运行期参数,additive-only 契约不被破坏);Open API 参考页仍以
groupId为契约参数。
# Open API:带 userId 才能看到该用户可见的 private 频道
curl -X POST 'http://127.0.0.1:8080/im/v2/supergroup/channel/list' \
-H 'Content-Type: application/json' \
-H "App-Key: $APPKEY" -H "Nonce: $NONCE" -H "Timestamp: $TS" -H "Signature: $SIGN" \
-d '{"groupId":"sg_demo","userId":"u3"}'
# 不带 userId:只返回 public 频道(匿名调用)
curl -X POST 'http://127.0.0.1:8080/im/v2/supergroup/channel/list' \
-H "App-Key: $APPKEY" -H "Nonce: $NONCE" -H "Timestamp: $TS" -H "Signature: $SIGN" \
-H 'Content-Type: application/json' -d '{"groupId":"sg_demo"}'与消息/历史可见性的一致性
| 操作 | private 频道非成员 | 依赖 |
|---|---|---|
| 频道列表 | 不可见(rev24) | rev24 过滤 |
| 读取频道历史(channelId) | 1003 | rev23 authorize_channel_read |
| 读取群历史(不带 channelId) | 该频道消息不返回 | rev23 can_read_message |
| 发送频道消息 | 1003 | rev23 authorize_channel_send |
| 离线补收 / 回调 | 不投递/不路由 | rev23 收件人收窄 |
常见问题
为什么我(群成员)看不到某个频道?
该频道是 private,且你不在频道成员列表、也不在绑定用户组里;需要群主/管理员把你加入频道或绑定用户组。
为什么管理员能看到所有 private 频道?
这是有意设计:群主/管理员需要管理频道;他们能看到列表,但消息接收仍按频道成员或发送自动加入规则。
Open API 为什么只返回 public 频道?
没有传 userId 时服务端没有调用者身份,只能返回 public;需要 private 频道请显式传 userId(并确保该用户是群成员)。
改成 public 后列表会怎样?
立即对全体群成员可见(后续列表请求即可见);已存在的频道成员列表保留,但公开频道发送不要求成员。
分页/总数为 0 是 bug 吗?
不是:total 是过滤后的数量;如果只剩 private 且调用者不可见,列表可能为空。可用管理员身份或传 userId 核对。
频道成员管理页在哪?
当前版本 UI 只提供列表/选择/创建/加入/离开;成员增删仍调用 channel/members/add|remove|list Server API,管理页需宿主实现。