使用API密钥调用YouTube API仅能获取2万条公开视频问题咨询
问题解决方法
1. 程序运行2小时10分钟停止、仅拉取20000条视频的解决方案
- 解除PHP运行限制:原代码没有修改PHP默认的执行时间、内存上限配置,进程长时间运行后会被PHP主动终止。在代码开头加入两行配置即可取消对应限制:
set_time_limit(0); ini_set('memory_limit', '-1');
- 突破uploads播放列表2万条返回上限:YouTube官方对公开的uploads播放列表接口的返回条目上限固定为20000条,超过部分无法通过该接口拉取。你需要替换为
Search.list接口拉取全量视频,指定参数channelId为你的频道ID、type=video、order=date,分页拉取即可获取超过2万条的视频数据。 - 新增错误重试机制:原代码没有异常处理逻辑,遇到网络波动、API临时限流/报错会直接终止。可以在请求接口部分增加重试逻辑,遇到非致命错误时重试3-5次再终止,大幅提升运行稳定性。
2. 仅能拉取PUBLIC公开视频的解决方案
- 原代码使用API Key进行身份校验,API Key仅能获取频道的公开数据,无法拿到非公开(私有、未列出、成员专属)内容。你作为频道所有者,需要替换为OAuth 2.0授权方式,申请只读权限,使用账号授权后的access token调用接口,即可拉取你名下频道所有权限等级的视频。
- 拉取视频属性时,请求参数的
part字段新增status,返回结果中status.privacyStatus字段即为视频的访问权限属性,包含public、unlisted、private等取值。
调整后核心代码参考
<?php // 解除PHP运行限制 set_time_limit(0); ini_set('memory_limit', '-1'); $baseUrl = 'https://www.googleapis.com/youtube/v3/'; // 替换为你OAuth2授权后拿到的access token,无需再使用API Key $accessToken = 'YOUR_OAUTH2_ACCESS_TOKEN'; $channelId = 'YOUR_CHANNEL_ID'; $videos = []; $nextPageToken = ''; do { $params = [ 'channelId' => $channelId, 'part' => 'id,snippet', 'maxResults' => 50, 'type' => 'video', 'order' => 'date', 'pageToken' => $nextPageToken, 'access_token' => $accessToken ]; $url = $baseUrl . 'search?' . http_build_query($params); // 增加3次重试逻辑,应对临时网络/接口错误 $retry = 0; $json = null; while ($retry < 3) { $context = stream_context_create([ 'http' => [ 'timeout' => 30 ] ]); $response = @file_get_contents($url, false, $context); if ($response) { $json = json_decode($response, true); break; } $retry++; sleep(2); } if (!$json) break; foreach($json['items'] as $item) { $videoId = $item['id']['videoId']; $videos[] = $videoId; // 可在此处追加调用videos.list接口,拉取单条视频的status等自定义属性 } $nextPageToken = $json['nextPageToken'] ?? ''; } while ($nextPageToken); // 后续生成csv的逻辑保持原有逻辑即可 ?>
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

