Railsでyoutube APIを使ってみた

#はじめに
あまりにもわからなかったので、出来たことをまとめてみました。

参考↓
[さかな前線(YouTube Data API V3とgoogle-api-ruby-client gemでYouTube動画検索)](https://daily.belltail.jp/?p=2330)
[Class: Google::Apis::YoutubeV3::YouTubeService-github](https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/YoutubeV3/YouTubeService)
[YouTube Data API (v3)
](https://developers.google.com/youtube/registering_an_application?hl=ja)

#プロジェクトを作成（YouTube Data API v3を使う）
以下のサイトの通りにやれば、いいです。↓
[YouTube Data API (v3)
](https://developers.google.com/youtube/registering_an_application?hl=ja)

#まず、Rubyで試してみる
このサイトを真似してます。↓
[さかな前線(YouTube Data API V3とgoogle-api-ruby-client gemでYouTube動画検索)](https://daily.belltail.jp/?p=2330)

手元のRuby環境にGemをインストールします。

```
$ gem install google-api-client -v 0.9.20
```
```rb:ruby.rb
require 'google/apis/youtube_v3'
require 'active_support/all'

GOOGLE_API_KEY="<API_KEY>" #上記で作成したキー

def find_videos(keyword, after: 1.months.ago, before: Time.now) #検索キーワードと検索範囲を変えれるように引数に値を取っています
  service = Google::Apis::YoutubeV3::YouTubeService.new
  service.key = GOOGLE_API_KEY
  next_page_token = nil
  opt = {
    q: keyword,
    type: 'video',
    max_results: 2,
    order: :date,
    page_token: next_page_token,
    published_after: after.iso8601,
    published_before: before.iso8601
  }
  results = service.list_searches(:snippet, opt)
  results.items.each do |item|
    id = item.id
    snippet = item.snippet
    puts "\"#{snippet.title}\" by #{snippet.channel_title} (id: #{id.video_id}) (#{snippet.published_at})"
  end
end

find_videos('明日香ちゃんねる')
```
出力結果↓

```
"私は盛大に騙されました。" by 明日香ちゃんねる (id: ViYzZFSTMoM) (2019-07-31T14:19:27+00:00)
"【明日香VS現役東大生】東大生のスキを突いてゴールを狙う！！！" by 明日香ちゃんねる (id: -HzWQzHNvPs) (2019-07-30T08:58:45+00:00)
```
ちゃんと２件とれました。

###list_searches
`list_searches`メソッドは以下のサイトに説明が載っています。
`list_searches`メソッド以外にも`list_channels`とか様々なメソッドがあるみたいです。↓（optについてもここを参考）
[Class: Google::Apis::YoutubeV3::YouTubeService-github](https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/YoutubeV3/YouTubeService)

###iso8601
`published_after`はRFC 3339形式の日時の値を入れる必要があるみたいです。
`to_datetime.rfc3339`か`iso8601`メソッドで変換します。
参考↓
[RubyでTimeクラスオブジェクトをRFC3339に変換する](https://codeday.me/jp/qa/20190422/669916.html)
[RubyのTime型のオブジェクトをiso8601形式の文字列に変換する](https://codeday.me/jp/qa/20190422/669916.html)

試してみた↓

```rb:ruby1.rb
require 'date'
require 'time'

puts Time.now
puts Time.now.to_datetime.rfc3339
puts Time.now.iso8601
```
出力結果↓

```
2019-08-01 12:42:33 +0900
2019-08-01T12:42:33+09:00
2019-08-01T12:42:33+09:00
```

###YouTube Data API v3のQueriesについて（無料枠）
一日当たり、10,000Queriesでそれ以上超えると通信が出来なくなりエラーになってしまいます。
なので、一回のリクエストで５０件も取ってしまうとすぐ10,000Queries超えてエラーになりますので注意！！
ダッシュボードから確認出来ます。
参考↓
[【メモ】Youtube API Data (v3)のクオータについて-Qiita](https://qiita.com/lnial/items/52834612e79fe69a8c5f)


#Ruby on Railsで試してみる
gemのバージョンによってrequire: 'google/apis/youtube_v3'が読み取れないようなので、
固定してます。何回もエラーが出て苦しめられたので...

```rb:gemfile
gem 'google-api-client', '0.9.20', require: 'google/apis/youtube_v3'
```

youtubeコントローラーを作ってユーチュブからデータを取得するfind_videosとビューに表示するindexに分けています。

```rb:youtube_controller.rb
class YoutubeController < ApplicationController
  GOOGLE_API_KEY = Rails.application.credentials.google[:api_key]

  def find_videos(keyword, after: 1.months.ago, before: Time.now)
    service = Google::Apis::YoutubeV3::YouTubeService.new
    service.key = GOOGLE_API_KEY

    next_page_token = nil
    opt = {
      q: keyword,
      type: 'video',
      max_results: 3,
      order: :date,
      page_token: next_page_token,
      published_after: after.iso8601,
      published_before: before.iso8601
    }
    service.list_searches(:snippet, opt)
  end

  def index
    @youtube_data = find_videos('明日香ちゃんねる')
  end
end
```

```erb:views/youtube/index.html.erb

<% @youtube_data.items.each do |item| %>
  <% snippet = item.snippet %>
  <p><%= snippet.title %></p>
  <p><%= snippet.published_at %><%= snippet.channel_title %></p>
  <div><iframe width="560" height="315" src="https://www.youtube.com/embed/<%= item.id.video_id %>" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<% end %>

```
iframeのyoutubeのurlに取得した`video_id`を入れてます。
キーワードにマッチする動画３件を取得できました。
完成しサイトです↓
![sample_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348610/2501198c-fc6d-ac40-0b4c-7078aea5c686.png)

#最後に
他のgemで`yt`というのを見つけたのでリンクを貼っておきます。こっちのほうがわかりやすそう😅
[yt-gem](https://github.com/Fullscreen/yt)
[Yt · The reliable YouTube API Ruby client
](https://fullscreen.github.io/yt/index.html)