使用 API 键为什么我最多可以检索 20k 个视频?还有为什么只有 public 个视频?

Using an API key Why can I max retrieve 20k videos? Also why only public videos?

开启 YouTube API to fetch all videos on a channel

在“这是将 return 您频道下的所有视频 ID 的代码”标题下找到紧凑示例 PHP。

程序如下所示。

我扩展了程序以获取每个视频的各种属性,包括 ACCESS。

我的频道有超过 20,000 个视频和大量报价。

程序 运行 很好地生成了带有视频属性的 .csv。

它 运行 持续了大约 2 小时 10 分钟,停在了 20,000 个视频处。此外,它只选择了 PUBLIC 个视频。

如何解决以上两个问题?

<?php 

// FROM 

    $baseUrl = 'https://www.googleapis.com/youtube/v3/';
    // https://developers.google.com/youtube/v3/getting-started
    $apiKey = 'API_KEY';
    // If you don't know the channel ID see below
    $channelId = 'CHANNEL_ID';

    $params = [
        'id'=> $channelId,
        'part'=> 'contentDetails',
        'key'=> $apiKey
    ];
    $url = $baseUrl . 'channels?' . http_build_query($params);
    $json = json_decode(file_get_contents($url), true);

    $playlist = $json['items'][0]['contentDetails']['relatedPlaylists']['uploads'];

    $params = [
        'part'=> 'snippet',
        'playlistId' => $playlist,
        'maxResults'=> '50',
        'key'=> $apiKey
    ];
    $url = $baseUrl . 'playlistItems?' . http_build_query($params);
    $json = json_decode(file_get_contents($url), true);

    $videos = [];
    foreach($json['items'] as $video)
        $videos[] = $video['snippet']['resourceId']['videoId'];

    while(isset($json['nextPageToken'])){
        $nextUrl = $url . '&pageToken=' . $json['nextPageToken'];
        $json = json_decode(file_get_contents($nextUrl), true);
        foreach($json['items'] as $video)
            $videos[] = $video['snippet']['resourceId']['videoId'];
    }
    print_r($videos);
?>

In addition it only picked up PUBLIC videos.

您当前使用的代码使用 API 键。 API 密钥仅用于访问 public 数据。

如果您想访问私人数据,则需要使用 Oauth2 作为有权访问私人视频的用户获得授权。

It ran for about 2 hours and 10 minutes and stopped at 20,000 videos.

这个问题对我来说有点难回答,因为我无法测试我没有包含 20k 视频的 YouTube 频道。

我可以猜到,当您使用 api 密钥时,他们允许您使用 api 密钥下载的视频数量是有限制的。他们可能不希望人们下载 YouTube 上的所有 public 个视频。

我建议你尝试使用Oauth2授权,看看限制是否仍然存在。

php Oauth2 示例。

  • 创建已安装的应用凭据请参阅video
  • 确保在库中启用 YouTube 数据 api。
  • 把这段代码中的channelId改成你自己的

代码

<?php

/**
 * Sample PHP code for youtube.search.list
 * See instructions for running these code samples locally:
 * https://developers.google.com/explorer-help/guides/code_samples#php
 */

if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
  throw new Exception(sprintf('Please run "composer require google/apiclient:~2.0" in "%s"', __DIR__));
}
require_once __DIR__ . '/vendor/autoload.php';

$client = new Google_Client();
$client->setApplicationName('API code samples');
$client->setScopes([
    'https://www.googleapis.com/auth/youtube.force-ssl',
]);

// TODO: For this request to work, you must replace
//       "YOUR_CLIENT_SECRET_FILE.json" with a pointer to your
//       client_secret.json file. For more information, see
//       https://cloud.google.com/iam/docs/creating-managing-service-account-keys
$client->setAuthConfig('YOUR_CLIENT_SECRET_FILE.json');
$client->setAccessType('offline');

// Request authorization from the user.
$authUrl = $client->createAuthUrl();
printf("Open this link in your browser:\n%s\n", $authUrl);
print('Enter verification code: ');
$authCode = trim(fgets(STDIN));

// Exchange authorization code for an access token.
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);

// Define service object for making API requests.
$service = new Google_Service_YouTube($client);

$queryParams = [
    'channelId' => 'UCyqzvMN8newXIxyYIkFzPvA',
    'forMine' => false
];

$response = $service->search->listSearch('snippet', $queryParams);
print_r($response);

注意:我没有在这台机器上安装 php,所以我无法测试它,但这应该很接近。如果您有任何问题,请告诉我。