質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.83%

Youtube Data APIを利用してチャンネルのライブ配信状況を取得する方法

解決済

回答 1

投稿

  • 評価
  • クリップ 14
  • VIEW 1,890

gmimp

score 8

Youtube Data APIを利用して、「複数のチャンネルのライブ配信状況をチェックし、ライブ配信中だった場合は処理をする」という動作を実装しようと思い、ネット上の記事を参考に下記のコードを書きました

その結果、処理を実装することはできたのですが、YouTube Data APIにはクォータの制限があり、現状その消費量が馬鹿にならないので、もっと無駄を省けないかと思い質問致しました


以下は現在のコードです

define('YOUTUBE_API_KEY', '###'); // APIキー
function json_get($url, $query = array(), $assoc = false) { 
    if ($query) $url .= ('?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986));
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); 
    $responseString = curl_exec($curl);
    curl_close($curl);
    return ($responseString !== false) ? json_decode($responseString, $assoc) : false;
}
function h($value, $encoding = 'UTF-8') {
    return htmlspecialchars($value, ENT_QUOTES, $encoding); 
} 
function eh($value, $encoding = 'UTF-8'){
    echo h($value, $encoding); 
} 
foreach($streamers as $streamer){ //streamers配列には複数の動画配信者の情報(チャンネルID等)が含まれる
    $response = json_get('https://www.googleapis.com/youtube/v3/search', array(
        'key' => YOUTUBE_API_KEY,
        'channelId' => $streamer['channelID'], 
        'part' => 'snippet', 
        'eventType' => 'live', 
        'type' => 'video', 
    ), true);
    if($response["items"]!=null){ //ライブ中かどうかの判定(配列の内"item"の中身が空かどうかで判断)
        //ライブ中だった場合の処理
    }
}

Youtube Data APIから受け取る情報の内、必要なものは「ライブ配信中かどうか」という情報だけであり、それ以外については利用しておりません

もしコードの中に無駄な記述等があればご教授いただけると嬉しいです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+7

「『チャンネルを指定し、そのチャンネル内に紐付けられた動画のうち、ライブ状態の動画を抽出する』ことを、Youtube data APIを使用して行う」という仕様において、あなたが書かれたコード「の中に」は、クォータ消費に関して無駄な部分はありません。

searchは、1回のリクエストでクォータを最低100消費します。あなたが書いたコードも「無駄なく」100消費します。

クォータ消費量については、https://developers.google.com/youtube/v3/determine_quota_cost?hl=ja を参照してください。

searchを使う限り、消費クォータ量は減らせません。

問いの本質は、「指定したチャンネル内の動画からライブ状態の動画を抽出する際に、もっとクォータ消費を少なくするやり方はないか?」ということだと理解しました。

消費クォータ量を少なくするためには、考え方を変える必要があります。

Youtube DATA APIでは、チャンネルから条件に合致した動画一覧を取得する場合(search)は1回あたりクォータを100消費しますが、
特定の動画IDのライブ状態を調べる場合、1回あたり約2.67しか消費しません。

したがって、

  1. APIを使用せずにチャンネルから動画IDのリストを取得し、
  2. 取得した動画IDのライブ状態をAPIを使って調べれば、

大幅にクォータ消費を減らせます。

  1. APIを使用せずにチャンネルから動画一覧を取得する方法
    方法として、YouTubeチャンネルのRSSフィード内容をパースするやり方があります。
    (ただし、YouTubeの不具合その他の要因により、フィードへの反映が遅れる場合があります)
    具体的なコードはここでは書きませんが、「php xml フィード youtube」で検索すればすぐコード例は出てきます。

  2. 取得した動画IDのライブ状態をAPIを使って調べる方法

1.で取得した動画IDのライブ状態を調べる関数の例を下記に記しました。

引数$video_idは、11文字のYouTube動画IDです。
戻り値は文字列で、
'live'⇒ライブ配信中、'upcoming'⇒配信予約、'none'⇒アーカイブ済み、'error'⇒動画IDまたはAPIキーが誤っている
ことを示します。

/* below sample code © 2020 taizan-hokuto */
//戻り値:'live'⇒ライブ配信中、'upcoming'⇒配信予約、'none'⇒アーカイブ済み、'error'⇒動画IDまたはAPIキーが誤っている"
    function get_livestatus($video_id){
        $response = json_get('https://www.googleapis.com/youtube/v3/videos', array(
            'key' => YOUTUBE_API_KEY,
            'id' => $video_id,
            'part'=>'snippet',
            'fields'=>'items(id,snippet(liveBroadcastContent))'
        ), true);
        if($response["items"]==null){
            return 'error';
        }
        return  $response["items"][0]["snippet"]["liveBroadcastContent"];
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/07 14:29

    私の稚拙な文章から質問の本質を導き出し、さらに的確な回答まで提示して下さって本当にありがとうございます...
    こんな方法・考え方があったのかと勉強になりました
    おかげさまで抱えていた問題も解消することができました!
    本当にありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る