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

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

# YouTube Data API とは
https://developers.google.com/youtube/v3/docs

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

# API キーを取得する
## Google Cloud Platform で プロジェクトを作成
[ここから](https://console.cloud.google.com/projectcreate?hl=ja) プロジェクトを作成します。

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

<img width="500" alt="プロジェクトの作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659561/2d636866-1087-23ff-e5ee-9d2079611a03.png">

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

[ここから](https://console.cloud.google.com/apis/library/youtube.googleapis.com?q=youtube&id=125bab65-cfb6-4f25-9826-4dcc309bc508&folder&hl=ja&organizationId)プロジェクトを選択した後、有効にします。

<img width="500" alt="APIを有効にする" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659561/e3e796d2-5e87-db41-2741-6c2c09433871.png">

## 認証情報の作成
[ここから](https://console.cloud.google.com/apis/api/youtube.googleapis.com/credentials?hl=ja)  API キーを作成します。

<img width="500" alt="API キーの作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659561/a816e952-561a-6a8d-4a97-9918508d1620.png">

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

# YouTube Data API でいろんな情報を取得してみる
## 必要なパッケージをインストール
pyenv を使用して python のバージョンを変えておきます。

```bash
$ pyenv install 3.8.3
$ pyenv local 3.8.3
```

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

```bash
$ pip install google-api-python-client==1.9.3
```
## YouTube チャンネル情報を検索
```python
#!/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 チャンネルの詳細情報を取得
```python
#!/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 チャンネルが公開している動画の情報を取得
```python
#!/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"
  }
}
**********
```

## 動画の詳細情報を取得
```python
#!/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作成のご依頼は、

https://iteek.jp/contact/

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

# さいごに
いかがだったでしょうか？
他にも[コードサンプル](https://developers.google.com/youtube/v3/code_samples/python?hl=ja)で色々と公開されているので、そちらを見ながら是非試してみてください。
間違っているところなどありましたら、コメントくださいmm