115
Help us understand the problem. What are the problem?

posted at

updated at

Organization

【Python】YouTube Data API を使って、いろんな情報を取得してみた!

はじめに

YouTube Data API を触る機会があったので、情報をまとめたいと思います。

YouTube Data API とは

YouTube が提供している API で、動画やチャンネルなど情報を取得して、自分の Web サイトやアプリケーションで使用することができます。
一日あたりのAPI使用量(クォータ)の上限が10000になっているので、注意して使用してください。

API キーを取得する

Google Cloud Platform で プロジェクトを作成

ここから プロジェクトを作成します。

プロジェクト名は任意で、 プロジェクト ID は忘れずに変更しましょう。

プロジェクトの作成

YouTube Data API v3 を有効化

作成したプロジェクトで YouTube Data API を使用するため、有効にします。

ここからプロジェクトを選択した後、有効にします。

APIを有効にする

認証情報の作成

ここから API キーを作成します。

API キーの作成

作成した API キーは、実際に API を使う時に使用しますので、メモしておいてください。

YouTube Data API でいろんな情報を取得してみる

必要なパッケージをインストール

pyenv を使用して python のバージョンを変えておきます。

$ pyenv install 3.8.3
$ pyenv local 3.8.3

YouTube Data API を使用するためのパッケージをインストールします。

$ pip install google-api-python-client==1.9.3

YouTube チャンネル情報を検索

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

from apiclient.discovery import build

API_KEY = '<取得した API キーを入力します>'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
SEARCH_TEXT = '<検索したいチャンネル名>'

youtube = build(
    YOUTUBE_API_SERVICE_NAME,
    YOUTUBE_API_VERSION,
    developerKey=API_KEY
)

response = youtube.search().list(q=SEARCH_TEXT, part='id,snippet', maxResults=25).execute()

for item in response.get('items', []):
    if item['id']['kind'] != 'youtube#channel':
        continue
    print('*' * 10)
    print(json.dumps(item, indent=2, ensure_ascii=False))
    print('*' * 10)

↓結果はこんな感じ↓

**********
{
  "kind": "youtube#searchResult",
  "etag": "jjisWD5m1O7aBCLstjwy_ldRnf4",
  "id": {
    "kind": "youtube#channel",
    "channelId": "UCTmRAt3wuYY8W5z9j9va97Q"
  },
  "snippet": {
    "publishedAt": "2017-12-13T04:47:03Z",
    "channelId": "UCTmRAt3wuYY8W5z9j9va97Q",
    "title": "Yahoo!デベロッパーネットワーク",
    "description": "Yahoo! JAPAN Technology channel produced by Yahoo! JAPAN.",
    "thumbnails": {
      "default": {
        "url": "https://yt3.ggpht.com/-ZUW9jc79uzQ/AAAAAAAAAAI/AAAAAAAAAAA/LWM2XNvQPmI/s88-c-k-no-mo-rj-c0xffffff/photo.jpg"
      },
      "medium": {
        "url": "https://yt3.ggpht.com/-ZUW9jc79uzQ/AAAAAAAAAAI/AAAAAAAAAAA/LWM2XNvQPmI/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
      },
      "high": {
        "url": "https://yt3.ggpht.com/-ZUW9jc79uzQ/AAAAAAAAAAI/AAAAAAAAAAA/LWM2XNvQPmI/s800-c-k-no-mo-rj-c0xffffff/photo.jpg"
      }
    },
    "channelTitle": "Yahoo!デベロッパーネットワーク",
    "liveBroadcastContent": "none",
    "publishTime": "2017-12-13T04:47:03Z"
  }
}
**********

YouTube チャンネルの詳細情報を取得

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

from apiclient.discovery import build

API_KEY = '<取得した API キーを入力します>'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
CHANNEL_ID = '<取得したチャンネル ID>'

youtube = build(
    YOUTUBE_API_SERVICE_NAME,
    YOUTUBE_API_VERSION,
    developerKey=API_KEY
)

response = youtube.channels().list(
    part = 'snippet,statistics',
    id = CHANNEL_ID
    ).execute()

for item in response.get("items", []):
    if item["kind"] != "youtube#channel":
        continue
    print('*' * 10)
    print(json.dumps(item, indent=2, ensure_ascii=False))
    print('*' * 10)

↓結果はこんな感じ↓

**********
{
  "kind": "youtube#channel",
  "etag": "itHsa0qDp15obMLvkpN6HnFjF_M",
  "id": "UCTmRAt3wuYY8W5z9j9va97Q",
  "snippet": {
    "title": "Yahoo!デベロッパーネットワーク",
    "description": "Yahoo! JAPAN Technology channel produced by Yahoo! JAPAN.",
    "customUrl": "yahoodevelopernetworkjp",
    "publishedAt": "2017-12-13T04:47:03Z",
    "thumbnails": {
      "default": {
        "url": "https://yt3.ggpht.com/a/AATXAJzznTJCL9uFV63JvRtbeYwgzur7mwoqtPRQvg=s88-c-k-c0xffffffff-no-rj-mo",
        "width": 88,
        "height": 88
      },
      "medium": {
        "url": "https://yt3.ggpht.com/a/AATXAJzznTJCL9uFV63JvRtbeYwgzur7mwoqtPRQvg=s240-c-k-c0xffffffff-no-rj-mo",
        "width": 240,
        "height": 240
      },
      "high": {
        "url": "https://yt3.ggpht.com/a/AATXAJzznTJCL9uFV63JvRtbeYwgzur7mwoqtPRQvg=s800-c-k-c0xffffffff-no-rj-mo",
        "width": 800,
        "height": 800
      }
    },
    "localized": {
      "title": "Yahoo!デベロッパーネットワーク",
      "description": "Yahoo! JAPAN Technology channel produced by Yahoo! JAPAN."
    },
    "country": "JP"
  },
  "statistics": {
    "viewCount": "7471",
    "commentCount": "0",
    "subscriberCount": "157",
    "hiddenSubscriberCount": false,
    "videoCount": "12"
  }
}
**********

YouTube チャンネルが公開している動画の情報を取得

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

from apiclient.discovery import build

API_KEY = '<取得した API キーを入力します>'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
CHANNEL_ID = '<取得したチャンネル ID>'

youtube = build(
    YOUTUBE_API_SERVICE_NAME,
    YOUTUBE_API_VERSION,
    developerKey=API_KEY
)

response = youtube.search().list(
    part = "snippet",
    channelId = CHANNEL_ID,
    maxResults = 1,
    order = "date" #日付順にソート
    ).execute()

for item in response.get("items", []):
    if item["id"]["kind"] != "youtube#video":
        continue
    print('*' * 10)
    print(json.dumps(item, indent=2, ensure_ascii=False))
    print('*' * 10)

↓結果はこんな感じ↓

**********
{
  "kind": "youtube#searchResult",
  "etag": "CtC0g1Ocx7pK6H8Yhd3hGS5z3uY",
  "id": {
    "kind": "youtube#video",
    "videoId": "vd3YVCtW-LY"
  },
  "snippet": {
    "publishedAt": "2020-02-20T06:02:39Z",
    "channelId": "UCTmRAt3wuYY8W5z9j9va97Q",
    "title": "新しいHTML portal を利用した画面遷移設計 〜PayPayモールとYahoo!ニュースの事例を添えて〜 / Developers Summit 2020 14-A-2",
    "description": "Developers Summit 2020 でのセッションの動画です。 portal について説明しています。 登壇概要はこちら https://event.shoeisha.jp/devsumi/20200213/session/2384/...",
    "thumbnails": {
      "default": {
        "url": "https://i.ytimg.com/vi/vd3YVCtW-LY/default.jpg",
        "width": 120,
        "height": 90
      },
      "medium": {
        "url": "https://i.ytimg.com/vi/vd3YVCtW-LY/mqdefault.jpg",
        "width": 320,
        "height": 180
      },
      "high": {
        "url": "https://i.ytimg.com/vi/vd3YVCtW-LY/hqdefault.jpg",
        "width": 480,
        "height": 360
      }
    },
    "channelTitle": "Yahoo!デベロッパーネットワーク",
    "liveBroadcastContent": "none",
    "publishTime": "2020-02-20T06:02:39Z"
  }
}
**********

動画の詳細情報を取得

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

from apiclient.discovery import build

API_KEY = '<取得した API キーを入力します>'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
CHANNEL_ID = '<取得したチャンネル ID>'
VIDEO_ID_LIST = ['<取得した動画 ID>']

youtube = build(
    YOUTUBE_API_SERVICE_NAME,
    YOUTUBE_API_VERSION,
    developerKey=API_KEY
)

for video_id in VIDEO_ID_LIST:
    response = youtube.videos().list(
      part = 'snippet,statistics',
      id = video_id
      ).execute()

    for item in response.get("items", []):
        if item["kind"] != "youtube#video":
            continue
        print('*' * 10)
        print(json.dumps(item, indent=2, ensure_ascii=False))
        print('*' * 10)

↓結果はこんな感じ↓

**********
{
  "kind": "youtube#video",
  "etag": "Y5QH8Ur-9BQigbr4XHTRNldn7_I",
  "id": "vd3YVCtW-LY",
  "snippet": {
    "publishedAt": "2020-02-20T06:02:39Z",
    "channelId": "UCTmRAt3wuYY8W5z9j9va97Q",
    "title": "新しいHTML portal を利用した画面遷移設計 〜PayPayモールとYahoo!ニュースの事例を添えて〜 / Developers Summit 2020 14-A-2",
    "description": "Developers Summit 2020 でのセッションの動画です。\nportal について説明しています。\n\n登壇概要はこちら\nhttps://event.shoeisha.jp/devsumi/20200213/session/2384/\n\n資料はこちら\nhttps://www.slideshare.net/techblogyahoo/htmlportal-paypayyahoo-devsumi",
    "thumbnails": {
      "default": {
        "url": "https://i.ytimg.com/vi/vd3YVCtW-LY/default.jpg",
        "width": 120,
        "height": 90
      },
      "medium": {
        "url": "https://i.ytimg.com/vi/vd3YVCtW-LY/mqdefault.jpg",
        "width": 320,
        "height": 180
      },
      "high": {
        "url": "https://i.ytimg.com/vi/vd3YVCtW-LY/hqdefault.jpg",
        "width": 480,
        "height": 360
      }
    },
    "channelTitle": "Yahoo!デベロッパーネットワーク",
    "tags": [
      "devsumi",
      "devsumiA",
      "Portals"
    ],
    "categoryId": "28",
    "liveBroadcastContent": "none",
    "defaultLanguage": "ja",
    "localized": {
      "title": "新しいHTML portal を利用した画面遷移設計 〜PayPayモールとYahoo!ニュースの事例を添えて〜 / Developers Summit 2020 14-A-2",
      "description": "Developers Summit 2020 でのセッションの動画です。\nportal について説明しています。\n\n登壇概要はこちら\nhttps://event.shoeisha.jp/devsumi/20200213/session/2384/\n\n資料はこちら\nhttps://www.slideshare.net/techblogyahoo/htmlportal-paypayyahoo-devsumi"
    },
    "defaultAudioLanguage": "ja"
  },
  "statistics": {
    "viewCount": "74",
    "likeCount": "2",
    "dislikeCount": "0",
    "favoriteCount": "0",
    "commentCount": "0"
  }
}
**********

お知らせ

Webサイト・ツール・LP作成のご依頼は、

こちらからお問い合わせいただけます。お気軽にご相談ください。

さいごに

いかがだったでしょうか?
他にもコードサンプルで色々と公開されているので、そちらを見ながら是非試してみてください。
間違っているところなどありましたら、コメントくださいmm

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
115
Help us understand the problem. What are the problem?