YouTube Data API使ってRailsでYoutubeチャンネル情報を取得してみた
この記事は CAMPFIRE Advent Calendar 2021 の参加記事です
こんにちは、CAMPFIRE Community事業部エンジニアのsleaflet(仮) です。
普段はCAMPFIREのコミュニケーションプラットフォームである CAMPFIRE Commutniyの開発をしています。
アドベントカレンダー参加もnote投稿も初です、よろしくお願いします。
これから何の話するの?
YouTube Data APIを利用してチャンネルの情報を取得したはなし
YouTube Data APIで他にどんなことがができるのか
はじめに
きっかけ
CAMPFIRE Commutniyについて、皆さんはご存知でしょうか?
メインのクラウドファンディングのサービスとは違い、月額課金ができるサービスで、オンラインコミュニティとしてややファンクラブとして、同好の士とのつながりの場など様々な用途で利用していただいてます。
開設されている「コミュニティ」には音楽活動や舞台活動などYoutubeなど動画サイトを利用しているものも多いです。
また、コミュニティは Youtubeチャンネルも開設していて、利用ガイドの動画やお悩み相談もできる生放送なども行われています。
ということでCAMPFIRE CommunityとしてもYoutubeは無関係でない!といった大義名分のもと、触れる機会のなかったYoutube APIを触れてみました。
前提
Youtubeの情報を取得するにはYoutube Data API利用します。
APIの通信はGoogleが提供しているgem、google-api-ruby-client を利用して行います
認証はAPIキーです (OAuth2.0 の認証は利用しません)
開発環境
Ruby3.0
Rails7.0.0
gemなど
google-apis-youtube_v3 (0.13.0)
slim (4.1.0)
Bootstrap 5.1.3
Youtube Data APIで指定のチャンネルの概要と動画を取得する
YouTube Data APIの登録 ~ 動画検索まで
まず最初に以下の設定やコードの作成を行います。
1. YouTube Data APIの登録
2. google-api-ruby-client の取得
3. APIキーの取得と設定
4. APIを利用(動画の検索)
詳細ははすでに先人が丁寧に解説してらっしゃるので割愛します
【Ruby on Rails】最もわかりやすいYouTube API 使い方
Youtube Data APIの公式のドキュメントと合わせてご覧ください。
チャンネルの動画の取得
動画や検索するにはlist_searchesメソッドします。
チャンネルを指定するために以下のオプションも指定します
channel_id にチャンネルIDを指定
https://www.youtube.com/channel/XXXXXXX の XXXXXXX の部分
type に video を指定
指定しないど動画の他にチャンネル自身の情報やプレイリストなども含まれます
参考: list_searchesのコード
# 例)
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = ENV['GOOGLE_CLIENT_API_KEY']
channel_id = 'XXXXXX'
@video_result = youtube.list_searches(:snippet, channel_id: channel_id, type: 'video', max_results: 30)
チャンネル情報取得
動画や検索するにはlist_channelsメソッドします。
チャンネルを指定するために以下のオプションも指定します
# 例)
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = ENV['GOOGLE_CLIENT_API_KEY']
channel_id = 'XXXXXX'
channel_result = youtube.list_channels(:snippet, id: channel_id)
id にチャンネルIDを指定
参考: list_channelsのコード
APIリクエスト数の壁
APIは無制限には呼び出せず、1日あたりや短時間あたりの頻度や量で制限がかかります。
申請で制限値を変更することもできるらしいのですが、テストや本番でもあまり頻繁に更新しすぎないように気をつける必要がありそうです。
参考: API リクエストの制限と割り当て
こんな形でキャッシュを利用して更新頻度を減らすようしました。
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = ENV['GOOGLE_CLIENT_API_KEY']
@video_result = Rails.cache.fetch('serch_result_list', expired_in: 12.hours) do
channel_id = 'XXXXXX'
youtube.list_searches(:snippet, channel_id: channel_id, type: 'video', max_results: 30)
end
表示
データが取得できればあとは表示です。viewを編集していきます。
ビデオ取得に利用した list_searches メソッドではGoogle::Apis::YoutubeV3::ListChannelsResponse クラスのインスタンスが返されます。
:snippetの指定をしているので itemsで
Google::Apis::YoutubeV3::SearchResultSnippet のリストが取得でき、
ここから動画の詳細を表示させるようにします
- @video_result.items.each do |search_result|
.col-sm-3.col-md-2.mb-2
.card
.ratio.ratio-16x9
img src="#{search_result.snippet.thumbnails.medium.url}"
.card-body
h6.card-title
a.text-black[href="https://www.youtube.com/watch?v=#{search_result.id.video_id}" target="_blank" style="text-decoration:none"] = search_result.snippet.title
p.card-text = search_result.snippet.description
p.card-text.text-muted.text-end = search_result.snippet.published_at.strftime('%Y%m月%d日 %H:%M:%S')
チャンネルも同様に表示させます。
list_channels メソッドは itemsにGoogle::Apis::YoutubeV3::Channelのリストが渡ってきます。
controller で適当に最初の1件だけ取得するようにして
@channel = channel_result.items.first
viewにもこんな感じで動画一覧の上に追加して表示
h1
img src="#{@channel.snippet.thumbnails.default.url}"
a.mx-2.text-black[href="https://www.youtube.com/channel/#{@channel.id}" target="_blank" style="text-decoration:none"]
= @channel.snippet.title
p
= simple_format @channel.snippet.description
できました!
他にどんなことがができるのか
と、今回は動画とチャンネルの検索のAPIだけですが、他にもたくさんできそうなことがありました。
Youtube Data API のドキュメント より
今回はチャンネルIDを調べて取得しましたが、認証(おそらくOAuthクライアントでの? )をしていれば自分のチャンネルののも取得できるようです
コメントの取得/追加/削除/返信
※ 自分のチャンネルに対してのみ可能、利用には申請が必要
などなどがありました。これだけでもかなりたくさんのことができそうです。
google-api-ruby-client
APIはかなりの量があることがわかりましたが、gemの方はどうでしょう?
メソッドが実装されているファイルを見てみましょう
アクティビティの取得 : list_activities
メンバーの取得: list_members
チャンネルバーナーの追加: insert_channel_banner
サムネイルの設定 :set_thumbnail
動画の削除: delete_video
取得に限らず、追加、削除、更新などAPIでできることをかなりカバーしてますね。
申請が必要であるメンバー一覧も用意してあるのが嬉しいですね。
まとめ
Google APIは種類も豊富でたくさん!
今回は簡単にAPIキーで認証しましたがメソッドやレスポンスを見るだけでもとても夢がひろがりますね。
OAuth2.0クライアントIDで認証できるとがっつり自分のチャンネルの詳細やメンバーなできることも増えて楽しそうです。
Rubyだと少し認証が難易度が高くなるようなのですが、ぜひチャレンジしたい。
みなさんも活用方法を模索してみてはいかがでしょうか?
この記事が気に入ったらサポートをしてみませんか?