MAGAZINE
ルーターマガジン
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_username
やmine
などが指定できます.
id
はhttps://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
を使う場合は,opt
をopt = { for_username: username }
のように書き換えればOKです.ただ,ユーザー名が設定されていないチャンネルもあるので,すべてのチャンネルに設定されているid
を使う方がおすすめです.
mine
は,true
にすることで自分のチャンネルに絞り込むことができます.自分のチャンネルの登録者数などを自動通知したい場合には,
これを使うのが便利かもしれません.ただし,個人情報に係るため,このパラメータを使うには別途手続きを踏む必要があるようです.
req
にはid
,snippet
,statistics
などが指定できます.
id
ではチャンネルIDなどの最低限の情報が,
snippet
ではチャンネル名や概要,サムネイルのURLなどが,
statistics
では登録者数などが取得できます.
その他可能な操作などについてはYouTube Data APIのリファレンスを参考にすると良いでしょう. チャンネルに関してはこちらに書かれています.
video
video
メソッドもchannel
メソッド同様です.id
はhttps://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
の他にchannel
とplaylist
も指定できます.
また,検索条件に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を確認したい場合はこちらのレファレンスが参考になるでしょう.
チャンネル管理者の場合,今回紹介したように情報を取ってくるだけでなく,自分のコンテンツを削除したり追加したりするなどの操作もできるようなので,是非活用してください.
CONTACT
お問い合わせ・ご依頼はこちらから