YouTube APIを用いてYouTube上にある動画を取得してみた
はじめに
エビリーのプロダクト開発本部でバックエンドエンジニアをしている遠藤と申します。
今回は、YouTube APIを用いた動画情報の取得方法に関してお話ししていきます。
こちらの取得方法は弊社のプロダクトである『kamui tracker』で活用されているアプローチの1つになります。
kamui trackerについて
『kamui tracker』は国内最大級のYouTubeデータ分析ツールであり、以下のようなYouTubeの関する様々なデータを保持しております。
- 動画の視聴回数
- 動画のコメントデータ
- 動画のキーワード
『kamui tracker』という製品自体に興味がありましたら、こちらをご覧になってみて下さい。
背景
『kamui tracker』では、Youtubeの動画・チャンネル・コメントなど様々な情報を取得しています。
勿論、これらの情報はYouTubeから取得しています。
今回、急上昇動画を取得したいと考え、急上昇動画のAPIを検証してみました。
手法
前提条件
今回取得する動画情報はYouTubeの急上昇動画を以下の方針の元、実装する事になりました。
YouTubeのvideoIDが不正です- 「最新」、「音楽」、「ゲーム」の3つのカテゴリーごとに取得する事
- 各カテゴリーの急上昇動画はランキング順で取得されている事
- 取得するデータは「動画(id)」、「チャンネル(channel_id)」、「視聴回数(view_count)」、「カテゴリー(category)」を取得
- 取得する動画は国内(日本)の動画である事
早速APIの実装といきたい所ですが、まずは使用するAPIを確認しましょう。
API全体を使用して1つの動画情報の全体をとる事は可能ですが、それですとその後の取得情報の整理に手間がかかります。
また、何よりAPIは上限があるため不必要にAPIを消費するのはあまり得策ではありません。
ではどうすればいいのか。実はYouTubeには擬似的にAPIを確認する方法があります。
YouTube Data API
こちらのサイトはgoogleアカウントを持っているユーザなら誰しも、YouTube Data APIの確認を行えます。それでは、これを元に使用するAPIが最適か確認していきます。
- まずは下記のリファレンスにアクセスします。
そして、画面左にあるサイドバーより対象の項目を選択します。今回は「急上昇動画」であるため「動画(videos)」を選択します。
- 動画(videos)は急上昇の動画リストを取得するためリスト(list)を指定します。(
videos:list
に移動)
-
今回は動画情報は「動画(id)」、「チャンネル(channel_id)」、「視聴回数(view_count)」を取得します。これらはそれぞれ
part
のid
,snippet
,statistics
の要素から取得できるため指定します。 -
急上昇の動画リストは
chart
をmostPopular
(急上昇動画の一覧)に指定します。また、取得する動画数をmax_results
、投稿動画の地域をregion_code
、そしてカテゴリー(category)をvideo_category_id
で決定し、取得する動画情報の範囲も設定します。
- 実行すると下記のようなAPIが表示され、取得する動画情報の範囲を絞った動画情報が取得できている事を確認できます(
max_results
=1,region_code
=jp,video_category_id
=20[ゲーム]に指定)
{
"kind": "youtube#videoListResponse",
"etag": "9zugTjB_3vAA89RPtIjnZVmPCk8",
"items": [
{
"kind": "youtube#video",
"etag": "P-fNVXsUc0RzXp9v6RqumUR7dtU",
// 半角英数字の文字列
"id": {動画ID},
"snippet": {
// Date型
"publishedAt": {投稿日},
// 接頭に「UC」+半角英数字の文字列
"channelId": {チャンネルID},
"title": {動画タイトル},
"description": {動画概要欄},
"thumbnails": {
"default": {
"url": {サムネイル画像のURL},
"width": 120,
"height": 90
},
"medium": {
"url": {サムネイル画像のURL},
"width": 320,
"height": 180
},
"high": {
"url": {サムネイル画像のURL},
"width": 480,
"height": 360
},
"standard": {
"url": {サムネイル画像のURL},
"width": 640,
"height": 480
},
"maxres": {
"url": {サムネイル画像のURL},
"width": 1280,
"height": 720
}
},
"channelTitle": {チャンネル名},
"tags": [
{関連キーワード_1},
{関連キーワード_2},
...
],
"categoryId": "24",
"liveBroadcastContent": "none",
"localized": {
"title": {動画タイトル},
"description": {動画概要欄},
}
},
"statistics": {
"viewCount": "867358",
"likeCount": "11087",
"favoriteCount": "0",
"commentCount": "608"
}
}
],
"nextPageToken": "CAEQAA",
"pageInfo": {
"totalResults": 112,
"resultsPerPage": 1
}
}
- 改めて必要なAPIの情報を整理すると以下の形式に設定できます。では、確認ができたのでこれらを参考に実際にAPIを実装します。
key | value |
---|---|
part | id, snippet,statistics |
chart | mostPopular |
max_results | {必要数} |
region_code | jp |
video_category_id | 0(最新),10(音楽),20(ゲーム) |
実装
それではいよいよ実装です。全体をまとめると以下のようになります。
require 'google/apis/youtube_v3'
class UpspinVideoListController < ApplicationController
def main
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = '{使用するAPI Keyを指定}'
# 各カテゴリー(最新、音楽、ゲーム)ごとの空配列を用意する
# 配列の中身は1動画辺り、「順位」、「動画ID」、「チャンネル名」、「動画カテゴリー」の順番でランキング順に並ぶ
latest_video_ranking = nil
music_video_ranking = nil
game_video_ranking = nil
# 各カテゴリーごとの必要なAPIを取得しランキング処理を行う
video_category_ids.each do |video_category_id|
api_response_items = upspin_videos_by_category(youtube,video_category_id)
upspin_videos = parsed_upspin_videos(api_response_items, video_category_id)
# 各カテゴリーごとの配列を分類し、対象の配列に格納する
if upspin_videos[0][4] == 0 then
latest_video_ranking = upspin_videos
elsif upspin_videos[0][4] == 10
music_video_ranking = upspin_videos
elsif upspin_videos[0][4] == 20
game_video_ranking = upspin_videos
end
end
# 各カテゴリー結果の配列をランキング形式で表示
puts latest_video_ranking
puts music_video_ranking
puts game_video_ranking
end
def video_category_ids
# 0:カテゴリー「最新」
# 10:カテゴリー「音楽」
# 20:カテゴリー「ゲーム」
[0,10,20]
end
# 急上昇動画の各カテゴリーに該当する動画一覧を取得
def upspin_videos_by_category(youtube,video_category_id)
youtube.list_videos("id,snippet,statistics",
chart: 'mostPopular',
max_results: 3,
region_code: 'jp',
video_category_id: video_category_id)
end
# 取得したAPIから必要な情報を取得し、その後カテゴリー名及びランキング付けを行う
def parsed_upspin_videos(api_response_items, video_category_id)
parsed_upspin_videos = []
# ランキングはAPIで取得した順番と一致する
api_response_items.items.each.with_index(1) do |item, rank|
parsed_upspin_videos.push([rank.to_i,
item.id,
item.snippet.channel_id,
item.statistics.view_count,
video_category_id])
end
parsed_upspin_videos
end
end
それでは、1つ1つ説明していきます。
require 'google/apis/youtube_v3'
まず、初めにYouTube Data APIを使用するためのライブラリを呼び出します。このライブラリは下記のようにgemfileを参照してgoogle-api-clientのインストールが必要です。
def main
# 処理1
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = '{使用するAPI Keyを指定}'
# 処理2
# 各カテゴリー(最新、音楽、ゲーム)ごとの空配列を用意する
# 配列の中身は1動画辺り、「順位」、「動画ID」、「チャンネル名」、「動画カテゴリー」の順番でランキング順に並ぶ
latest_video_ranking = nil
music_video_ranking = nil
game_video_ranking = nil
# 処理3
# 各カテゴリーごとの必要なAPIを取得しランキング処理を行う
video_category_ids.each do |video_category_id|
# 処理4
api_response_items = upspin_videos_by_category(youtube,video_category_id)
# 処理5
upspin_videos = parsed_upspin_videos(api_response_items, video_category_id)
# 処理6
# 各カテゴリーごとの配列を分類し、対象の配列に格納する
if upspin_videos[0][4] == 0 then
latest_video_ranking = upspin_videos
elsif upspin_videos[0][4] == 10
music_video_ranking = upspin_videos
elsif upspin_videos[0][4] == 20
game_video_ranking = upspin_videos
end
end
# 処理7
# 各カテゴリー結果の配列をランキング形式で表示
puts latest_video_ranking
puts music_video_ranking
puts game_video_ranking
end
main
メソッドでは大まかに以下の処理を行います。
- 使用するAPI keyを指定し、YouTube Data APIのサービスを設定
- 各カテゴリー(最新、音楽、ゲーム)ごとの空配列を用意
-
video_category_ids
メソッド内のカテゴリー名をブロックする - 3のブロック内でまず
upspin_videos_by_category
メソッドよりAPIを取得する - 4から取得したAPIを
parsed_upspin_videos
メソッドよりAPIから必要な情報の抽出し、その後ランキング処理を行い配列化する - 5で生成した配列をカテゴリーごとに分類し、2で作成した空配列に格納する
- 各カテゴリーの配列結果を表示する(表示は1動画辺り、「順位」、「動画ID」、「チャンネル名」、「動画カテゴリー」をランキング順に並べる)
# 急上昇動画の各カテゴリーに該当する動画一覧を取得
def upspin_videos_by_category(youtube,video_category_id)
youtube.list_videos("id,snippet,statistics",
chart: 'mostPopular',
max_results: 3,
region_code: 'jp',
video_category_id: video_category_id)
end
upspin_videos_by_category
メソッドでは主に以下の2つの処理でAPIを設定し、取得します。
-
id
,snippet
,statistics
より1つの動画に取得する情報(part
)を設定 -
chart
,region_code
,video_category_id
,max_results
よりどの「チャート」、「地域」、「カテゴリー」そして「取得数」を設定
# 取得したAPIから必要な情報を取得し、その後カテゴリー名及びランキング付けを行う
def parsed_upspin_videos(api_response_items, video_category_id)
parsed_upspin_videos = []
# ランキングはAPIで取得した順番と一致する
api_response_items.items.each.with_index(1) do |item, rank|
parsed_upspin_videos.push([rank.to_i,
item.id,
item.snippet.channel_id,
item.statistics.view_count,
video_category_id])
end
parsed_upspin_videos
end
また、parsed_upspin_videos
メソッドでは以下の処理を行い、その後配列として格納します。
- 取得したAPIから必要な動画の情報(
id
,channel_id
,view_count
)を取得 - 取得した動画情報のカテゴリー名を紐付ける
- 取得した順を先頭にランキング付けを行う
結果
結果は以下のように、各カテゴリーの動画がランキング順に取得できている事が分かります。
- 急上昇の「最新」動画
[[1, {video_id_1}, {channel_id_1}, 957383, 0],
[2, {video_id_2}, {channel_id_2}, 14962216, 0],
[3, {video_id_3}, {channel_id_3}, 659683, 0]]
- 急上昇の「音楽」動画
[[1,{video_id_1}, {channel_id_1}, 26747174, 10],
[2, {video_id_2}, {channel_id_2}, 1400990, 10],
[3, {video_id_3}, {channel_id_3}, 3912710, 10]]
- 急上昇の「ゲーム」動画
[[1, {video_id_1}, {channel_id_1}, 957383, 20],
[2, {video_id_2}, {channel_id_2}, 362775, 20],
[3, {video_id_3}, {channel_id_3}, 233332, 20]]
まとめ
今回の実装に伴ってYouTube Data APIの幅広い理解に繋がりました。弊社はユーザーの価値になるプロダクトへと成長させるために、プロダクト開発チームが日々挑戦を繰り返しております。これを機に弊社や『kamui tracker』に興味を持って頂けましたら、ぜひご連絡してみて下さい。
▼一緒に働いてみたい!という方はこちら
▼『kamui tracker』を利用してみたい!という方はこちら
Discussion