如何通过YouTube Data API批量获取指定播放列表/分组视频的播放量
问题描述
我正在获取自己频道中部分视频的播放量,以下是我的示例代码,仅展示2个视频的查询逻辑:
<?php define("YOUTUBE_DATA_API_KEY", 'KEY_IS_IN_HERE'); function youtube_video_statistics($video_id) { $json = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=statistics&id=" . $video_id . "&key=". YOUTUBE_DATA_API_KEY ); $jsonData = json_decode($json); $views = $jsonData->items[0]->statistics->viewCount; return $views; } echo '<strong>Track Title 1 - </strong>'; $num = youtube_video_statistics('VIDEO_ID_HERE'); echo $formattedNum1; // 原代码存在bug:变量未定义就输出 $formattedNum1 = number_format($num); echo $formattedNum1; echo '<strong>Track Title 2</strong>'; $num = youtube_video_statistics('VIDEO_ID_HERE'); echo $formattedNum2; // 原代码存在bug:变量未定义就输出 $formattedNum2 = number_format($num); echo $formattedNum2; ?>
$formattedNum变量的作用是对播放量数值进行千位符格式化,因为我的大部分视频播放量都在数千级别。
当前代码可以正常运行,但缺点是完全手动维护:视频标题和video ID都是硬编码的,使用体验很差。
我希望实现的效果是可以通过一段代码批量拉取目标视频的标题和播放量,后续新增视频不需要手动修改代码添加ID。另外我的频道总共有90多个视频,只需要重点监控其中12个的播放数据;如果只能拉取全频道所有视频的标题和播放量也可以接受,比当前的方案好,但我在官方文档中没有找到对应实现方法。
请问有没有办法通过YouTube Data API给需要监控的视频分组,比如给目标视频添加相同的标签,或者将它们加入同一个播放列表,后续直接查询该标签或播放列表即可获取所有目标视频的播放数据?
针对接口调用得到的返回结果如下:
{ "kind": "youtube#videoListResponse", "etag": "YIUPVpqNjppyCWOZfL-19bLb7uk", "items": [], "pageInfo": { "totalResults": 0, "resultsPerPage": 0 } }
解决方案
接口返回空的原因
大概率是以下几种情况:
- 请求参数错误:比如
part参数缺失、传入的视频ID无效 - API权限问题:YouTube Data API服务未启用,或者API密钥配额耗尽
- 视频权限问题:目标视频设为私有,未授权API访问
推荐实现方案(播放列表分组,无需硬编码ID)
这是成本最低、维护最方便的方案,步骤如下:
- 在YouTube后台创建一个非公开的专属播放列表,把需要监控的12个视频全部加入该列表,后续新增监控视频只需要往列表里加即可,不用修改代码
- 先调用
playlistItems接口获取该播放列表下所有视频的ID和标题,一次请求就能拿到全部12条数据 - 再调用
videos接口批量传入所有视频ID(最多支持一次传50个ID),一次性拿到所有播放量数据,减少请求次数
修正后的完整PHP代码
<?php define("YOUTUBE_DATA_API_KEY", '替换为你的API密钥'); define("MONITOR_PLAYLIST_ID", '替换为你创建的监控播放列表ID'); // 批量获取监控列表下的所有视频ID和标题 function get_monitor_videos() { $url = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=" . MONITOR_PLAYLIST_ID . "&key=" . YOUTUBE_DATA_API_KEY; $json = file_get_contents($url); $data = json_decode($json); $videos = []; foreach ($data->items as $item) { $videos[] = [ 'id' => $item->snippet->resourceId->videoId, 'title' => $item->snippet->title ]; } return $videos; } // 批量获取多个视频的播放量 function get_batch_views($video_ids) { $ids_str = implode(',', $video_ids); $url = "https://www.googleapis.com/youtube/v3/videos?part=statistics&id=" . $ids_str . "&key=" . YOUTUBE_DATA_API_KEY; $json = file_get_contents($url); $data = json_decode($json); $views_map = []; foreach ($data->items as $item) { $views_map[$item->id] = number_format($item->statistics->viewCount); } return $views_map; } // 执行逻辑 $monitor_videos = get_monitor_videos(); $video_ids = array_column($monitor_videos, 'id'); $views_map = get_batch_views($video_ids); // 输出结果 foreach ($monitor_videos as $video) { echo "<strong>{$video['title']} - </strong>" . $views_map[$video['id']] . "<br>"; } ?>
其他可选方案
- 如果需要拉取全频道所有视频,只需要把上面的播放列表ID替换为你频道的默认上传播放列表ID即可,该ID可以通过
channels接口的contentDetails.relatedPlaylists.uploads字段获取 - 标签筛选方案不推荐,搜索接口配额消耗远高于播放列表接口,且匹配精度不稳定
内容的提问来源于stack exchange,提问作者jfar_2020
相关产品推荐
相关产品推荐

