PHPでYoutubeAPIを利用して、特定チャンネルの動画から高評価数と低評価数などを取得してみた

目次

・やったこと、結果
・利用したもの、なぜ試したか
・準備すること、実装コード(後にそれぞれ説明)、注意すること

やったこと、結果

・YoutubeAPIを使用
① 特定のチャンネルの動画一覧からキーワードを指定してキーワードに一致する動画一覧を取得
② ①で取得した動画一覧の各動画詳細を取得
・取得した値 → 「投稿日,タイトル,高評価数,低評価数,サムネイル」

実行結果↓

3件
投稿日: 2021-08-18
タイトル: しずる池田とフルーツポンチ村上のアーバンブルーラジオ「池田のマネージャーはアーバンブルーラジオをよく思ってない?」の回
リンク: https://www.youtube.com/watch?v=EpVk_gzJ1vQ
高評価: 330
低評価: 330
サムネイル: https://i.ytimg.com/vi/EpVk_gzJ1vQ/default.jpg

投稿日: 2021-08-11
タイトル: しずる池田とフルーツポンチ村上のアーバンブルーラジオ「心は沖縄」の回
リンク: https://www.youtube.com/watch?v=5ix_CRJirHs
高評価: 462
低評価: 463
サムネイル: https://i.ytimg.com/vi/5ix_CRJirHs/default.jpg

投稿日: 2021-08-04
タイトル: しずる池田とフルーツポンチ村上のアーバンブルーラジオ「ヒザ神はスポーツ観戦がお好き」の回
リンク: https://www.youtube.com/watch?v=yJf0xZrF_oU
高評価: 450
低評価: 450
サムネイル: https://i.ytimg.com/vi/yJf0xZrF_oU/default.jpg

利用したもの

・YoutubeAPI
・phpdotenv

なぜ

さらば青春の光」というyoutubeチャンネル内で放送される「アーバンブルーラジオ」。
その動画内で高評価と低評価の数を合わせるというのが流行っているらしいので、それぞれの動画を見に行くことなく、高評価と低評価の数を取得してみたかった。

ファイル構造

.
├── README.md
├── composer.json
├── composer.lock
├── index.php
└── vendor/

準備

1.APIキー作成
2.google/apiclient パッケージの追加

composer require google/apiclient

3.vlucas/phpdotenv ライブラリの追加

composer require vlucas/phpdotenv

実装コード

index.php

<?php
require_once (dirname(__FILE__) . '/vendor/autoload.php');

class YoutubeApi
{
    private $youtube_api_key;
    public  $youtube;

    public function __construct()
    {
        $this->youtube = new Google_Service_YouTube($this->getClient());
    }

    public function getClient()
    {
        $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
        $dotenv->load();
        $this->youtube_api_key = $_ENV["YOUTUBE_API_KEY"];
        
        $client = new Google_Client();
        $client->setApplicationName("youtubeTestApp");
        $client->setDeveloperKey($this->youtube_api_key);
        return $client;
    }

    public function getVideoIdsByQuery()
    {
        $part = [
        ];
        $params = [
            'channelId' => 'UCNvcNd31bA-XERO6LGy4blw',
            'maxResults' => 3,
            'order' => 'date',
            'q' => 'アーバンブルー'
        ];
        $search_results = $this->youtube->search->listSearch($part, $params);
        $videoids = [];
        foreach($search_results as $val){
          $videoids[] = $val['id']['videoId'];
        }
  
        return $videoids;
    }

    public function getVideos($videoIds)
    {
        $part = [
            'snippet',
            'statistics'
        ];
        $params = [
            'id' => $videoIds
        ];
        $search_results = $this->youtube->videos->listVideos($part, $params);
        return $search_results;
    }

}

$youtube_api = new YoutubeApi();

$videoIds = $youtube_api->getVideoIdsByQuery();
$videosArr = $youtube_api->getVideos($videoIds);

echo count($videosArr).'件'.PHP_EOL;
foreach($videosArr as $video){
  echo '投稿日: '.date('Y-m-d',  strtotime($video['snippet']['publishedAt']));  
  echo PHP_EOL;
  echo 'タイトル: '.$video['snippet']['title'];
  echo PHP_EOL;
  echo 'リンク: '. 'https://www.youtube.com/watch?v='.$video['id'];
  echo PHP_EOL;
  echo '高評価: '.$video['statistics']['likeCount'];
  echo PHP_EOL;
  echo '低評価: '.$video['statistics']['dislikeCount'];
  echo PHP_EOL;
  echo 'サムネイル: '.$video['snippet']['thumbnails']['default']['url'];
  echo PHP_EOL.PHP_EOL;
}

各説明

● dotenvの使い方

private $youtube_api_key;
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
//.envで定義したものを取得している
$this->youtube_api_key = $_ENV["YOUTUBE_API_KEY"];

● 特定のYoutubeチャンネルからvideoのidを取得(後に動画詳細を取得するため)
1. channelIdを指定 → channel/{ここがchannelIdになる} https://www.youtube.com/channel/UCNvcNd31bA-XERO6LGy4blw
2. q パラメータで検索クエリを指定 →「アーバンブルー」
3. 取得順番を最新順 →「'order' => 'date'」
4. 3件取得(試しなので)「'maxResults' => 3」

public function getVideoIdsByQuery()
    {
        $part = [
        ];
        $params = [
            'channelId' => 'UCNvcNd31bA-XERO6LGy4blw',
            'maxResults' => 3,
            'order' => 'date',
            'q' => 'アーバンブルー'
        ];
        $search_results = $this->youtube->search->listSearch($part, $params);
        $videoids = [];
        foreach($search_results as $val){
          $videoids[] = $val['id']['videoId'];
        }
  
        return $videoids;
    }
$videoIds = $youtube_api->getVideoIdsByQuery();

● 取得したvideoのidを使用し、高評価数、低評価数を取得する
1.高評価数、低評価数を取得するために、「statistics」を指定

public function getVideos($videoIds)
{
    $part = [
        'snippet',
        'statistics'
    ];
    $params = [
        'id' => $videoIds
    ];
    $search_results = $this->youtube->videos->listVideos($part, $params);
    return $search_results;
}
$videosArr = $youtube_api->getVideos($videoIds);

注意すること

1.APIキーは機密情報なので隠しましょう(そのために今回はdotenvを使用しました。gitにあげる際は.gitignoreも使用する)

これからどうしたいか

TwitterAPIを利用して、今回取得した内容をツイートするBot的なのを作りたい。
・ざっと必要になりそうなもの。(バッチ処理、動かすサーバ、TwitterAPIなど)

参考

https://developers.google.com/youtube/v3/docs/videos?hl=ja
https://developers.google.com/youtube/v3/docs/search/list?hl=ja
PHPとYouTube Data API で急上昇ランクを取ってみる | GMOアドパートナーズグループ TECH BLOG byGMO
phpdotenvについて。 - Qiita