Bir kanaldaki tüm videoları almak için YouTube API'sı


201

YouTube'un kanal adına göre (API kullanarak) bir video listesine ihtiyacımız var.

Aşağıdaki API'yı kullanarak bir kanal listesi (yalnızca kanal adı) alabiliriz:

https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar

Aşağıda kanalların doğrudan bağlantısı bulunmaktadır

https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g

Veya

WWW.YouTube.com/channel/HC-8jgBP-4rlI

Şimdi, kanal >> UCqAEtEr0A0Eo2IVcuWBfB9g veya HC-8jgBP-4rlI videolarına ihtiyacımız var.

Biz denedik

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

Ancak, yardımcı olmuyor.

Kanalda yayınlanan tüm videolara ihtiyacımız var. Bir kanala yüklenen videolar birden fazla kullanıcıdan olabilir, bu yüzden bir kullanıcı parametresi sağlamanın yardımcı olacağını düşünmüyorum ...


kendi video dosyalarıma erişebilir miyim? üzerinden giriş yaptığımda aslında kendi içeriğimi indirmek için !!!
filthy_wizard

Yanıtlar:


218

YouTube Veri API'sına bakmanız gerekir . Orada API'ya nasıl erişilebileceğine ilişkin belgeler bulacaksınız. İstemci kitaplıklarını da bulabilirsiniz .

İstekleri kendiniz de yapabilirsiniz. Bir kanaldan en son videoları alan örnek bir URL:

https://www.googleapis.com/youtube/v3/search?key={your_key_here}&channelId={channel_id_here}&part=snippet,id&order=date&maxResults=20

Bundan sonra, JSONvideo kimlikleri ve ayrıntıları içeren bir a alırsınız ve video URL'nizi şu şekilde oluşturabilirsiniz:

http://www.youtube.com/watch?v={video_id_here}

29
Bu yalnızca ilk maxResults=20(50'ye kadar) videoları döndürür , ancak tüm kanal kataloğunu döndürmez . Daha fazla sonuç istiyorsanız, burada açıklandığı şekilde pageToken öğesini kullanın .
Fábio Perez

2
Romulus Urakagi Ts'ai: video talep ederken channelId veriyorsunuz, kanal için filtre bu.
akshay

11
Bir sonraki sayfa belirteçlerini kullanarak bir kanaldan en fazla 500 video alabileceğinizi belirtmek gerekir.
Tony Paternite

3
@TonyPaternite 500'den fazla videoyu nasıl edinebilirim? Şu anda bu sorunla karşı karşıyayım.
Raja

3
Sorun burada iyi açıklanmıştır. code.google.com/p/gdata-issues/issues/detail?id=4282 Farklı bir tarih aralığıyla denemek, daha fazla video almanın bir yoludur.
Raja

120

İlk olarak, kullanıcıdan / kanaldan yüklemeleri temsil eden oynatma listesinin kimliğini almanız gerekir:

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

forUsername={username}Paramayla kullanıcı adını belirtebilir veya mine=truekendinizinkini almayı belirtebilirsiniz (önce kimlik doğrulaması yapmanız gerekir). part=contentDetailsOynatma listelerini görmek için ekleyin .

GET https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=jambrose42&key={YOUR_API_KEY}

Sonuçta "relatedPlaylists"dahil olacak "likes"ve "uploads"çalma listeleri. Bu "upload"oynatma listesi kimliğini alın . Ayrıca "id"ileride başvurmak üzere kanal kimliğiniz olduğunu unutmayın .

Ardından, bu oynatma listesindeki videoların bir listesini alın:

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

Sadece playlistId'ye bırakın!

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


1
Bu yepyeni dünyada herkesin youtube kullanıcı adı yok. Bazılarının sadece bir youtube kullanıcı adı yerine çalışmayan bir google + kullanıcı kimlik numarası var
kristopolous

1
@kristopolous Her YouTube kanalının bir kanal kimliği vardır. Google plus üzerinden bir YouTube sayfasına giderseniz, kanalın bağlantısı olarak Google plus kullanıcı kimliğini kullanır. Bir YouTube videosundan kanala gittiyseniz, bunun yerine YouTube'un kanal kimliği özelliğini kullanır.
Ignat

19
Bu harika. Özellikle 100 yerine 2 kota harcaması ( arama çağrısının harcayacağı için).
JP de la Torre

1
bazen ( developers.google.com/youtube/v3/docs/playlistItems/list#try-it ) çalışır, bazen aynı uploadId için 404 atar, neler olduğunu bilmiyorum.
ishandutta2007

1
Endpoint bitiş noktası, publishAfter / publishBefore gibi bir tarih aralığı parametresinin nasıl kullanılacağı. Bir kanalın tüm videolarını nasıl getireceğimi denedim.
Harsh sachdev

80

İşte bir kanaldaki tüm videoların listelemek için nasıl gösteren Google Geliştiriciler bir video v3YouTube API.

İki adım vardır:

  1. "Yüklemeler" Kimliği almak için Kanalları Sorgula. Örneğinhttps://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails

  2. Video listesini almak için PlaylistItems'i sorgulamak için bu "yüklemeler" kimliğini kullanın. Örneğinhttps://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50


1
Belirli bir kanal için "yüklemeler" kimliği değişebilir mi?
ishandutta2007

yüklemeler channelId ile aynı görünüyor, ancak çok tutarsız API'lar, bazıları bu stackoverflow.com/questions/43568521/…
ishandutta2007 23:17

1
@ ishandutta2007 hiçbir yükleme kimliği kanal kimliğinden farklı değil.
vicke4

@ virtualmic @ Peter Mükemmel Çözüm Çocuklar, Teşekkürler
Aaska Patel

iyi çalışıyor. ama birden fazla kanal kimlikleri var, bu yüzden onları
api'ye

32

Kanal listesini almak için:

Kanallar listesini forUserName ile al :

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

Kanal listesini kanal kimliğine göre al :

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

Kanal bölümlerini alın:

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

Oynatma Listeleri almak için:

Kanal Kimliğine Göre Oynatma Listelerini Alın :

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

PageToken ile Kanal Kimliğine göre Oynatma Listeleri alın :

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

Oynatma Listesi almak için:

PlayListId tarafından PlaylistItems listesini alın :

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

Video almak için:

Video listesini video kimliğine göre alın :

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

Birden fazla video kimliğiyle video listesini alın :

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

Alın comments listesi

Video kimliğine göre Yorum listesini alın :

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

Kanal kimliğine göre Yorum listesini alın :

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

AllThreadsRelatedToChannelId tarafından Yorum listesini al :

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

İşte tüm api'ler Get yaklaşımıdır.

Kanal kimliğine dayanarak tüm videoları doğrudan elde edemiyoruz, buradaki önemli nokta bu.

Entegrasyon için https://developers.google.com/youtube/v3/quickstart/ios?ver=swift



API kullanarak en iyi 10/50/100 youtube kanallarını nasıl edinebilirim?
Rajeshwar

10

Aşağıda herhangi bir özel paket gerektirmeyen bir Python alternatifi bulunmaktadır. Kanal kimliğini sağlayarak o kanal için video bağlantılarının bir listesini döndürür. Çalışması için bir API Anahtarına ihtiyacınız olduğunu lütfen unutmayın .

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

Bu nasıl çalışıyor? Api_key değişkenine tek tırnak '' kullanarak API KEY yapıştırdım, sonra kanal kimliğinden geçen işlevi çağırdım, sonra python programını çalıştırdım, ama hiçbir şey olmuyor.
Joffrey Baratheon

@JoffreyBaratheon işlevi bir dizi döndürür, bunu bir değişkene dahil etmeniz gerekir. Örneğin: video_list = get_all_video_in_channel("ABC123EFG456")o zaman diziyi görmek için yazdırabilirsinizprint(video_list)
phapha pha

7

Kanalınızın altındaki tüm video kimliklerini döndürecek kod

<?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);

Not : Oturum açtıktan sonra https://www.youtube.com/account_advanced adresinden kanal kimliği alabilirsiniz .


1
Bu kesinlikle işe yarayan temiz bir çözümdür. Şu anda üretimde kullanılıyor.
Codex73



6

Burada ve başka yerlerde paylaşılan referanslar sayesinde, bir kanalın tüm videolarını elde etmek için kullanabileceğiniz çevrimiçi bir komut dosyası / araç hazırladım.

Bu API çağrıları birleştirir youtube.channels.list, playlistItems, videos. Geçerli bir yanıt alındığında eşzamansız geri çağrıların bir sonraki yinelemeyi çalıştırmasını sağlamak için özyinelemeli işlevler kullanır.

Bu aynı zamanda, bir seferde yapılan gerçek istek sayısını sınırlamaya ve dolayısıyla YouTube API kurallarını ihlal etmenize engel olmaya hizmet eder. Kısaltılmış snippet'leri ve ardından tam kodun bağlantısını paylaşma. Ben sonraki 50 sonuçları getirmek için yanıt geliyor nextPageToken değerini kullanarak arama sınırlaması başına 50 max sonuçları var.

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

Bu videoda kimlik, başlık, yayın tarihi ve benzeri temel bir liste var. Ancak, görüntüleme sayıları ve beğeniler gibi her video hakkında daha fazla ayrıntı elde etmek için API çağrıları yapmak gerekir 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.
            }
});

Bkz tamamını buradan kodunu ve burada canlı versiyonu . (Düzenle: sabit github bağlantısı)
Düzenleme: Bağımlılıklar: JQuery, Papa.parse


1
Bunun işe yaradığından emin misiniz? GitHub sayfası gitti ve sonra alanlara API Anahtarı ve kanal kimliği girdiğimde hata alıyorum.
Joffrey Baratheon

@JoffreyBaratheon, kırık github bağlantısını işaret ettiğiniz için teşekkürler. Ben sadece koştum .. işe yarıyor. Bu oynatma listesi kimliğini almak zor .. pls bakın: github.com/answerquest/answerquest.github.io/issues/2
Nikhil VJ

iyi iş. güncellenmiş github bağlantısı ile çok iyi çalışıyor. jquery ve papaparse.min.js'ye ihtiyacınız olacak
Bludau Media

@thE_iNviNciblE Bunu getirdiğin için teşekkürler. bundan bahsetti.
Nikhil VJ

@ nikhil-vj Gerçek bir dünya szenario için kullanılabilir değil, Müşteri Tarayıcı youtube API-Token vermemelisiniz. Ama programlama eğitimi için oldukça güzel bir iş :-)
Bludau Media

4

Bu soruya cevap herkes nedeniyle sorunları var yana 500 Video limiti burada kullanarak alternatif bir çözüm youtube_dl içinde Python 3 . Ayrıca, API anahtarı gerekmez .

  1. Youtube_dl yükleyin: sudo pip3 install youtube-dl
  2. Hedef kanalınızın kanal kimliğini bulun . Kimlik UC ile başlayacak. Kanal için C'yi Yükleme için U (yani UU ...) ile değiştirin, bu yükleme oynatma listesidir .
  3. Youtube-dl'deki oynatma listesi indirme özelliğini kullanın . İdeal olarak, oynatma listesindeki varsayılan her videoyu değil, yalnızca meta verileri indirmek istemezsiniz.

Örnek (uyarı - on dakika sürer):

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 anahtarına ihtiyaç duymadığı için bunun en iyi cevap olduğunu düşünüyorum. Daha da otomatik hale getirmek için kullanabilirsiniz @for /f "usebackq tokens=2 delims=: " %a in (`dl-list.py^|findstr information`) do @echo https://www.youtube.com/watch?v=%a. Videoların tüm URL'lerini basacaktır. PLAYLIST_IDbir oynatma listesi veya kanal kimliği olabilir.
cdlvcdlv

Çıkarım yapabilirsiniz ama ben kodu olarak kaydettiğini söylemeyi unuttum dl-list.py.
cdlvcdlv

2

Kullanımdan kaldırılmış API sürüm 2'yi kullanarak, yüklemelerin URL'si (UCqAEtEr0A0Eo2IVcuWBfB9g kanalının):

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

Bir API sürüm 3 var.


UCqAEtEr0A0Eo2IVcuWBfB9g için çalışır, bunun tek bir kullanıcı tarafından yüklendiği için olduğunu düşünüyorum. HC-8jgBP-4rlI
Rajendra Dewani

Mesajlarımı bugüne kadar kontrol etmedim. Haklısın. Yalnızca bir kullanıcı kanalı için.
Als

9
Bağlantı öldü.
user3078414

2

Son zamanlarda bir kanaldan tüm videoları almak zorunda kaldım ve YouTube geliştirici belgelerine göre: 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'));

Nerede $servicesenin olduğu Google_Service_YouTubenesne.

Bu nedenle, kanal tarafından yüklenen tüm videoları içeren "yüklemeler" oynatma listesini almak için kanaldan bilgi almanız gerekir: https://developers.google.com/youtube/v3/docs/channels/list

Bu API ile yeniyse, kod parçasını varsayılan snippet'ten tam örneğe çevirmenizi şiddetle tavsiye ederim.

Bir kanaldaki tüm videoları almak için temel kod şöyle olabilir:

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

Bu, başlıklara, videonun URL'sine, videoyu tanımlayan bir resme, beğeni / yorum sayısına sahip tüm videoları alıyor mu? Bunun nasıl yayınlanacağı hakkında bazı bilgiler. Teşekkürler.
Khom Nazid

1

Python'da örnek çözüm . Bu videodan alınan yardım: video Diğer birçok yanıt gibi, yükleme kimliği önce kanal kimliğinden alınacaktır.

import urllib.request
ithalat json

key = "YOUR_YOUTUBE_API_v3_BROWSER_KEY"

# Kanal listesi: kanal kimliğini veya kullanıcı adını yapıştırdığınızı belirtin - "id" veya "forUsername"
ytids = [["bbcnews", "forUsername"], ["UCjq4pjKj9X4W9i7UnYShpVg", "kimlik"]]

newstitles = []
ytid için, ytidlerde ytparam:
    urld = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"="+ytid+"&key="+key
    urllib.request.urlopen (urld) ile url olarak:
        datad = json.loads (url.read ())
    uploadsdet = datad ['öğeler']
    #get kanal kimliğinden yükleme kimliği
    uploadid = uploadsdet [0] ['contentDetails'] ['relatedPlaylists'] ['yüklemeler']

    #retrieve list
    urld = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId="+uploadid+"&key="+key
    urllib.request.urlopen (urld) ile url olarak:
        datad = json.loads (url.read ())

    datad ['items'] içindeki veriler için:
        ntitle = veri ['snippet'] ['başlık']
        nlink = veri ['contentDetails'] ['videoId']
        newstitles.append ([nlink, ntitle])

bağlantı için, başlıklardaki başlık:
    yazdır (bağlantı, başlık)

-6

Belgelerin belirttiği gibi ( bağlantı ), bir kanaldaki tüm videoları almak için kanal kaynak türünü ve işlem Listesini kullanabilirsiniz. Bu işlem 'kanal kimliği' bağımsız değişkeni kullanılarak gerçekleştirilmelidir.


22
Söylemesi kolay, ama neden cevabınızı iyi ve çalışan bir örnekle belirtmiyorsunuz ???
akshay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.