YouTube Data API liveBroadcasts.list传ID列表返回空结果问题
问题描述
尝试获取非本人所属其他频道的直播流属性时,所有liveBroadcasts.listLiveBroadcasts接口调用均返回0条条目,无接口报错。
复现逻辑
- 调用
search.list接口,传入查询参数maxResults=50、eventType=live、order=viewCount、q='DRONE|GAME'、type=video,成功返回最多50条活跃直播结果,抽样访问https://youtu.be/<VIDEO_ID>可确认抽检条目均为真实生效的活跃直播流。 - 提取搜索结果中所有
videoId拼接为ID列表,传入liveBroadcasts.listLiveBroadcasts接口,指定broadcastType=all,请求part为snippet,contentDetails,status,statistics,接口正常响应无报错,但返回条目数始终为0。
核心疑问
liveBroadcasts.listLiveBroadcasts接口是否仅支持查询当前授权账号自身频道的直播?- 接口提供的
mine、onBehalfOfContentOwner参数的设计用途是什么? - 是否存在可查询任意公开直播流属性的API接口?
复现代码
function getRandomLiveStream() { global $service ; // We'll search for up to 50 livestreams.. and check each one for a livechat. // We'll pass the first match as our desired livestream. $queryParms = [ 'maxResults' => 50 , 'eventType' => 'live' , 'order' => 'viewCount' , 'q' => 'DRONE|GAME' , 'type' => 'video' ] ; $searchResults = $service->search->listSearch('snippet', $queryParms) ; if ($searchResults && count($searchResults->items) > 0) { $ids = [ ] ; foreach ($searchResults->items as $item) { // Compile the list of up to 50 ids $ids[] = $item->id->videoId ; } $queryParms = [ 'maxResults' => count($ids) , 'id' => implode(',', $ids) ] ; $liveBroadcastItems = listLiveBroadcasts($queryParms) ; if ($liveBroadcastItems) { foreach ($liveBroadcastItems as $item) { if (($item->statistics->totalChatCount > 0) // Only if there is an active chat && ($item->liveChatId) ) // We need a liveChat ID. If we have that, return this item. return $item ; } } } return false ; // Couldn't find a livestream with chat. } function listLiveBroadcasts($queryParms) { global $googleIsHappy ; global $service ; global $lov ; try { $queryParms['broadcastType'] = 'all' ; $response = $service->liveBroadcasts->listLiveBroadcasts('snippet,contentDetails,status,statistics', $queryParms); return $response->items ; } catch (Exception $e) { $googleIsHappy = false ; $code = $e->getCode() ; $message = $e->getMessage() ; $json = $message ; if ($arr = json_decode($json, true)) { $message = $arr['error']['message'] ; } $string = sprintf("service->%s() failed with code %s, error: %s.\n" , $serviceName, $code, $message) ; $lov->writeLogLine($string) ; return false ; } }
解答
liveBroadcasts.listLiveBroadcasts接口确实仅支持查询当前授权账号自身创建、管理的直播广播资源,属于接口权限层面的固定设计,不属于参数传错导致的异常。传入非当前账号有权管理的直播ID时,接口不会抛出权限类报错,会直接过滤所有无权限访问的条目,最终返回空列表,这是调用返回0条结果的根本原因。- 两个参数的实际用途如下:
mine:布尔类型参数,设置为true时,接口默认拉取当前授权账号所属频道下的所有直播广播,不需要额外传入频道ID或视频ID,仅能查询账号自有资源。onBehalfOfContentOwner:面向YouTube官方认证的内容所有者(一般是MCN机构、版权管理方)的代理参数,传入已完成授权的内容所有者ID后,可以查询该内容所有者名下所有托管频道的直播广播,不需要给每个子频道单独做授权,本质还是用于管理自有/托管资源,不能用来查询无托管关系的公开频道内容。
- 没有支持查询任意公开直播全量属性的公开API,公开维度的直播信息可通过现有接口组合获取:
直播基础信息(标题、封面、发布时间)、公开统计数据(观看量、累计聊天数)、直播核心状态(实际开播时间、实时在线人数、直播聊天ID、直播是否结束),均可通过videos.list接口获取:传入目标公开视频ID,请求snippet,statistics,liveStreamingDetails分区即可拿到上述字段。
直播推流配置、延迟等级、自动录制开关、变现配置这类广播管理级属性,仅对直播所属频道的管理账号开放,无公开查询渠道。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

