チャンネルのすべての動画を取得するYouTube API


197

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

しかし、それは助けにはなりません。

チャンネルに投稿されたすべての動画が必要です。チャンネルにアップロードされた動画は複数のユーザーからのものである可能性があるため、ユーザーパラメータを指定しても役に立たないと思います...


自分のビデオファイルにアクセスできますか?API経由でログインしたときに自分のコンテンツを基本的にダウンロードするには!!!
filthy_wizard

回答:


216

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動画IDと詳細を含むを受け取り、次のように動画のURLを作成できます。

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

29
これにより、最初maxResults=20(最大50)のビデオのみが返され、チャンネルカタログ全体は返されません。さらに結果が必要な場合は、ここで説明するようにpageTokenを使用します
ファビオ・ペレス

2
Romulus Urakagi Ts'ai:ビデオをリクエストするときに、チャンネルのフィルターであるchannelIdを指定しています。
akshay 2014年

11
次のページトークンを使用した場合、チャンネルから最大500本の動画しか取得できないことに注意してください。
トニーPaternite

3
@TonyPaternite 500以上の動画を取得するにはどうすればよいですか。私は現在この問題に直面しています。
ラジャ

3
問題はここでよく説明されています。code.google.com/p/gdata-issues/issues/detail?id=4282別の日付範囲で試すことは、より多くのビデオを取得する1つの方法です。
Raja

119

まず、ユーザー/チャンネルからのアップロードを表すプレイリストのIDを取得する必要があります。

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

ユーザー名はforUsername={username}paramで指定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"は今後の参照用にチャンネル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のユーザー名を持っているわけではありません。それらのいくつかはyoutube +ユーザー名の代わりに機能しないgoogle +ユーザーID番号しか持っていません
kristopolous

1
@kristopolousすべてのYouTubeチャンネルにはチャンネルIDがあります。Google plus経由でYouTubeページにアクセスすると、チャンネルへのリンクとしてGoogle plusユーザーIDが使用されます。YouTubeビデオからチャンネルにアクセスした場合、代わりにYouTubeのチャンネルIDプロパティが使用されます。
Ignat、

19
これは完璧です。特に、100の代わりに2つの割り当てポイントしか使用しないためです(検索呼び出しが使用するため)。
JP de la Torre

1
somteimes it(developers.google.com/youtube/v3/docs/playlistItems/list#try-it)は機能しますが、同じuploadIdに対して404がスローされ、何が起こっているのかわからない場合があります。
ishandutta2007

1
playlistjaエンドポイントの@jambroseで、publishAfter / publishedBeforeなどの日付範囲パラメーターの使用方法。試してみましたが、機能していませんチャンネルのすべての動画を取得する方法
過酷なsachdev

79

これv3は、YouTube APIのチャンネル内のすべての動画を一覧表示する方法を示すGoogle Developersの動画です。

2つのステップがあります。

  1. 「アップロード」IDを取得するためにチャネルをクエリします。例えばhttps://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails

  2. この「アップロード」IDを使用してPlaylistItemsをクエリし、動画のリストを取得します。例えばhttps://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50


1
特定のチャネルのIDを「アップロード」することはできますか?
ishandutta2007 2017

アップロードがchannelIdと同じですが、ひどく矛盾したAPI、このいくつかの答えをすることができそうですstackoverflow.com/questions/43568521/...
ishandutta2007

1
@ ishandutta2007アップロードIDはチャンネルIDと異なります。
vicke4


正常に動作しています。しかし、私は複数のチャネルIDを持っているので、それらをAPIに送信する方法、カンマ区切りのチャネルIDを使用する方法
Onkar Musale

31

チャンネルリストを取得するには:

forUserNameでチャンネルリストを取得します

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

チャネルIDでチャネルリストを取得します。

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=

プレイリストを取得するには:

チャンネルIDで再生リストを取得します

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

pageTokenを使用してチャンネルIDで再生リストを取得します

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

PlaylistItemsを取得するには:

PlayListIdで PlaylistItemsリストを取得します。

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

ビデオを取得するには:

ビデオIDでビデオリストを取得します。

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

複数の動画IDで動画リストを取得します。

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

コメントリストを取得する

動画IDでコメントリストを取得します

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

チャンネルIDでコメントリストを取得します

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

ここですべてのAPIはGetアプローチです。

チャンネルIDに基づいて、すべての動画を直接取得することはありません。これが重要なポイントです。

統合用https://developers.google.com/youtube/v3/quickstart/ios?ver=swift


複数のチャネルIDをAPIに送信する方法、カンマ区切りのチャネルIDを使用する方法
Onkar Musale

APIを使用して上位10/50/100 YouTubeチャンネルを取得するにはどうすればよいですか?
Rajeshwar

10

以下は、特別なパッケージを必要としない代替Pythonです。チャネルIDを提供することにより、そのチャネルのビデオリンクのリストを返します。機能させるには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変数に貼り付け、チャネルIDを渡す関数を呼び出してから、Pythonプログラムを実行しましたが、何も起こりません。
Joffrey Baratheon、2018

@JoffreyBaratheon関数は配列を返します。これを変数に含める必要があります。例:video_list = get_all_video_in_channel("ABC123EFG456")次に、それを印刷して、配列を表示するために使用できますprint(video_list)
phapha pha

7

これは、チャンネルの下にあるすべての動画IDを返すコードです

<?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でチャンネルIDを取得でき ます。


1
これは間違いなく機能するクリーンなソリューションです。現在、プロダクションで使用しています。
Codex73

7

以下のようにしてみてください。それはあなたを助けるかもしれません。

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

作成者はチャンネル名を指定でき、「q」は検索キーワードを指定できるため


そのAPIのドキュメントはどこにありますか?
Macabeus 14年

1
このAPIは利用できなくなりました:「2014年3月4日をもってYouTube Data API(v2)は正式に廃止されました」
Bruce van der Kooij


6

ここや他の場所で共有されたリファレンスのおかげで、チャンネルのすべての動画を取得するために使用できるオンラインスクリプト/ツールを作成しました。

それはへのAPI呼び出しを組み合わせましたyoutube.channels.listplaylistItemsvideos。再帰関数を使用して、有効な応答を取得すると非同期コールバックが次の反復を実行するようにします。

これは、同時に行われるリクエストの実際の数を制限するのにも役立つため、YouTube APIのルールに違反しないように保護されます。短いスニペットを共有してから、完全なコードへのリンク。次の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キーとチャネルIDをフィールドに入力すると、エラーが発生します。
Joffrey Baratheon、2018

壊れたgithubリンクを指摘してくれて、@ JoffreyBaratheonに感謝します。実行しただけです。そのプレイリストIDを取得するのは難しいです。pls
Nikhil VJ

良くやった。更新されたgithubリンクで非常にうまく機能します。jqueryとpapaparse.min.jsが必要になります
Bludau Media

@thE_iNviNciblEそれを取り上げてくれてありがとう。それについて言及した。
Nikhil VJ

@ nikhil-vj実際のシナリオでは使用できません。クライアントブラウザにyoutube API-Tokenを与えないでください。しかし、プログラミング教育についてはかなりいい仕事です:-)
Bludau Media

4

この質問に答えるすべての人が500ビデオの制限のために問題を抱えているので、ここにPython 3でyoutube_dlを使用する代替ソリューションがあります。また、APIキーは必要ありません

  1. youtube_dlをインストールします。 sudo pip3 install youtube-dl
  2. ターゲットチャネルのチャネルIDを調べます。IDは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再生リストまたはチャンネルIDを指定できます。
cdlvcdlv

推論できますが、コードをとして保存したことを忘れていましたdl-list.py
cdlvcdlv

2

廃止予定のAPIバージョン2を使用した場合、(チャネルUCqAEtEr0A0Eo2IVcuWBfB9gの)アップロードのURLは次のとおりです。

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

APIバージョン3があります。


UCqAEtEr0A0Eo2IVcuWBfB9gの場合は機能します。これは、単一のユーザーがアップロードしたためと考えられます。HC-8jgBP-4rlIについてはどうですか
Rajendra Dewani 2013年

今日までメッセージを確認していませんでした。あなたが正しい。ユーザーチャネルのみ。
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>';

これは、タイトル、ビデオのURL、ビデオを識別する画像、高評価/コメントの数を含むすべてのビデオを取得しますか?これがどのように公開されるかに関するいくつかの情報が役立つでしょう。ありがとう。
Khom Nazid

1

Pythonのサンプルソリューション。このビデオからのヘルプ:ビデオ 他の多くの回答と同様に、アップロードIDは最初にチャネルIDから取得されます。

urllib.requestをインポートする
jsonをインポートする

key = "YOUR_YOUTUBE_API_v3_BROWSER_KEY"

#チャネルのリスト:チャネルIDまたはユーザー名を貼り付けるかどうかを言及-「id」または「forUsername」
ytids = [["bbcnews"、 "forUsername"]、["UCjq4pjKj9X4W9i7UnYShpVg"、 "id"]]

ニュースタイトル= []
ytidsのytid、ytparamの場合:
    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']
    #チャンネルIDからアップロードIDを取得
    uploadid = uploadsdet [0] ['contentDetails'] ['relatedPlaylists'] ['uploads']

    #検索リスト
    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])

リンク、ニュースタイトルのタイトル:
    印刷(リンク、タイトル)

-2

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


'''for me /media/shivam/BIG/ninja is the folder where i've previously downloaded all the videos from channel'''    
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])

`


-6

ドキュメントに記載されているように(リンク)、チャンネルのリソースタイプと操作リストを使用して、チャンネル内のすべての動画を取得できます。この操作は、引数 'channel id'を使用して実行する必要があります。


22
言うのは簡単ですが、良い、実用的な例で答えを出してみませんか???
akshay 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.