amazon

[PHP] YouTube の動画データ取得

はじめに

「不労所得を私に」を実現するため、Web サービスを開発しようと思い立ちました。
今回は YouTube のデータを用いたサービスを検討しているため YouTube のデータ取得について解説します。

要望

  • 動画情報を取得できる
    • タイトル
    • 説明文
    • チャンネル名
  • 急上昇を取得できる

方針

スクレイピングで取得する

この方法は Youtube 利用規約[1] 「許可と制限事項」 の 3 に違反します。実行はやめましょう。公式の API が提供されているのそちらで取得するのが安全です。
例示として記述します。

Goutte[2] を使用して取得します。サンプルコードを以下に示します。

use Goutte;

// 日本の急上昇ページURL
$youtubePath = 'https://www.youtube.com/feed/trending?persist_gl=1&gl=JP';
$client = new Goutte\Client();
$crawler = $client->request('GET', $youtubePath);
$crawler->each(function ($node) {
    // 動画情報を取り出す処理
}  

公式 API の存在を知らなくて、少しこの方式で試していましたが、動画情報が javascript で制御され、目的の情報を取得するのに手間取りました。
javascript の変数に json 形式で保持しているので該当情報だけ取り出すことがまず一苦労ですし、そのデータ構造を理解するのにもまたひと手間かかります。

コンプライアンス的にも工数的にも公式 API を使用すべきです。

公式 API を用いる

公式 API として Youtube Data api v3[3] が提供されています。この API は Web サイトで通常実行する機能を提供しています。

GCP で API を有効化する

この API は GCP[4] が提供していので事前に利用登録が必要です。GCP で利用登録が済んでいるとして以降は記載します。

API ライブラリ で YouTube Data API v3 を探します。
YouTube Data API の検索
図1 YouTube Data API の検索
YouTube Data API v3
図2 YouTube Data API v3
API キーの発行
キーの発行
図3 キーの発行

ここで発行したキーで API を操作します。

実際に API リクエストを手軽に試せる仕組みがリファレンス[5] に用意されているので試してみます。日本の急上昇データを取得してみます。以下の情報を入力して「EXCUTE」ボタンを押します。

  • part: snippet
  • chart: mostPopular
  • regionCode: JP

ログイン認証を求められるので、自身のアカウントで認証してください。サイトでの取得結果を図4、同日の YouTube の急上昇画面を図5に示します。

2022/09/10 のAPI 取得例
図4 2022/09/10 のAPI 取得例
2022/09/10 急上昇画面
図5 2022/09/10 急上昇画面

画面と同じ情報が取得できました。

サンプルコード

公式のライブラリ[6]が提供されているのでこれを用いて実装していきます。

use Google_Client;
use Google_Service_YouTube;

$YOUTUBE_KEY = // your api key
$videos = [];
$client = new Google_Client();
$client->setDeveloperKey(env('YOUTUBE_KEY'));
$youtube = new Google_Service_YouTube($client);
$part = ['snippet'];
$params = [
'chart' => 'mostPopular',
 'maxResults' => 1,
 'regionCode' => 'JP',];
$results = $youtube->videos->listVideos($part, $params);
foreach ($results['items'] as $result) {
    $videos[result['id']] = result['snippet']['title'];
}
echo $videos

これで YouTube データを自由に取得できるようになりました。

参考

[1] 利用規約, https://www.youtube.com/static?template=terms&hl=ja&gl=JP
[2] FriendsOfPHP/Goutte, https://github.com/FriendsOfPHP/Goutte
[3] API Reference, https://developers.google.com/youtube/v3/docs?hl=ja
[4] Google Cloud, https://cloud.google.com/
[5] 実際に試してみる, https://developers.google.com/youtube/v3/docs/videos/list#%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
[6]  googleapis/google-api-php-client, https://github.com/googleapis/google-api-php-client

コメント

タイトルとURLをコピーしました

Fatal error: Uncaught JSMin_UnterminatedRegExpException: JSMin: Unterminated RegExp at byte 329: /^https?:\/\ in /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php:266 Stack trace: #0 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(152): JSMin->action() #1 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(86): JSMin->min() #2 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/ao-minify-html.php(257): JSMin::minify() #3 [internal function]: AO_Minify_HTML->_removeScriptCB() #4 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/ao-minify-html.php(108): preg_replace_callback() #5 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/ao-minify-html.php(47): AO_Minify_HTML->process() #6 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/autoptimizeHTML.php(105): AO_Minify_HTML::minify() #7 /bitnami/wordpress/wp-content/plugins/autoptimize/classes/autoptimizeMain.php(592): in /bitnami/wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php on line 266