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

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

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

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

Ответ 1

Вам нужно взглянуть на 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}

Ответ 2

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

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

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

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

Ответ 3

Вот видео от разработчиков Google, показывающее, как составить список всех видео на канале в v3 API 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

Ответ 4

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

Получить список каналов по 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 Get.

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

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

Ответ 6

Ниже приведена альтернатива 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

Ответ 8

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

Он объединяет вызовы 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

Ответ 9

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

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

Ответ 10

Поскольку у всех, кто отвечает на этот вопрос, есть проблемы из-за ограничения в 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))

Ответ 12

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

Ответ 13

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

import urllib.request
import json

key = "YOUR_YOUTUBE_API_v3_BROWSER_KEY"

#List of channels : mention if you are pasting channel id or username - "id" or "forUsername"
ytids = [["bbcnews","forUsername"],["UCjq4pjKj9X4W9i7UnYShpVg","id"]]

newstitles = []
for ytid,ytparam in ytids:
    urld = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"="+ytid+"&key="+key
    with urllib.request.urlopen(urld) as url:
        datad = json.loads(url.read())
    uploadsdet = datad['items']
    #get upload id from channel id
    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
    with urllib.request.urlopen(urld) as url:
        datad = json.loads(url.read())

    for data in datad['items']:
        ntitle =  data['snippet']['title']
        nlink = data['contentDetails']['videoId']
        newstitles.append([nlink,ntitle])

for link,title in newstitles:
    print(link, title)

Ответ 14

Ссылки, загруженные с канала YouTube, не сохраняют структуру каталогов. Итак, я написал код для того, чтобы это произошло. Используйте это, как только вы загрузите видео сверху приемлемым способом. '

def play_vid(channel):
    yset = dict()
    temp = []
    link = channel + '/playlists'
    first = urlopen(link)
    bs = BeautifulSoup(first.read(), 'html.parser')
    for i in bs.find_all('a', {'class':'yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2'}):
        print('Creating list for the playlist: ', i.get_text())
        link = 'https://www.youtube.com'+i.get('href')
#         print(link)
        first = urlopen(link)
        bsp = BeautifulSoup(first.read(), 'html.parser')
        res=bsp.find_all('a',{'class':'pl-video-title-link'})
        for l in res:
            temp.append(l.get_text().replace(" ", "").strip())
        yset[i.get_text()]=temp
        temp=[]
    print("Done!!")
    return yset



checking = play_vid('https://www.youtube.com/user/NinjaTraderLLC')

with open('/media/shivam/BIG/ninja/channel_cover', 'wb+') as handle:
    pickle.dump(checking, handle)

mv channel_cover /media/shviam/Myra/Ninja/


with open('/media/shivam/BIG/ninja/channel_cover', 'rb') as handle:
    scraped = pickle.load(handle)

os.path.isfile('scrap.ipynb')

downloaded = [file for file in os.listdir('/media/shivam/BIG/ninja/') if os.path.isfile('/media/shivam/BIG/ninja/'+file)]

hash_table = dict()
for i in downloaded:
    hash_table[i.replace(" ", "")] = i

for i in scraped.keys():

    if os.path.isdir('/media/shivam/BIG/ninja/'+ i):
        pass
    else:
        os.mkdir('/media/shivam/BIG/ninja/'+ i)
    minn = 1000
    mov = ""

    for j in scraped[i]:
        for k in hash_table.keys():
            if nltk.edit_distance(j, k) < minn:
                minn = nltk.edit_distance(j, k)
                mov = k
        minn = 1000
        print("Moving ",mov, "for  channel: ",j)
        shutil.copy('/media/shivam/BIG/ninja/'+ hash_table[mov], '/media/shivam/BIG/ninja/'+ i +'/'+hash_table[mov])

'

Ответ 15

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