【PHP】特定YouTubeチャンネル内のすべての動画情報取得するサンプルコード


アイキャッチ画像
この記事は以前Qiitaに書いたやつを再編したものです。

ネットに殆ど書いてなかったので特定のチャンネル内の動画の情報を取得してみました。

Twitterで@randomhikakinっていう某HikakinTVのキャプチャ画像を投稿するシステム作ったときにデータベースが要ったのでやってみますた。
@randomhikakinのソースコード:https://github.com/tomox0115/randomhikakin

実装概要

StackOverflowをちょっと参考にして書きました。
API制限のせいでリクエストを投げても一度に50件しか取得できないので一定期間ごとに何度もリクエストを送って取得してみました。
以下のような情報が取得できます。

  • タイトル/ID/概要欄
  • サムネイル
  • 投稿日時

※APIの呼び出し制限とかもあるんで無闇矢鱈に試すのはやめたがいいかもしれません。

ちなみに今回はHikakinTVの動画2800本くらいを取得してみました。
JSONファイルはGitHubにアップしてます。

APIキーが必要なので適宜取得してください。ネットに沢山情報はあると思います。

サンプルコード

一応サンプルはGistにも上げてます。

<?php
/*
@author:tomox0115
日時関連でエラーが出た場合は↓みたいにデフォルトタームゾーンを指定してあげてください。
date_default_timezone_set("America/Los_Angeles");
*/

//YouTube API v3
$API_KEY = "***************************************";

// ユーザー名からチャンネルIDを取得(ID分かってるならスキップOK)
function get_user_channel_id($user)
{
    global $API_KEY;
    $url = 'https://www.googleapis.com/youtube/v3/channels?key=' . $API_KEY . '&part=id&forUsername=';
    return search($user, $url)['items'][0]['id'];
}

// 
function search($searchTerm, $url)
{
    $url = $url . urlencode($searchTerm);

    $result = file_get_contents($url);

    if ($result !== false) {
        return json_decode($result, true);
    }

    return false;
}

function push_data($searchResults)
{
    global $data;
    foreach ($searchResults['items'] as $item) {
        $data[] = $item;
    }
    return $data;
}

function get_url_for_time_period($channelId, $time)
{
    global $API_KEY;
    // 日時型指定
    $publishedAfter = date("Y-m-d\TH:i:sP", strval($time));
    // 期間を60日指定
    $publishedBefore_ = $time + (60 * 60 * 24 * 60);
    $publishedBefore = date("Y-m-d\TH:i:sP", $publishedBefore_);
    // リクエスト用URL作成
    $url = 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&key=' . $API_KEY . '&maxResults=50&channelId=' . $channelId . '&publishedAfter=' . urlencode($publishedAfter) . '&publishedBefore=' . urlencode($publishedBefore);

    return array("url" => $url, "utc" => $publishedBefore_);
}


$start_date = "YYYY-MM-DD"; // 日時指定
$time = strtotime($start_date);
$username = "*****";

$channelId = get_user_channel_id($username);

while ($time < time()) {
    $url = get_url_for_time_period($channelId, $time);
    $searchResults = search("", $url['url']);
    $data = push_data($searchResults);
    $time += 60 * 60 * 24 * 60; // 60日追加
}

// 帰ってきたデータを表示するなら…
echo "<pre>";
var_dump($data);
echo "</pre>";

// 配列をJSON形式にして保存するなら…
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
file_put_contents($username . ".json", $json);

// 動画数を出力するなら…
print count($data);

取得できる動画情報

帰ってきた動画情報は連想配列として$dataに格納されるのでJSONなりに出力して見るといいと思います。
以下がJSONの例です。
最初の動画情報のみ掲載。以降永遠に続く…

[

{

"kind": "youtube#searchResult",

"etag": "cRtdkU1jXJ6Abga3q5S490FrsP0",

"id": {

"kind": "youtube#video",

"videoId": "0t8CH5BAgLY"

},

"snippet": {

"publishedAt": "2011-07-20T15:19:55Z",

"channelId": "UCZf__ehlCEBPop-_sldpBUQ",

"title": "世界一おいしい飲み物『ピルクル』 - The World Best Juice『Pirukuru』 -",

"description": "ピルクルに勝る飲み物なし。",

"thumbnails": {

"default": {

"url": "https://i.ytimg.com/vi/0t8CH5BAgLY/default.jpg",

"width": 120,

"height": 90

},

"medium": {

"url": "https://i.ytimg.com/vi/0t8CH5BAgLY/mqdefault.jpg",

"width": 320,

"height": 180

},

"high": {

"url": "https://i.ytimg.com/vi/0t8CH5BAgLY/hqdefault.jpg",

"width": 480,

"height": 360

}

},

"channelTitle": "HikakinTV",

"liveBroadcastContent": "none",

"publishTime": "2011-07-20T15:19:55Z"

}

},

市井

著者 市井
オタク総研 媒体統括。専門領域はアニメ、テクノロジー(ガジェット)、プログラミング、コンテンツビジネス