私有频道列表可见性

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 为契约参数。
Shell
# 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)1003rev23 authorize_channel_read
读取群历史(不带 channelId)该频道消息不返回rev23 can_read_message
发送频道消息1003rev23 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,管理页需宿主实现。

相关链接​