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を指定

  • 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) 

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 のドキュメント より

などなどがありました。これだけでもかなりたくさんのことができそうです。

google-api-ruby-client

APIはかなりの量があることがわかりましたが、gemの方はどうでしょう?
メソッドが実装されているファイルを見てみましょう

取得に限らず、追加、削除、更新などAPIでできることをかなりカバーしてますね。
申請が必要であるメンバー一覧も用意してあるのが嬉しいですね。

まとめ

Google APIは種類も豊富でたくさん!

今回は簡単にAPIキーで認証しましたがメソッドやレスポンスを見るだけでもとても夢がひろがりますね。
OAuth2.0クライアントIDで認証できるとがっつり自分のチャンネルの詳細やメンバーなできることも増えて楽しそうです。
Rubyだと少し認証が難易度が高くなるようなのですが、ぜひチャレンジしたい。
みなさんも活用方法を模索してみてはいかがでしょうか?


この記事が気に入ったらサポートをしてみませんか?