除集成在 app 客户端的音频/视频 SDK,声网还提供频道管理 RESTful API,帮助你在 app 服务端管理频道内的用户和查询频道信息。
本页面介绍声网频道管理 RESTful API 的详细信息。
本节介绍所有声网频道管理 RESTful API 的基本信息。
所有请求都发送给域名:api.sd-rtn.com
。
所有 HTTP 请求头部的 Content-Type
类型为 application/json
。所有请求和响应内容的格式均为 JSON。所有的请求 URL 和请求包体内容都区分大小写。
声网频道管理 RESTful API 仅支持 HTTPS 协议。发送请求时,你需要使用声网提供的客户 ID 和客户密钥生成一个 Base64 算法编码的凭证,并填入 HTTP 请求头部的 Authorization
字段中。详见 HTTP 基本认证。
对于每个声网账号(非每个 App ID),查询在线频道信息的每个 API 调用频率上限为每秒 20 次,其他每个 API 的调用频率上限为每秒 10 次。如果调用频率超出限制,请参考如何处理服务端 RESTful API 调用超出频率限制优化调用频率。
为了最大程度保障核心功能创建(POST)、更新(PUT)和删除(DELETE)的成功率,在公网质量异常抖动下,查询(GET)方法成功率和准确性会有一定程度降级。查询 (GET) 的返回结果中,可能会缺失部分请求记录。
time
不为 0),并需要在后续被更新和删除时,我们建议:
创建封禁用户权限的规则。
可封禁的用户权限(privileges
)包括:
join_channel
:加入频道。
publish_audio
:发送音频流。
publish_video
:发送视频流。
封禁用户权限的规则通过 cname
、uid
和 ip
三个字段实现过滤,具体如下:
当 privileges
设为 join_channel
时,过滤规则如下:
如果填写 ip
,不填写 cname
和 uid
,则所有使用该 ip
的用户都无法登录 app 中的任何频道。
使用 ip
作为过滤字段,可能会错误地封禁不该被封禁的用户,例如,多人共享一个 IP 地址。
如果填写 cname
,不填写 uid
和 ip
,则任何人都无法登录 app 中该 cname
对应的频道。
使用 cname
作为过滤字段,相当于封禁该 cname
对应的频道。
如果填写 uid
,不填写 cname
和 ip
,则该 uid
无法登录 app 中的任何频道。
如果填写 cname
和 uid
,不填写 ip
,则该 uid
无法登录 app 中该 cname
对应的频道。
当 privileges
设为 publish_audio
或 publish_video
时,过滤规则如下:
ip
,不填写 cname
和 uid
,则所有使用该 ip
的用户都无法在 app 中的任何频道内发送音频或视频流。cname
,不填写 uid
和 ip
,则任何人都无法在该 cname
对应的频道内发送音频或视频流。uid
,不填写 cname
和 ip
,则该 uid
无法在 app 中的任何频道内发送音频或视频流。cname
和 uid
,不填写 ip
,则该 uid
无法在该 cname
对应的频道发送音频或视频流。用户被踢出频道后(即privileges
设置为 join_channel
),会收到网络连接已被服务器禁止回调:
onConnectionStateChanged
回调报告 CONNECTION_CHANGED_BANNED_BY_SERVER(3)
。connectionChangedToState
回调报告 AgoraConnectionChangedBannedByServer(3)
。Client.on("client-banned")
。Client.on("connection-state-change")
。onConnectionStateChanged
回调报告 CONNECTION_CHANGED_BANNED_BY_SERVER(3)
。AgoraRtcEngine.on("connectionStateChanged")
回调报告 3
。OnConnectionStateChangedHandler
回调报告 CONNECTION_CHANGED_BANNED_BY_SERVER(3)
。ConnectionStateChanged
回调报告 BannedByServer(3)
。ConnectionStateChanged
回调报告 BannedByServer(3)
。onConnectionStateChanged
回调报告 CONNECTION_CHANGED_BANNED_BY_SERVER(3)
。on(event: "client-banned")
。POST
https://api.sd-rtn.com/dev/v1/kicking-rule
请求包体参数
在请求包体中传入以下参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
cname |
String | 选填 | 频道名称。 |
uid |
Number | 选填 | 用户 ID。不能设为 0。 |
ip |
String | 选填 | 用户的 IP 地址。不能设为 0。 |
time |
Number | 必填 | 封禁时间,单位为分钟,取值范围为 [1,1440]。 注意事项 0 到 1 之间时,服务端自动改设为 1 。1440 时,服务端自动改设为 1440 。0 时,表示不封禁。服务端会对频道内符合设定规则的用户进行下线一次的操作。用户可以重新登录进入频道。time 和 time_in_seconds 两个参数只需设置其中的一个。如果同时设置,则 time_in_seconds 生效;如果都不设置,服务端会自动将封禁时间设为 60 分钟,即 3600 秒。 |
time_in_seconds |
Number | 必填 | 封禁时间,单位为秒,取值范围为 [10,86430]。 注意事项: 0 到 10 之间,服务端自动改设为 10 。86430 时,服务端自动改设为 86430 。0 时,表示不封禁。服务端会对频道内符合设定规则的用户进行下线一次的操作。用户可以重新登录进入频道。time 和 time_in_seconds 两个参数只需设置其中的一个。如果同时设置,则 time_in_seconds 生效,如果都不设置,服务端会自动将封禁时间设为 60 分钟,即 3600 秒。 |
privileges |
Array | 必填 | 你想要封禁的用户权限,取值包括:join_channel :String。加入频道,表示禁止用户加入频道或将用户踢出频道。publish_audio :String。发送音频,表示禁止用户发送音频流。可以与 publish_video 同时设置,表示禁止用户发送音视流和视频流。publish_video :String。发送视频,表示禁止用户发送视频流。可以与 publish_audio 同时设置,表示禁止用户发送音视流和视频流。 |
请求包体
{
"appid": "4855xxxxxxxxxxxxxxxxxxxxxxxxeae2",
"cname": "channel1",
"uid": 589517928,
"ip": "",
"time": 60,
"privileges": [
"join_channel"
]
}
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
status |
String | 本次请求的状态。success 表示请求成功。 |
id |
Number | 规则 ID。当更新或删除封禁用户权限规则时,需要传入规则 ID。 |
请求成功的响应示例:
{
"status": "success",
"id": 1953
}
获取封禁用户权限的规则列表。
为了最大程度保障核心功能创建(POST)、更新(PUT)和删除(DELETE)的成功率,在公网质量异常抖动下,查询(GET)方法成功率和准确性会有一定程度降级。查询 (GET) 的返回结果中,可能会缺失部分请求记录。
time
不为 0),并需要在后续被更新和删除时,我们建议:
GET
https://api.sd-rtn.com/dev/v1/kicking-rule
查询参数
在请求路径中传入以下查询参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
status |
String | 本次请求的状态。success 表示请求成功。 |
rules |
Array | 封禁用户权限的规则列表。该数组由多个 object 组成,每个 object 表示一条规则的信息,并包含如下字段:
|
createAt |
String | 该规则的创建时间(UTC 时间)。 |
updateAt |
String | 该规则的更新时间(UTC 时间)。 |
请求成功的响应示例:
{
"status": "success",
"rules": [
{
"id": 1953,
"appid": "4855xxxxxxxxxxxxxxxxxxxxxxxxeae2",
"uid": 589517928,
"opid": 1406,
"cname": "11",
"ip": "192.168.0.1",
"ts": "2018-01-09T07:23:06.000Z",
"privileges": [
"join_channel"
],
"createAt": "2018-01-09T06:23:06.000Z",
"updateAt": "2018-01-09T14:23:06.000Z"
}
]
}
更新指定规则的过期时间。
PUT
https://api.sd-rtn.com/dev/v1/kicking-rule
请求包体参数
在请求包体中传入以下参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
id |
Number | 必填 | 规则 ID。 |
time |
Number | 必填 | 封禁时间,单位为分钟,取值范围为 [1,1440]。 注意事项: 0 到 1 之间时,服务端自动改设为 1 。1440 时,服务端自动改设为 1440 。time 和 time_in_seconds 两个参数只需设置其中的一个。如果同时设置,则 time_in_seconds 生效;如果都不设置,服务端会自动将封禁时间设为 60 分钟,即 3600 秒。 |
time_in_seconds |
Number | 必填 | 封禁时间,单位为秒,取值范围为 [10,86430]。 注意事项: 0 到 10 之间,服务端自动改设为 10 。86430 时,服务端自动改设为 86430 。time 和 time_in_seconds 两个参数只需设置其中的一个。如果同时设置,则 time_in_seconds 生效;如果都不设置,服务端会自动将封禁时间设为 60 分钟,即 3600 秒。 |
请求包体
{
"appid": "4855xxxxxxxxxxxxxxxxxxxxxxxxeae2",
"id": 1953,
"time": 60
}
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
status |
String | 本次请求的状态。success 表示请求成功。 |
result |
Object | 请求结果,包含如下字段:id : String。规则 ID。ts :String。该规则的过期时间(UTC 时间)。 |
请求成功的响应示例:
{
"status": "success",
"result": {
"id": 1953,
"ts": "2018-01-09T08:45:54.545Z"
}
}
删除指定的封禁用户权限规则。
DELETE
https://api.sd-rtn.com/dev/v1/kicking-rule
请求包体参数
在请求包体中传入以下参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
id |
Number | 必填 | 规则 ID。 |
请求包体
{
"appid": "4855xxxxxxxxxxxxxxxxxxxxxxxxeae2",
"id": 1953
}
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
status |
String | 本次请求的状态。success 表示请求成功。 |
id |
String | 规则 ID。 |
请求成功的响应示例:
{
"status": "success",
"id": 1953
}
查询指定用户的状态。
该方法可查询指定频道中某个用户的状态。请求成功后,返回的参数包括用户是否在频道中、加入频道的时间和用户角色等。
GET
https://api.sd-rtn.com/dev/v1/channel/user/property/{appid}/{uid}/{channelName}
路径参数
在请求 URL 中传入以下路径参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
uid |
Number | 必填 | 用户 ID。 注意事项:该参数暂不支持 String 型用户名(User Account),请确保使用整型用户 ID。 |
channelName |
String | 必填 | 频道名称。 |
请求 URL
https://api.sd-rtn.com/dev/v1/channel/user/property/12sfegxxxxxxxxxxxx365/2845863044/test
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
success |
Boolean | 本次请求的状态:true :请求成功。false :预留。 |
data |
Object | 用户状态数据,包含如下字段:
|
请求成功的响应示例:
{
"success": true,
"data": {
"join": 1640330382,
"uid": 2845863044,
"in_channel": true,
"platform": 7,
"role": 2
}
}
查询指定频道内的用户列表。
在不同频道场景下,该方法返回的列表具体如下:
GET
https://api.sd-rtn.com/dev/v1/channel/user/{appid}/{channelName}/hosts_only
路径参数
在请求 URL 中传入以下路径参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
channelName |
String | 必填 | 频道名称。 |
hosts_only |
String | 选填 | 如果你填入该参数,则只返回直播场景下的主播列表。 |
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
success |
Boolean | 本次请求的状态:true : 请求成功。false :预留。 |
data |
Object | 用户状态数据,包含如下字段:
|
请求成功的响应示例:
通信场景
{
"success": true,
"data": {
"channel_exist": true,
"mode": 1,
"total": 1,
"users": [
906218805
]
}
}
直播场景下返回主播和观众列表
{
"success": true,
"data": {
"channel_exist": true,
"mode": 2,
"broadcasters": [
2206227541,
2845863044
],
"audience": [
906219905
],
"audience_total": 1
}
}
直播场景下仅返回主播列表
{
"success": true,
"data": {
"channel_exist": true,
"mode": 2,
"broadcasters": [
574332,
1347839
]
}
}
查询指定项目下的频道列表。
该方法按页查询指定项目下的频道列表。你可以在请求路径中指定要查询的页面和每页显示的频道数量。请求成功后,会根据你指定的 page_size
返回指定页面的频道列表。
GET
https://api.sd-rtn.com/dev/v1/channel/{appid}
路径参数
在请求 URL 中传入以下路径参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid |
String | 必填 | 项目的 App ID。可通过以下方式获取:vendor_key 字段的值。 |
查询参数
在请求 URL 中传入以下查询参数:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
page_no |
Number | 选填 | 你想要查询的页面,默认值为 0 ,即第一页。 |
page_size |
Number | 选填 | 每个页面显示的频道数量,取值范围为 [1,500],默认值为 100 。 |
可能的响应状态码详见状态码汇总表。
如果状态码不为 200
,则请求失败。响应包体中包含 message
字段,描述失败的具体原因。
如果状态码为 200
,则请求成功,响应包体包含如下参数:
参数 | 类型 | 描述 |
---|---|---|
success |
Boolean | 本次请求的状态:true :请求成功。false :预留。 |
data |
Object | 频道数据,包含如下字段:
|
请求成功的响应示例:
{
"success": true,
"data": {
"channels": [
{
"channel_name": "lkj144",
"user_count": 3
}
],
"total_size": 1
}
}
响应状态码 | 描述 |
---|---|
200 | 操作成功。 |
400 | 请求无效。 |
401 | 未经授权的(App ID/Customer Certificate 匹配错误)。 |
403 | 禁止访问。 |
404 | 请求的资源未找到。 |
415 | 不支持的媒体类型。请确保 Headers 中的 Content-Type 设置为 application/json 。 |
429 | 请求过于频繁。 |
500 | 服务器内部错误。 |
为保障 REST 服务的高可用,避免因区域网络故障造成的服务不可用,声网提供切换域名的方案。
主域名 | 区域域名 | 地理区域 |
---|---|---|
api.sd-rtn.com | api-us-west-1.sd-rtn.com | 美国西部 |
api-us-east-1.sd-rtn.com | 美国东部 | |
api-ap-southeast-1.sd-rtn.com | 亚太东南 | |
api-ap-northeast-1.sd-rtn.com | 亚太东北 | |
api-eu-west-1.sd-rtn.com | 欧洲西部 | |
api-eu-central-1.sd-rtn.com | 欧洲中部 | |
api-cn-east-1.sd-rtn.com | 中国华东 | |
api-cn-north-1.sd-rtn.com | 中国华北 | |
api.agora.io | api-us-west-1.agora.io | 美国西部 |
api-us-east-1.agora.io | 美国东部 | |
api-ap-southeast-1.agora.io | 亚太东南 | |
api-ap-northeast-1.agora.io | 亚太东北 | |
api-eu-west-1.agora.io | 欧洲西部 | |
api-eu-central-1.agora.io | 欧洲中部 | |
api-cn-east-1.agora.io | 中国华东 | |
api-cn-north-1.agora.io | 中国华北 |