API YouTube для получения всех видео на канале

101

Нам нужен видео-список по имени канала 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

Но это не помогает. Нам нужны все видео, размещенные на канале. Видео, загруженное на канал, может быть от нескольких пользователей, поэтому я не думаю, что предоставление пользовательского параметра помогло бы.

  • 0
    Hai..вы найдете, как получить список видео .. ??
Теги:
youtube
youtube-api
channel

12 ответов

130

Вам нужно посмотреть 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}
  • 23
    Это вернет только первые maxResults=20 (до 50) видео, но не весь каталог каналов. Если вы хотите получить больше результатов, используйте pageToken, как описано здесь .
  • 0
    Я не могу найти, где запрошенная функция написана в документе. Видео имеют только три фильтра, и ни один из них не относится к каналу.
Показать ещё 12 комментариев
71

Во-первых, вам нужно получить идентификатор списка воспроизведения, который представляет заказы от пользователя/канала:

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}

  • 1
    Не каждый имеет имя пользователя YouTube в этом новом мире. У некоторых из них есть только идентификатор пользователя Google +, который не работает вместо имени пользователя YouTube.
  • 1
    @kristopolous У каждого канала YouTube есть идентификатор канала. Если вы переходите на страницу YouTube через Google Plus, он использует идентификатор пользователя Google plus в качестве ссылки на канал. Если вы переходили на канал из видео YouTube, вместо него используется свойство идентификатора канала YouTube.
Показать ещё 4 комментария
27

Здесь представлено видео от разработчиков Google, показывающее, как перечислять все видео в канале в v3 API Youtube.

Есть два шага:

  • Запросить каналы, чтобы получить идентификатор "uploads" . например https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
  • Используйте этот идентификатор "uploads" , чтобы запросить PlaylistItems, чтобы получить список видео. например https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50
  • 0
    Может ли "загрузить" Id изменить для данного канала?
  • 0
    Кажется, что загрузки такие же, как channelId, но ужасно несовместимые API, некоторые из них могут ответить на это stackoverflow.com/questions/43568521/…
Показать ещё 2 комментария
7

Попробуйте с этим, это может помочь вам:

https://gdata.youtube.com/feeds/api/videos?author=cnn&v=2&orderby=updated&alt=jsonc&q=news

здесь автор, так как вы можете указать свое имя канала и "q", так как вы можете указать ключевое слово поиска.

  • 0
    Где документация для этого API?
  • 1
    Этот API больше не доступен: «API данных YouTube (v2) официально устарел с 4 марта 2014 года»
3

Используя api версии 2, которая устарела, URL для загрузки (канала UCqAEtEr0A0Eo2IVcuWBfB9g): https://gdata.youtube.com/feeds/users/UCqAEtEr0A0Eo2IVcuWBfB9g/uploads

Существует версия api 3.

  • 0
    Для UCqAEtEr0A0Eo2IVcuWBfB9g это работает, я думаю, это потому, что он загружен одним пользователем. Как насчет HC-8jgBP-4rlI
  • 0
    Не проверял мои сообщения до сегодняшнего дня. Ты прав. Только для пользовательского канала.
Показать ещё 1 комментарий
2

Всего за 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}

1

Благодаря ссылкам, размещенным здесь и в других местах, я сделал онлайн-инструмент 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.
            }
});

Смотрите полный код здесь, и живая версия здесь.

  • 1
    Вы уверены, что это работает? Страница GitHub исчезла, а затем, когда я вводил в поля ключ API и идентификатор канала, я получал ошибки.
  • 0
    @JoffreyBaratheon спасибо за указание на неработающую ссылку на github. Я просто запустил это .. это работает. Получить этот идентификатор плейлиста сложно. Пожалуйста, посмотрите это: github.com/answerquest/answerquest.github.io/issues/2
1

Ниже приведена альтернатива 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
  • 0
    Как это работает? Я вставил API KEY с помощью одинарных кавычек '' в переменную api_key, затем вызвал функцию, передающую идентификатор канала, затем запустил программу на python, но ничего не произошло.
  • 0
    @JoffreyBaratheon функция возвращает массив, вы должны содержать это в переменной. Например: video_list = get_all_video_in_channel("ABC123EFG456") затем вы можете распечатать его, чтобы увидеть массив с помощью print(video_list)
1

Вот код, который вернет все идентификаторы видео в вашем канале

<?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 после входа в систему.

0

Так как у всех в этом потоке возникают проблемы из-за ограничения 500 видео здесь альтернативное решение с использованием youtube_dl в Python 3. Кроме того, не нужен ключ API.

  • Установите youtube_dl: sudo pip3 install youtube-dl
  • Узнайте свой идентификатор канала целевого канала. Идентификатор начнется с UC. Замените C для канала на U для загрузки (т.е. UU...), это список воспроизведения.
  • Используйте функцию загрузки списка воспроизведения из 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))
  • 1
    Я думаю, что это лучший ответ, так как ему не нужен ключ API. Чтобы сделать его еще более автоматизированным, вы можете использовать @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 может быть списком воспроизведения или идентификатором канала.
  • 0
    Вы можете сделать это, но я забыл сказать, что я сохранил код как dl-list.py .
0

Недавно вам пришлось извлекать все видео с канала и в соответствии с документацией разработчика 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>';
-4
  • 21
    Легко сказать, но почему бы вам не поставить хороший ответ на рабочем примере ???

Ещё вопросы

Сообщество Overcoder
Наверх
Меню