YouTube Data API (v3) を Docker で動かしてみた

こんにちは。
Web・iOSアプリエンジニアの三浦です。

https://qiita.com/takayuki-miura0203/items/4fa4cdc9ef0c07a857a9
こちらでは puppeteer を Docker 上で動かしてみましたが、今回は YouTube Data API (v3) を動かしてみたいと思います。

なお、今回のコードはこちらにまとめてあります。
https://github.com/takayuki-miura0203/docker-youtubeApi-sample

# 準備
## 技術選定
YouTube Data API を動かすに当たり、 [様々な言語のライブラリ](https://developers.google.com/youtube/v3/libraries)が提供されているようですが、今回は業務で PHP を使うことが多いため、 PHP の Docker 環境を整えてみる意味も含め [PHP用のライブラリ](https://github.com/googleapis/google-api-php-client) で行くことにしました。

## YouTube Data API (v3) の有効化
YouTube Data API (v3) を使用するに当たり、 API を有効化する必要があります。
これには Google のアカウントが必要です。

1. [Google API のコンソール](https://console.developers.google.com/apis/)へ行く。
2. 左メニュー「ライブラリ」をクリックし、「YouTube Data API (v3)」を検索・クリックし、有効化する。
3. コンソールに戻り、左メニュー「認証情報」をクリック。「認証情報を作成」から「APIキー」を選択し、作成する。

# 実装してみる
では実際に作ってみましょう！

## Docker
まずは Dockerfile からです。
今回は、最低限 `composer install` でき、またコマンドラインから PHP を実行して YouTube Data API を叩けることを要件とし、以下のように作ってみました。

```dockerfile
# CLI だけなら apache は不要かもしれません
FROM php:7.3.4-apache

# composer install のために、 git や unzip が必要
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    vim

WORKDIR /app

# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
```

## docker-compose
こちらもあまり特殊なことはしません。
ディレクトリをマウントし、ホストから PHP ファイル等を編集できるようにするくらいです。

```yml
version: '3.7'

services:
  youtube:
    build: youtube
    image: youtube-image:1.0.0
    container_name: youtube-container
    init: true
    tty: true
    volumes:
      - /path/to/youtube/app:/app
    working_dir: /app
```

## PHP
今回は、「VTuber」で検索してチャンネル情報を取得し、それらの登録者数・動画総再生数を表示するコードを組んでみました。

```php
<?php

require_once('../vendor/autoload.php');

class YoutubeApi
{
    public function run()
    {
        $client = new Google_Client();
        $client->setApplicationName('Sample Application');
        // Note: ここは自分の API Key を入れてください
        $client->setDeveloperKey('xxxx');
    
        $youtube = new Google_Service_YouTube($client);
    
        // 検索結果を取得
        // channel で検索するときは、 order を view count にしても動画総再生順には並ばないようです
        $searchResponse = $youtube->search->listSearch(
            'snippet',
            [
                'q' => 'Vtuber',
                'type' => 'channel',
                'order' => 'viewCount',
                'maxResults' => 10,
                'regionCode' => 'JP'
            ]
        );

        foreach($searchResponse->items as $item) {
            // 取得したチャンネルIDをもとに、チャンネルの詳細情報を取得
            $channelsResponse = $youtube->channels->listChannels(
                'statistics',
                ['id' => $item->snippet->channelId]
            );

            echo('channel title   : ' . $item->snippet->channelTitle);
            echo("\n");
            echo('subscriber count: ' . $channelsResponse->items[0]->statistics->subscriberCount);
            echo("\n");
            echo('view count      : ' . $channelsResponse->items[0]->statistics->viewCount);
            echo("\n");
            echo("----\n\n");
        }
    }
}

$youtubeApi = new YoutubeApi();
$youtubeApi->run();
```

## 実行！
それでは実行してみます！
まずはコンテナを実行します。

```bash
# image をビルドして…
docker-compose build --no-cache

# コンテナを実行し、そのままコンテナ内に入ります。
docker-compose run --rm --entrypoint /bin/bash youtube
```

コンテナに入ったら…

```bash
# composer install して…
composer install

# PHP ファイルを実行します
cd src
php youtubeApi.php
```

## 結果
2019/05/01 09:30 頃の実行結果は、以下のようになりました。

```
channel title   : Siro Channel
subscriber count: 625202
view count      : 79972749
----

channel title   : Mirai Akari Project
subscriber count: 746014
view count      : 54467514
----

channel title   : Kaguya Luna Official
subscriber count: 954807
view count      : 84966355
----

channel title   : ひなたチャンネル (Hinata Channel)
subscriber count: 503727
view count      : 30622902
----

channel title   : バーチャル番組チャンネル
subscriber count: 237756
view count      : 14332002
----

channel title   : Choco Ch. 癒月ちょこ
subscriber count: 100606
view count      : 9217195
----

channel title   : YuNi - virtual singer -
subscriber count: 274216
view count      : 44797187
----

channel title   : アキロゼCh。Vtuber/ホロライブ所属
subscriber count: 27301
view count      : 1136670
----

channel title   : 佃煮のりおちゃんねる【犬山たまき】
subscriber count: 126962
view count      : 7979312
----

channel title   : ケリン
subscriber count: 152154
view count      : 10973355
----
```

無事取得できました！
ただチャンネルに関しては、特に view count 順に並んでいるわけではなさそうですね。

# さいごに
というわけで、やろうとしたことがかなり少なかったこともあり、結構シンプルに環境を整えることができました。
ここから更にいろいろやろうと思ったら、 Dockerfile にて更にエクステンション等を入れていけば良さそうです。

ここまで読んでいただきありがとうございました！

# 参考文献
以下のサイトを参考にさせていただきました。
ありがとうございました！

- [Dockerの開発環境構築 (Mac + Docker + PHP + Apache)](https://qiita.com/Ryooota/items/65ff0c32a5d93f225d7a)
- [docker-composeでPHP7+composer+MySQL環境の構築](https://qiita.com/uni-3/items/4edc9875f0449cab7421)
- [Docker の php:apache に、Composer を使えるようにする Dockerfile を作る](https://oki2a24.com/2018/10/12/make-php-apache-dockerfile-to-use-composer/)
- [PHPでYoutubeAPIを使ってみる](http://challenge.no1s.biz/programming/php/381)
- [API Reference  |  YouTube Data API (v3)  |  Google Developers](https://developers.google.com/youtube/v3/docs/)