プログラミング初心者の勉強ブログ #110
YouTube Data APIをRailsで使う場合、どのようにデータを取得できるかを確認してみた。このようなAPIを使って、何かサービスのアイデアのきっかけにでもなればと思ったからである。とりあえず基本的なリクエストの送り方と、得られる情報含め、感想を書こうと思う。
目次
[toc]
YouTube Data API
Google Developersの中の1つに、この「YouTube Data API」が存在する。Oauth用のAPIとかと同じで、Googleが提供するAPIの一つとして提供されている。
このAPIを使って得られるレスポンス、つまりYouTubeさんのDBから参照できるデータについて軽くまとめてみる。
API Reference | YouTube Data API (v3) | Google Developers
基本的に上記のリファレンスをもとに色々試したことを書いていく。具体的な例があった方がわかりやすいので、今回はみんな大好き「東海オンエア」からYouTube Data APIでできることを見ていこうと思う。
前提として
「YouTube Data API」は簡単に言えば、「YouTubeさんのDBを元に、指定したデータを参照できる、または、指定したアクションを実行してくれるサービス」である。Railsでの具体的な実装方法は後として、
- gem「google/api_client」のインストール
- YouTubeAPIのAPIキー取得
この二つを行うことで生成できる「client」インスタンスのメソッドを使うことからAPIの利用が始まる。今回は「指定したデータを参照」する方面のみ書いている。「指定したアクションを実行してくれる」については、またいつかやってみたいと思う。
リファレンス抜粋
// APIキーの代入 DEVELOPER_KEY = ENV['YOUTUBE_API_KEY'] client = Google::APIClient.new( :key => DEVELOPER_KEY, :authorization => nil, :application_name => $PROGRAM_NAME, :application_version => '1.0.0' )
このclientインスタンスによって、「youtube」インスタンスが生成できる。
リファレンス抜粋
DEVELOPER_KEY = ENV['YOUTUBE_API_KEY'] // youtubeインスタンス生成に必要な設定用の値(サービス名とバージョン)を代入 YOUTUBE_API_SERVICE_NAME = 'youtube' YOUTUBE_API_VERSION = 'v3' client = Google::APIClient.new( :key => DEVELOPER_KEY, :authorization => nil, :application_name => $PROGRAM_NAME, :application_version => '1.0.0' ) // clientインスタンスからyoutubeインスタンスを生成 youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)
このyoutubeインスタンスが、実際にYouTubeさんのDBとの通信を行うことができるメソッドを持っている。この流れがこのAPIの基礎である。clientから生成されたyoutubeインスタンスの様々なメソッドを使っていくことで、色々なデータを取得ができる。
東海オンエアから学ぶYouTube Data API
リファレンスをみると色々載っているが、実際に興味あるデータで考えた場合、YouTubeさんのDBから取得できるデータで主役となるのはチャンネル情報(channelsメソッド)と動画情報(videosメソッド)かなと思うので、そこをメインにまとめていく。また、キーワードや属性によってチャンネルや動画を探す、検索(searchメソッド)もあるので、これもまとめる。とりあえず題材は全て「東海オンエア」である。(厳密には東海オンエアからは学んでいない。)
search
searchについては、
Ruby コード サンプル | YouTube Data API (v3) | Google Developers
リファレンスにRubyで書いてあるので、こっちみた方が確かな情報である。
メインのコードは
リファレンス抜粋
// 検索に関する基本設定 opts = Trollop::options do opt :q, 'Search term', :type => String, :default => '東海オンエア' opt :max_results, 'Max results', :type => :int, :default => 3 end // clientとyoutubeを使い検索結果をsearch_responseに格納する search_response = client.execute!( :api_method => youtube.search.list, :parameters => { :part => 'snippet', :q => opts[:q], :maxResults => opts[:max_results] } )
これである。
※opts[:q]やopts[:max_results]は、
opts = Trollop::options do opt :q, 'Search term', :type => String, :default => '東海オンエア' opt :max_results, 'Max results', :type => :int, :default => 3 end
ここで設定したものであり、「Trollop」とは、gem「trollop」のインストールにより利用できるオブジェクトとなる。このgemも「google-api-client」と同じく予めインストールする。
細かくみていく。まず、
:api_method => youtube.search.list
ここではapi_methodを何にするかを書き込んでいる。youtubeインスタンスに対し、「search」というメソッドを当てている。更につながる「list」というのは、
これはリファレンスのスクショだが、listはchannelsのメソッドの1つであり、「リクエスト条件に一致するゼロ個以上の channel リソースを返します。」とある。要は、検索結果は複数あるけど、それをリスト(Rubyの配列)のデータ型で返しますよ、というメソッドとなる。
次に
:parameters => { :part => 'snippet', :q => opts[:q], :maxResults => opts[:max_results] }
ここだが、これはレスポンスのデータの設定になる。下二つはoptsに関してであり、先ほとのコードを見ればなんとなくわかるが、気になるのはpartの行。
:part => 'snippet'
partに対し、snippetを設定している。最初見たときは意味わからなかった。リファレンスを見ると、
こう書いてあるが、正直これを見てもピンとこなかった。 そこで、改めてレスポンスのデータの構造を確認してみる。
これは、レスポンスで帰ってくるchannelリソースのJSONの構造体だ。こんな感じハッシュ名と入れ子構造でchannelデータは形成されているということか。見覚えのある単語がある。「snippet」だ。partパラメータの説明には「contentDetails」もあったが、どうやらこれを指定するのがpartパラメータの役割らしい。確かにこの構造体全て含めた長ったるいデータのやりとりはしたくない。
仕組みは何となく確認できたので、実際にリクエストを送ってみる。
// 検索に関する基本設定 opts = Trollop::options do opt :q, 'Search term', :type => String, :default => '東海オンエア' opt :max_results, 'Max results', :type => :int, :default => 3 end // clientとyoutubeを使い検索結果をsearch_responseに格納する search_response = client.execute!( :api_method => youtube.search.list, :parameters => { :part => 'snippet', :q => opts[:q], :maxResults => opts[:max_results] } )
今回はデフォルトの検索ワードに「東海オンエア」を入れ、レスポンスは3つにした。 partもタイトルや概要コメントがわかるsnippetのまま検索する。
まずはsearch_responseをそのまま表示してみる。
ちゃんと東海オンエアの情報がかえってきている。チャンネル名とは別に、一意に識別するためのchannelIDを確認。JSON形式の東海オンエアは面白くない。やっぱりYouTubeで見るべきだと再確認。
もう少しキレイに表示するには、
search_response.data.items
のようにすると、検索ヒットしたデータのみを配列で取り出せる。
今回は3つ取得だったのでこれらが上位3ヒットだったのかなと、[0]がチャンネル情報、[1]と[2]はどちらも最近投稿された動画情報だ。list形式の東海オンエアの動画も、このように面白くない。
Channels
ここからはおまけです。先ほど取得した検索結果より、東海オンエアのchannelIdとvideoIdがわかったので、それぞれ直接リクエストしてみます。
response = client.execute!( :api_method => youtube.channels.list, //channelに変更 :parameters => { :part => 'statistics', // チャンネル登録者数や投稿動画数、総再生数などの統計情報がわかるpart :id => 'UCutJqz56653xV2wwSvut_hQ', // 東海オンエアのチャンネルID :maxResults => opts[:max_results] } )
少し変えるだけです。 youtube.channels.listとすることでリクエストします。
結果、
東海オンエアのこの時点でのチャンネル登録者数は、約435万人だということがわかります。総再生数も約37億再生です。ブログやってみると、この数字がやばい規模感であることをより認識できます。
videos
これもchannelとほとんど同じです。
response = client.execute!( :api_method => youtube.videos.list, // videoに変える :parameters => { :part => 'snippet', :id => 'peCHhp9rZSk', // 動画ID :maxResults => opts[:max_results] } )
最後に、snippetから取得できる東海オンエアの概要欄のコメントを表示させてみます。
スマホだと読みづらいかもしれません。てか気になる方は動画見た後概要欄読みましょう。
まとめ
楽しい勉強でした。何かしらの形で、このYouTube APIを使ったものを作りたいと思ってます。一つだけアイデアが浮かんだので、とりあえずそれは作成しようと思ってます。興味のあることから勉強することで、きっと自分が活躍できる仕事にたどり着けるんだろうなと思ってます。ポジティブな発言もたまには加えてみます。
以上ありがとうございました。