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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

10248閲覧

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

gmimp

総合スコア8

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

2グッド

15クリップ

投稿2020/04/06 00:24

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

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

yuntan, GenbuHase👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「『チャンネルを指定し、そのチャンネル内に紐付けられた動画のうち、ライブ状態の動画を抽出する』ことを、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」で検索すればすぐコード例は出てきます。

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

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

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

PHP

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

投稿2020/04/06 14:25

編集2020/04/06 14:27
patapi

総合スコア687

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gmimp

2020/04/07 05:29

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問