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

201

Нам нужен список видео по названию канала YouTube (используя API).

Мы можем получить список каналов (только название канала), используя следующий 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=UC7Xayrf2SWZZ

Но это не помогает.

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

Раджендра Девани
источник
Могу ли я получить доступ к своим собственным видео файлам. по сути загружать свой собственный контент при входе через API !!!
filthy_wizard

Ответы:

218

Вам нужно взглянуть на API данных YouTube . Там вы найдете документацию о том, как получить доступ к 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видео с идентификаторами и деталями видео, и вы можете создать URL своего видео следующим образом:

http://www.youtube.com/watch?v={video_id_here}
Акшай
источник
29
Это вернет только первые maxResults=20(до 50) видео, но не весь каталог каналов. Если вы хотите больше результатов, используйте pageToken, как описано здесь .
Фабио Перес
2
Romulus Urakagi Ts'ai: при запросе видео вы указываете channelId, то есть фильтр для канала.
Акшай
11
Стоит отметить, что вы можете получить до 500 видео только с канала, используя токены следующей страницы.
Тони Патернит
3
@TonyPaternite Как получить более 500 видео. Я в настоящее время сталкиваюсь с этой проблемой.
Раджа
3
Проблема хорошо объяснена здесь. code.google.com/p/gdata-issues/issues/detail?id=4282 Попытка использовать другой диапазон дат - это один из способов получить больше видео, чем кажется.
Раджа
120

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

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

Просто загляните в плейлист!

GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId=UUpRmvjdu3ixew5ahydZ67uA&key={YOUR_API_KEY}

jambrose
источник
1
Не каждый имеет имя пользователя YouTube в этом новом мире. У некоторых из них есть только идентификатор пользователя Google +, который не работает вместо имени пользователя YouTube
kristopolous
1
@kristopolous У каждого канала YouTube есть идентификатор канала. Если вы переходите на страницу YouTube через Google Plus, он использует идентификатор пользователя Google plus в качестве ссылки на канал. Если вы переходили на канал из видео YouTube, вместо него используется свойство идентификатора канала YouTube.
Игнат
19
Это потрясающе. Особенно потому, что он тратит только 2 квотных пункта вместо 100 (на что будет потрачен поисковый вызов).
JP de la Torre
1
somteimes он работает ( developers.google.com/youtube/v3/docs/playlistItems/list#try-it ), иногда он выдает 404 для того же идентификатора загрузки, не знаю, что происходит.
ishandutta2007
1
@jambrose в конечной точке playlistItems, как использовать какой-либо параметр диапазона дат, например publishAfter / publBefore. Я попробовал это, не работает Так, как я получаю все видео канала.
Суровый сахдев
80

Вот видео от разработчиков Google, показывающее, как составить список всех видео на канале v3API YouTube.

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

  1. Каналы запросов для получения идентификатора «закачек». напримерhttps://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails

  2. Используйте этот идентификатор «uploads» для запроса PlaylistItems, чтобы получить список видео. напримерhttps://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50

virtualmic
источник
1
Может ли "загрузить" Id изменить для данного канала?
ishandutta2007
Кажется, что загрузки такие же, как channelId, но ужасно несовместимые API, некоторые могут ответить на это stackoverflow.com/questions/43568521/…
ishandutta2007
1
@ ishandutta2007 идентификатор загрузки не отличается от идентификатора канала.
vicke4
@ virtualmic @ Peter Perfect Solution Ребята, спасибо
Аска Патель
это работает нормально. но у меня есть несколько идентификаторов каналов, так как я могу отправить их в API, могу ли я использовать идентификаторы
каналов, разделенные
32

Чтобы получить список каналов:

Получить список каналов по forUserName :

https://www.googleapis.com/youtube/v3/channels?part=snippet,contentDetails,statistics&forUsername=Apple&key=

Получить список каналов по идентификатору канала :

https://www.googleapis.com/youtube/v3/channels/?part=snippet,contentDetails,statistics&id=UCE_M8A5yxnLfW0KghEeajjw&key=

Получить разделы канала:

https://www.googleapis.com/youtube/v3/channelSections?part=snippet,contentDetails&channelId=UCE_M8A5yxnLfW0KghEeajjw&key=

Чтобы получить плейлисты:

Получить плейлисты по идентификатору канала :

https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key=

Получить плейлисты по идентификатору канала с pageToken :

https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key= & pageToken = CDIQAA

Чтобы получить PlaylistItems:

Получить PlaylistItems список от PlayListId :

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails&maxResults=25&playlistId=PLHFlHpPjgk70Yv3kxQvkDEO5n5tMQia5I&key=

Чтобы получить видео:

Получить список видео по идентификатору видео :

https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=YxLCwfA1cLw&key=

Получить список видео по нескольким идентификаторам видео :

https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=YxLCwfA1cLw,Qgy6LaO3SB0,7yPJXGO2Dcw&key=

Получить список комментариев

Получить список комментариев по идентификатору видео :

https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&videoId=el **** kQak & key = A ********** k

Получить список комментариев по идентификатору канала :

https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&channelId=U ***** Q & key = AI ******** k

Получить список комментариев по всем ThreadsRelatedToChannelId :

https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&allThreadsRelatedToChannelId=UC ***** ntcQ & key = AI ***** k

Здесь все API-интерфейсы Get подход.

Основываясь на идентификаторе канала, мы не можем получить все видео напрямую, это важный момент.

Для интеграции https://developers.google.com/youtube/v3/quickstart/ios?ver=swift

IOS
источник
Как я могу отправить несколько идентификаторов каналов в API, можно ли использовать идентификаторы каналов через запятую
Onkar Musale
Как я могу получить лучшие 10/50/100 каналов YouTube с помощью API?
Раджешвар
10

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

Вот код, который будет возвращать все видео идентификаторы по вашему каналу

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

Михир Бхатт
источник
1
Это определенно чистое решение, которое работает. В настоящее время используется в производстве.
Codex73
7

Попробуйте как в следующем. Это может помочь вам.

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

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

Nagaraja
источник
Где находится документация для этого API?
Макабей
1
Этот API больше не доступен: «API данных YouTube (v2) официально объявлен устаревшим с 4 марта 2014 г.»
Брюс ван дер Коои
6

Благодаря ссылкам, опубликованным здесь и в других местах, я создал онлайн-скрипт / инструмент, который можно использовать для получения всех видео канала.

Он сочетает в себе вызовы 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
            // information and push it to a global array
            if (i < vidsList.length - 1) {
                fetchViddetails(i+1) // Recursive: calls itself if the
                                     //            list isn't over.
            }
});

Смотрите полный код здесь , и живую версию здесь . (Правка: исправлена ​​ссылка на github)
Правка: Зависимости: JQuery, Papa.parse

Нихил В.Ю.
источник
1
Вы уверены, что это работает? Страница GitHub исчезла, а затем, когда я вводил в поля ключ API и идентификатор канала, я получал ошибки.
Джоффри Баратеон
@JoffreyBaratheon спасибо за указание на неработающую ссылку на github. Я просто запустил это .. это работает. Получить этот идентификатор плейлиста сложно. Просьба посмотреть это: github.com/answerquest/answerquest.github.io/issues/2
Nikhil VJ,
хорошая работа. очень хорошо работает с обновленной ссылкой GitHub. вам понадобятся jquery и papaparse.min.js
Bludau Media,
@thE_iNviNciblE спасибо, что подняли это. упомянул об этом.
Nikhil VJ
@ nikhil-vj это не применимо для сценария реального мира, вы не должны предоставлять клиентскому браузеру API-токен YouTube. Но для обучения программированию довольно хорошая работа :-)
Bludau Media
4

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

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

При использовании API версии 2, которая устарела, URL для загрузки (канала UCqAEtEr0A0Eo2IVcuWBfB9g):

https://gdata.youtube.com/feeds/users/UCqAEtEr0A0Eo2IVcuWBfB9g/uploads

Есть версия API 3.

Als
источник
Для UCqAEtEr0A0Eo2IVcuWBfB9g это работает, я думаю, это потому, что он загружен одним пользователем. Как насчет HC-8jgBP-4rlI
Раджендра Девани
Не проверял мои сообщения до сегодняшнего дня. Ты прав. Только для пользовательского канала.
Als
9
Ссылка мертва.
user3078414
2

Недавно мне пришлось извлечь все видео из канала, и согласно документации разработчика 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объект

Таким образом, вам нужно извлечь информацию из канала, чтобы получить список «загрузок», в котором фактически все видео, загруженные каналом, загружены: 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>';
Glastis
источник
Получает ли это все видео с заголовками, URL-адрес видео, изображение, идентифицирующее видео, количество лайков / комментариев? Некоторая информация о том, как это публикуется, будет полезна. Спасибо.
Хом Назид
1

Пример решения на Python. Помощь взята из этого видео: видео Как и во многих других ответах, идентификатор загрузки должен быть сначала извлечен из идентификатора канала.

импорт urllib.request
импорт JSON

key = "YOUR_YOUTUBE_API_v3_BROWSER_KEY"

# Список каналов: укажите, если вы вставляете идентификатор канала или имя пользователя - "id" или "forUsername"
ytids = [["bbcnews", "forUsername"], ["UCjq4pjKj9X4W9i7UnYShpVg", "id"]]

newstitles = []
для ytid, ytparam в ytids:
    urld = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"="+ytid+"&key="+key
    с urllib.request.urlopen (urld) в качестве URL:
        datad = json.loads (url.read ())
    uploadsdet = datad ['items']
    # получить идентификатор загрузки из идентификатора канала
    uploadid = uploadsdet [0] ['contentDetails'] ['relatedPlaylists'] ['uploads']

    #retrieve list
    urld = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId="+uploadid+"&key="+key
    с urllib.request.urlopen (urld) в качестве URL:
        datad = json.loads (url.read ())

    для данных в датате ['items']:
        ntitle = data ['snippet'] ['title']
        nlink = data ['contentDetails'] ['videoId']
        newstitles.append ([nlink, ntitle])

для ссылки, заголовок в новостных заголовках:
    печать (ссылка, название)
Ananth
источник
-6

Как указано в документации ( ссылка ), вы можете использовать тип ресурса канала и список операций, чтобы получить все видео в канале. Эта операция должна выполняться с использованием аргумента «идентификатор канала».

Singh
источник
22
Легко сказать, но почему бы вам не поставить хороший ответ на рабочем примере ???
Акшай