MAGAZINE

ルーターマガジン

Ruby

RubyでYouTube Data API入門

2021.11.29
Pocket

RubyでYouTube Data API入門

こんにちは、アルバイトのarakiです.

最近急に寒くなりました.寒さや今の状況から,家に籠る時間が多いかもしれません.そういうとき頼りになるのが,YouTubeです.

そういうわけで,今回はRubyでYouTube Data APIを利用して情報を取ってくる方法を紹介します.

これを活用すれば,自分が気になっているチャンネルの情報を自動で収集したり,チャンネルを運営しているなら自分の動画の伸びを監視したりできます.

今回やること

YouTube Data APIは,その名の通りYouTubeの動画などの情報を取得したり,管理したりできるAPIです.利用登録すれば,制限付きですが動画情報を取得などを自動化できます.

Rubyでは,google-apis-youtube_v3というGemを使うことで簡単にAPIを扱えます.今回は,このGemを使いYouTubeのチャンネルや動画の情報を一通り取得していきます.

事前準備

まず,YouTube Data APIを有効化する必要があります.有効化手順は"YouTube APIキー"などで検索すると見つかるので,そちらをご参考頂ければと思います.

そして,google-apis-youtube_v3ジェムをgem installします.

gem install google-apis-youtube_v3

今回はバージョン0.13.0で実行しています(私はBundlerで入れたので,`bundle list`としています.`gem install`した場合は`gem list | grep youtube`で確認してください).

$ bundle list | grep youtube * google-apis-youtube_v3 (0.13.0)

サンプルコード

最初にサンプルコードを示します.

動かす際は,[チャンネルID][動画ID][配信動画ID]としているところに適切な値を入れてください. [チャンネルID]はhttps://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A のようなチャンネルページの最後の/以降, [動画ID][配信動画ID]はhttps://www.youtube.com/watch?v=jNQXAC9IVRw のような動画ページのv=以降です.

概要としては,YoutubeApiSampleクラスを定義し,このクラスを通じてYouTubeから特定のチャンネル,動画,動画検索結果,配信のチャットを取得しています.

require 'google/apis/youtube_v3' class YoutubeApiSample def initialize @service = Google::Apis::YoutubeV3::YouTubeService.new @service.key = ENV['YOUTUBE_API_KEY'] end def channel(id, req) opt = { id: id } sleep 1 @service.list_channels(req, **opt) end def video(id, req) opt = { id: id } sleep 1 @service.list_videos(req, **opt) end def video_list(query, req) opt = { q: query, order: 'date', # 日付順. max_results: 5, # 5件だけ取る. type: 'video' # 検索対象を動画に限定. } sleep 1 @service.list_searches(req, **opt) end def live_chat_list(id) live_detail = video(id, 'liveStreamingDetails').items.first.live_streaming_details chat_id = live_detail.active_live_chat_id sleep 1 results = @service.list_live_chat_messages(chat_id, 'snippet') end end youtube = YoutubeApiSample.new # チャンネル情報 channel_snippet = youtube.channel('[チャンネルID]', 'snippet').items.first.snippet channel_statistics = youtube.channel('[チャンネルID]', 'statistics').items.first.statistics puts "チャンネル名: #{channel_snippet.title}" puts "概要欄:" puts channel_snippet.description puts "登録者数: #{channel_statistics.subscriber_count}" puts "動画数: #{channel_statistics.video_count}" puts # 動画情報 video_snippet = youtube.video('[動画ID]', 'snippet').items.first.snippet video_statistics = youtube.video('[動画ID]', 'statistics').items.first.statistics puts "動画名: #{video_snippet.title}" puts "概要欄:" puts video_snippet.description puts "チャンネル: #{video_snippet.channel_title}" puts "公開日: #{video_snippet.published_at}" puts "視聴回数: #{video_statistics.view_count}" puts "いいね: #{video_statistics.like_count}" puts # 動画検索結果情報 video_list_snippet = youtube.video_list('Ruby言語', 'snippet') puts "「Ruby言語」での検索結果(日時順):" video_list_snippet.items.each { |i| puts " #{i.snippet.published_at} #{i.snippet.title}" } puts # 配信のチャット live_chat = youtube.live_chat_list('[配信動画ID]') puts "コメント欄:" live_chat.items[0, 5].each { |i| puts " #{i.snippet.display_message}" }

解説

initialize

def initialize @service = Google::Apis::YoutubeV3::YouTubeService.new @service.key = ENV['YOUTUBE_API_KEY'] end

Google::Apis::YoutubeV3::YouTubeServiceのインスタンスを@serviceとし,以降このAPIを通じてYouTubeの情報を取得していきます. APIを使うため,事前に取得したキーを渡しています.私は環境変数YOUTUBE_API_KEYに登録して使っていますが,自分の好みで運用してください.

channel

def channel(id, req) opt = { id: id } sleep 1 @service.list_channels(req, **opt) end

名前の通り,チャンネルの情報を取得するメソッドです.引数はそれぞれidは情報が欲しいチャンネルのID,reqは欲しい情報の種類です.

サンプルではidを基にoptハッシュを作成し,パラメータを@service.list_channelsに渡しています. opt内のパラメータは,情報を取得したいチャンネルを絞り込むのに使われます.

また,idの他にfor_usernamemineなどが指定できます. idhttps://www.youtube.com/channel/[id]のようなチャンネルページURLの末尾にあります. 動画からチャンネルページに遷移すると,このURLが取得できます.

YouTubeの検索欄からチャンネルページに入ると,たまにhttps://www.youtube.com/user/[username]という形式のURLが見つかるかもしれません(例: https://www.youtube.com/user/jawed).これは,チャンネルにユーザー名を設定する必要があったときの名残のようです.このusernameはfor_usernameで絞り込むときに使えます.for_usernameを使う場合は,optopt = { for_username: username }のように書き換えればOKです.ただ,ユーザー名が設定されていないチャンネルもあるので,すべてのチャンネルに設定されているidを使う方がおすすめです.

mineは,trueにすることで自分のチャンネルに絞り込むことができます.自分のチャンネルの登録者数などを自動通知したい場合には, これを使うのが便利かもしれません.ただし,個人情報に係るため,このパラメータを使うには別途手続きを踏む必要があるようです

reqにはidsnippetstatisticsなどが指定できます. idではチャンネルIDなどの最低限の情報が, snippetではチャンネル名や概要,サムネイルのURLなどが, statisticsでは登録者数などが取得できます.

その他可能な操作などについてはYouTube Data APIのリファレンスを参考にすると良いでしょう. チャンネルに関してはこちらに書かれています.

video

videoメソッドもchannelメソッド同様です.idhttps://www.youtube.com/watch?v=[id]のような動画URLの末尾にあります. 動画の場合,再生数や高評価数が取得できます.

video_list

def video_list(query, req) opt = { q: query, order: 'date', # 日付順. max_results: 5, # 5件だけ取る. type: 'video' # 検索対象を動画に限定. } sleep 1 @service.list_searches(req, **opt) end

queryで検索した結果を返すメソッドです.メソッドでは検索対象を動画に限定していますが, videoの他にchannelplaylistも指定できます. また,検索条件にchannel_idを与えて特定のチャンネルに限定することや,published_afterを与えて特定の日付以降に限定することもできます.

live_chat_list

def live_chat_list(id) live_detail = video(id, 'liveStreamingDetails').items.first.live_streaming_details chat_id = live_detail.active_live_chat_id sleep 1 results = @service.list_live_chat_messages(chat_id, 'snippet') end

配信のチャット欄を取得するメソッドです. 配信動画の情報は,videoとして取得できます. video(id, 'liveStreamingDetails')とすることで配信に関する情報を得,そこからチャット欄のIDを取得しています.ちなみに,video(id, 'liveStreamingDetails')からは配信の開始時刻や現在の視聴者数も取得できます.その後,results = @service.list_live_chat_messages(chat_id, 'snippet')でチャット欄IDを基にチャットの情報を取得しています.

注意点

YouTube Data APIは便利なツールですが,無制限に使えるわけではありません. APIを使うと割り当て(クォータ)を使用します. そのため,定期的に情報を収集するようなアプリを作成する場合, 割り当ての上限値を超えないように注意しなければなりません.

おわりに

YouTube Data APIには豊富な機能があり,すべての機能は紹介できませんでした. しかし,サンプルコードのスクリプトだけでも,非常に多くの情報が取得できています. YouTube Data APIの機能をより深く知りたい場合はこちらのレファレンスが, google-apis-youtube_v3ジェムのAPIを確認したい場合はこちらのレファレンスが参考になるでしょう.

チャンネル管理者の場合,今回紹介したように情報を取ってくるだけでなく,自分のコンテンツを削除したり追加したりするなどの操作もできるようなので,是非活用してください.

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから