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=UC7XayZN2kSSQQ

Але, це не допомагає.

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


чи можу я отримати доступ до власних відеофайлів. фактично завантажувати власний вміст під час входу через 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) відео, але не весь каталог каналів. Якщо ви хочете отримати більше результатів, скористайтеся сторінкою Взяті, як описано тут .
Фабіо Перес

2
Romulus Urakagi Ts'ai: під час запиту відео ви надаєте channelId, тобто фільтр для каналу.
акшай

11
Варто зазначити, що ви можете отримати до 500 відео з каналу, використовуючи символи наступної сторінки.
Тоні Патерніт

3
@TonyPaternite Як отримати більше 500 відео. Зараз я стикаюся з цим питанням.
Раджа

3
Тут питання добре пояснено. code.google.com/p/gdata-isissue/isissue/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"це ваш каналID для подальшого використання.

Далі, отримайте список відео в цьому списку відтворення:

https://developers.google.com/youtube/v3/docs/playlistItems/list#try-it

Просто занесіть у список відтворенняId!

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


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 за той же uploadId, не знаю, що відбувається.
ishandutta2007

1
@jambrose в кінцевій точці відтворенняItems, як використовувати якийсь параметр діапазону дат, наприклад, PubAfter / publishedBefore. Я спробував це, не працюючи. Отже, як я отримую всі відео каналу.
Суворий sachdev

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


1
Чи можна "завантажити" зміни змін для певного каналу?
ishandutta2007

здається , додавання такі ж , як channelId, але дуже суперечливі APIs, може якісь - то відповісти на цей stackoverflow.com/questions/43568521 / ...
ishandutta2007

1
@ ishandutta2007 ідентифікатор завантаження не відрізняється від ідентифікатора каналу.
віка4

@ virtualmic @ Пітер Ідеальне рішення хлопці, спасибі
Aaska Patel

це працює чудово. але у мене є декілька ідентифікаторів каналів, тож як я можу надіслати їх у api, чи можу я використати відокремлені комами ідентифікатори каналів
Onkar Musale

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=

Отримайте списки відтворення за ідентифікатором каналу за допомогою сторінкиToken :

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

Отримати список коментарів від allThreadsRelatedToChannelId :

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

Тут усі апі - Get підхід.

На основі ідентифікатора каналу ми не можемо отримувати всі відео безпосередньо, це важливий момент.

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


Як я можу надсилати ідентифікатори декількох каналів до 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

Як це працює? Я вставив 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", як ви можете ввести ключове слово пошуку.


Де знаходиться документація для цього API?
Макабей

1
Цей API більше недоступний: "API даних YouTube (v2) офіційно застарів з 4 березня 2014 року"
Bruce van der Kooij

7

Всього в три кроки:

  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: список -> https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id} & key = {YOUR_API_KEY}


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.
             }
    });
}

Це отримало основний список відео, включаючи id, заголовок, дату публікації тощо. Але для отримання більш детальної інформації про кожне відео, наприклад, кількість переглядів і подобається, потрібно робити дзвінки 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. Я просто запустив це. Це працює. Отримати цей плейлист ідентично
Nikhil VJ

хороша робота. дуже добре працює з оновленим посиланням github. вам знадобляться jquery та papaparse.min.js
Bludau Media

@thE_iNviNciblE дякую за те, що підняв це. згадав про це.
Nikhil VJ

@ nikhil-vj це не корисно для реального світу szenario, ви не повинні давати клієнтському браузеру 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))

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

Є версія версії 3.


Для UCqAEtEr0A0Eo2IVcuWBfB9g це працює, я думаю, це тому, що його завантажив один користувач. Як щодо HC-8jgBP-4rlI
Rajendra Dewani

Не перевіряв мої повідомлення до сьогодні. Ти маєш рацію. Лише для користувальницького каналу.
Альс

9
Посилання мертва.
користувач3078414

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>';

Чи отримує це всі відео із заголовками, 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']
    #get ідентифікатор завантаження з ідентифікатора каналу
    uploadid = uploadsdet [0] ['contentDetails'] ['relatedPlaylists'] ['uploads']

    #retrieve список
    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 ())

    для даних у datad ['items']:
        ntitle = data ['snippet'] ['title']
        nlink = data ['contentDetails'] ['videoId']
        newstitles.append ([nlink, ntitle])

за посиланням, заголовком у нових інститутах:
    друк (посилання, назва)

-6

Як зазначено в документації ( посилання ), ви можете використовувати тип ресурсу каналу та список операцій, щоб отримати всі відео в каналі. Ця операція повинна бути виконана за допомогою аргументу "ідентифікатор каналу".


22
Це легко сказати, але чому ви не ставите свою відповідь добрим і робочим прикладом ???
акшай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.