使用 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,所以我无法测试它,但这应该很接近。如果您有任何问题,请告诉我。
开启 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,所以我无法测试它,但这应该很接近。如果您有任何问题,请告诉我。