Нам нужен видео-список по имени канала YouTube (с использованием API)
Мы можем получить Channel-list (только ChannelName), используя ниже API
https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar
ниже - прямая ссылка каналов
https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g
или
WWW.YouTube.com/channel/HC-8jgBP-4rlI
Теперь нам нужны видео канала → UCqAEtEr0A0Eo2IVcuWBfB9g или HC-8jgBP-4rlI
мы попробовали
https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&User=UC7Xayrf2k0NZiz3S04WuDNQ https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&q=UC7Xayrf2k0NZiz3S04WuDNQ
Но это не помогает. Нам нужны все видео, размещенные на канале. Видео, загруженное на канал, может быть от нескольких пользователей, поэтому я не думаю, что предоставление пользовательского параметра помогло бы.
Вам нужно посмотреть YouTube Data API
. Вы найдете там документацию о том, как можно получить доступ к API. Вы также можете найти клиентские библиотеки.
Вы также можете сами сделать запросы. Вот пример URL-адреса, который извлекает последние видео с канала:
https://www.googleapis.com/youtube/v3/search?key={your_key_here}&channelId={channel_id_here}&part=snippet,id&order=date&maxResults=20
После этого вы получите JSON
с идентификаторами видео и деталями, и вы можете создать свой видеоролик следующим образом:
http://www.youtube.com/watch?v={video_id_here}
maxResults=20
(до 50) видео, но не весь каталог каналов. Если вы хотите получить больше результатов, используйте pageToken, как описано здесь .
Во-первых, вам нужно получить идентификатор списка воспроизведения, который представляет заказы от пользователя/канала:
https://developers.google.com/youtube/v3/docs/channels/list#try-it
Вы можете указать имя пользователя с параметром forUsername={username}
или указать mine=true
, чтобы получить свой собственный (сначала вам нужно пройти аутентификацию). Включите part=contentDetails
, чтобы просмотреть плейлисты.
GET https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=jambrose42&key={YOUR_API_KEY}
В результате "relatedPlaylists"
будет содержать плейлисты "likes"
и "uploads"
. Возьмите идентификатор списка воспроизведения "upload"
. Также обратите внимание, что "id"
- ваш идентификатор канала для будущих ссылок.
Далее, получите список видео в этом плейлисте:
https://developers.google.com/youtube/v3/docs/playlistItems/list#try-it
Просто запустите playlistId!
GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId=UUpRmvjdu3ixew5ahydZ67uA&key={YOUR_API_KEY}
Есть два шага:
https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50
Попробуйте с этим, это может помочь вам:
https://gdata.youtube.com/feeds/api/videos?author=cnn&v=2&orderby=updated&alt=jsonc&q=news
здесь автор, так как вы можете указать свое имя канала и "q", так как вы можете указать ключевое слово поиска.
Используя api версии 2, которая устарела, URL для загрузки (канала UCqAEtEr0A0Eo2IVcuWBfB9g): https://gdata.youtube.com/feeds/users/UCqAEtEr0A0Eo2IVcuWBfB9g/uploads
Существует версия api 3.
Всего за 3 шага
1) Подписки: список → https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=50&mine=true&access_token= {oauth_token}
2) Каналы: список → https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id= {channel_id} & key = {YOUR_API_KEY}
3) PlaylistItems: list → https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id} & key = {YOUR_API_KEY}
Благодаря ссылкам, размещенным здесь и в других местах, я сделал онлайн-инструмент script/, который можно использовать для получения всех видеороликов канала. Он объединяет вызовы API в youtube.channels.list
, playlistItems
, videos
. Он использует рекурсивные функции, чтобы асинхронные обратные вызовы запускали следующую итерацию после получения действительного ответа. Это также позволяет ограничить фактическое количество запросов, сделанных за раз, следовательно, чтобы вы не нарушили правила API Youtube. Обмен сокращенными фрагментами, а затем ссылкой на полный код. Я получил 50 максимальных результатов за ограничение вызова, используя значение nextPageToken, которое приходит в ответ, чтобы получить следующие 50 результатов и т.д.
function getVideos(nextPageToken, vidsDone, params) {
$.getJSON("https://www.googleapis.com/youtube/v3/playlistItems", {
key: params.accessKey ,
part: "snippet",
maxResults: 50,
playlistId: params.playlistId,
fields: "items(snippet(publishedAt,resourceId/videoId,title)),nextPageToken",
pageToken: ( nextPageToken || '' )
},
function(data) {
// commands to process JSON variable, extract the 50 videos info
if ( vidsDone < params.vidslimit) {
//recursive : the function is calling itself if all videos haven't been loaded yet
getVideos( data.nextPageToken, vidsDone , params);
}
else { // closing actions to do once we have listed the videos needed.
}
});
}
Это получило базовый список видео, включая идентификатор, название, дату публикации и т.п. Но чтобы получить более подробную информацию о каждом видео, таком как количество просмотров и предпочтений, нужно вызвать вызовы API для videos
.
// looping through an array of video id's
function fetchViddetails( i ) {
$.getJSON("https://www.googleapis.com/youtube/v3/videos", {
key: document.getElementById("accesskey").value,
part: "snippet,statistics",
id: vidsList[i]
}, function(data) {
// commands to process JSON variable, extract the video info and push it to a global array
if( i < vidsList.length - 1) {
fetchViddetails( i+1 ) //recursive : calls itself if the list isn't over.
}
});
Смотрите полный код здесь, и живая версия здесь.
Ниже приведена альтернатива Python, которая не требует каких-либо специальных пакетов. Предоставляя идентификатор канала, он возвращает список видео-ссылок для этого канала. Обратите внимание, что для этого вам нужен API-ключ.
import urllib
import json
def get_all_video_in_channel(channel_id):
api_key = YOUR API KEY
base_video_url = 'https://www.youtube.com/watch?v='
base_search_url = 'https://www.googleapis.com/youtube/v3/search?'
first_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, channel_id)
video_links = []
url = first_url
while True:
inp = urllib.urlopen(url)
resp = json.load(inp)
for i in resp['items']:
if i['id']['kind'] == "youtube#video":
video_links.append(base_video_url + i['id']['videoId'])
try:
next_page_token = resp['nextPageToken']
url = first_url + '&pageToken={}'.format(next_page_token)
except:
break
return video_links
video_list = get_all_video_in_channel("ABC123EFG456")
затем вы можете распечатать его, чтобы увидеть массив с помощью print(video_list)
Вот код, который вернет все идентификаторы видео в вашем канале
<?php
$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);
Примечание. Вы можете получить идентификатор канала https://www.youtube.com/account_advanced после входа в систему.
Так как у всех в этом потоке возникают проблемы из-за ограничения 500 видео здесь альтернативное решение с использованием youtube_dl в Python 3. Кроме того, не нужен ключ API.
sudo pip3 install youtube-dl
Пример (предупреждение - занимает десятки минут):
import youtube_dl, pickle
# UCVTyTA7-g9nopHeHbeuvpRA is the channel id (1517+ videos)
PLAYLIST_ID = 'UUVTyTA7-g9nopHeHbeuvpRA' # Late Night with Seth Meyers
with youtube_dl.YoutubeDL({'ignoreerrors': True}) as ydl:
playd = ydl.extract_info(PLAYLIST_ID, download=False)
with open('playlist.pickle', 'wb') as f:
pickle.dump(playd, f, pickle.HIGHEST_PROTOCOL)
vids = [vid for vid in playd['entries'] if 'A Closer Look' in vid['title']]
print(sum('Trump' in vid['title'] for vid in vids), '/', len(vids))
@for /f "usebackq tokens=2 delims=: " %a in (`dl-list.py^|findstr information`) do @echo https://www.youtube.com/watch?v=%a
. Он напечатает все URL видео. PLAYLIST_ID
может быть списком воспроизведения или идентификатором канала.
dl-list.py
.
Недавно вам пришлось извлекать все видео с канала и в соответствии с документацией разработчика YouTube: https://developers.google.com/youtube/v3/docs/playlistItems/list
function playlistItemsListByPlaylistId($service, $part, $params) {
$params = array_filter($params);
$response = $service->playlistItems->listPlaylistItems(
$part,
$params
);
print_r($response);
}
playlistItemsListByPlaylistId($service,
'snippet,contentDetails',
array('maxResults' => 25, 'playlistId' => 'id of "uploads" playlist'));
Где $service
- ваш объект Google_Service_YouTube
.
Итак, вам нужно извлечь информацию из канала, чтобы получить список воспроизведения "uploads", на самом деле это все видео, загруженные каналом: https://developers.google.com/youtube/v3/docs/channels/list
Если новый с этим API, я настоятельно рекомендую превратить образец кода из стандартного фрагмента в полный образец.
Таким образом, базовый код для извлечения всех видео с канала может быть:
class Youtube
{
const DEV_KEY = 'YOUR_DEVELOPPER_KEY';
private $client;
private $youtube;
private $lastChannel;
public function __construct()
{
$this->client = new Google_Client();
$this->client->setDeveloperKey(self::DEV_KEY);
$this->youtube = new Google_Service_YouTube($this->client);
$this->lastChannel = false;
}
public function getChannelInfoFromName($channel_name)
{
if ($this->lastChannel && $this->lastChannel['modelData']['items'][0]['snippet']['title'] == $channel_name)
{
return $this->lastChannel;
}
$this->lastChannel = $this->youtube->channels->listChannels('snippet, contentDetails, statistics', array(
'forUsername' => $channel_name,
));
return ($this->lastChannel);
}
public function getVideosFromChannelName($channel_name, $max_result = 5)
{
$this->getChannelInfoFromName($channel_name);
$params = [
'playlistId' => $this->lastChannel['modelData']['items'][0]['contentDetails']['relatedPlaylists']['uploads'],
'maxResults'=> $max_result,
];
return ($this->youtube->playlistItems->listPlaylistItems('snippet,contentDetails', $params));
}
}
$yt = new Youtube();
echo '<pre>' . print_r($yt->getVideosFromChannelName('CHANNEL_NAME'), true) . '</pre>';
Как указано в документации вы можете использовать тип ресурса канала и список операций, чтобы получить все видео в канале. Эта операция должна быть выполняется с использованием аргумента 'channel id'.