Ruby で YouTube Data API (v3) を使う


Google の [YouTube Data API (v3)](https://developers.google.com/youtube/v3/getting-started?hl=ja) をRubyから使ってみました。

APIのアクセスにはGoogleの[google-api-ruby-client](https://github.com/google/google-api-ruby-client)を使いました。 google-api-ruby-clientのバージョンは0.9.15を使いました。

google-api-ruby-clientが0.9からAPI仕様が変更になったので、以前のコードが動かなくなったので、サンプルコードを探す場合は注意してください。

# google-api-clientをインストール

```
gem install google-api-client
```

# 認証情報を用意する。
「[RubyでYouTube Data APIを利用したときのメモ](http://qiita.com/eielh/items/22352b7891bd65db857a)」を参考にOAuthの認証用のjsonを作成して、カレントディレクトリのclient_secret.jsonに保存してください。

# videoの統計情報を取得
videoのidを指定して、videoの統計情報を取得する例です。

```ruby
require 'googleauth'
require 'googleauth/stores/file_token_store'
require 'google/apis/youtube_v3'

OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
APPLICATION_NAME = 'idolsongplaylist'
CLIENT_SECRETS_PATH = 'client_secret.json'
CREDENTIALS_PATH = File.join(Dir.home, '.credentials', "tokens.yaml")
SCOPE = [ "https://www.googleapis.com/auth/youtube" ]

def authorize
  FileUtils.mkdir_p(File.dirname(CREDENTIALS_PATH))

  client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
  token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)
  authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
  user_id = 'default'
  credentials = authorizer.get_credentials(user_id)
  if credentials.nil?
    url = authorizer.get_authorization_url(base_url: OOB_URI)
    puts 'Open the following URL in the browser and enter the ' +
         'resulting code after authorization'
    puts url
    code = gets
    credentials = authorizer.get_and_store_credentials_from_code(
      user_id: user_id, code: code, base_url: OOB_URI)
  end
  credentials
end

YT = Google::Apis::YoutubeV3
youtube = YT::YouTubeService.new
youtube.client_options.application_name = APPLICATION_NAME
youtube.authorization = authorize

options = {
  :id => 'xftKTwxb5oE'
}

response = youtube.list_videos("statistics", options)
pp response
```

最初の実行時に、OAuthのURLがブラウザでアクセスしてtokenを入手して、コンソールに入力します。tokenはファイルに保存します。

実行結果

```
$ ruby youtube.rb 
#<Google::Apis::YoutubeV3::ListVideosResponse:0x00000002a16830
 @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/UgLSmvYEE1Uf_wWAE2v8aEtIzGo\"",
 @items=
  [#<Google::Apis::YoutubeV3::Video:0x00000002a14b70
    @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/b2sFHVQhw1hpCcYfRa2TtA0Ef94\"",
    @id="xftKTwxb5oE",
    @kind="youtube#video",
    @statistics=
     #<Google::Apis::YoutubeV3::VideoStatistics:0x00000002a19648
      @comment_count="0",
      @dislike_count="0",
      @favorite_count="0",
      @like_count="0",
      @view_count="14">>],
 @kind="youtube#videoListResponse",
 @page_info=
  #<Google::Apis::YoutubeV3::PageInfo:0x00000002a1ea80
   @results_per_page=1,
   @total_results=1>>
```

view_countで再生回数が取得できています。

# 再生リストの概要を取得

上記のコードから変更した部分のみです。

```ruby
optinons = {
  :id => 'PL0FtIyL-iyaOO_hxe07XsH4DKYiAJS_AP'
}
response = youtube.list_playlists("snippet", optinons)
pp response 
```

実行結果

```
$ ruby playlist.rb
#<Google::Apis::YoutubeV3::ListPlaylistResponse:0x000000032ecae0
 @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/wQGgUcbPqkYP06aXjsi0EyjUwTQ\"",
 @items=
  [#<Google::Apis::YoutubeV3::Playlist:0x000000032f23f0
    @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/4mg4-WLMwCQBTCAkrzW7f2jvlNk\"",
    @id="PL0FtIyL-iyaOO_hxe07XsH4DKYiAJS_AP",
    @kind="youtube#playlist",
    @snippet=
     #<Google::Apis::YoutubeV3::PlaylistSnippet:0x000000032f05f0
      @channel_id="UCIW5K2iQsZn6dz0yLNlT1Nw",
      @channel_title="eggmansan",
      @description=
       "2016年に公開されたアイドルの曲の動画を集めてみました。\n\nレギュレーション（なるべく）\n・公式の動画\n ・１曲単位の動画",
      @localized=
       #<Google::Apis::YoutubeV3::PlaylistLocalization:0x000000032f6a40
        @description=
         "2016年に公開されたアイドルの曲の動画を集めてみました。\n\nレギュレーション（なるべく）\n・公式の動画\n・１曲単位の動画",
        @title="アイドルの曲2016">,
      @published_at=
       #<DateTime: 2016-09-18T12:28:19+00:00 ((2457650j,44899s,0n),+0s,2299161j)>,
      @thumbnails=
       #<Google::Apis::YoutubeV3::ThumbnailDetails:0x000000032f9358
        @default=
         #<Google::Apis::YoutubeV3::Thumbnail:0x000000032f87c8
          @height=90,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/default.jpg",
          @width=120>,
        @high=
         #<Google::Apis::YoutubeV3::Thumbnail:0x000000032ff140
          @height=360,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/hqdefault.jpg",
          @width=480>,
        @maxres=
         #<Google::Apis::YoutubeV3::Thumbnail:0x000000032fdb88
          @height=720,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/maxresdefault.jpg",
          @width=1280>,
        @medium=
         #<Google::Apis::YoutubeV3::Thumbnail:0x000000032fc5d0
          @height=180,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/mqdefault.jpg",
          @width=320>,
        @standard=
         #<Google::Apis::YoutubeV3::Thumbnail:0x00000003302fc0
          @height=480,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/sddefault.jpg",
          @width=640>>,
      @title="アイドルの曲2016">>],
 @kind="youtube#playlistListResponse",
 @page_info=
  #<Google::Apis::YoutubeV3::PageInfo:0x00000003300b58
   @results_per_page=5,
   @total_results=1>>
```

# 再生リストのアイテムを取得

上記のコードから変更した部分のみです。

```ruby
optinons = {
  :playlist_id => 'PL0FtIyL-iyaOO_hxe07XsH4DKYiAJS_AP',
  :max_results => 2
}
response = youtube.list_playlist_items("snippet", optinons)
pp response 
```

実行結果

```
$ ruby playlist.rb
#<Google::Apis::YoutubeV3::ListPlaylistItemsResponse:0x0000000350d1a8
 @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/Ut4NhrCJxTetxWrI6D0nilNL6lY\"",
 @items=
  [#<Google::Apis::YoutubeV3::PlaylistItem:0x00000003511ac8
    @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/wIUGE87XjC983shu9wpKdjunJ9E\"",
    @id="UEwwRnRJeUwtaXlhT09faHhlMDdYc0g0REtZaUFKU19BUC45ODY0RDA1N0ZBMkE1M0E1",
    @kind="youtube#playlistItem",
    @snippet=
     #<Google::Apis::YoutubeV3::PlaylistItemSnippet:0x00000003510218
      @channel_id="UCIW5K2iQsZn6dz0yLNlT1Nw",
      @channel_title="eggmansan",
      @description="このビデオの情報サハ゛ーイ夏MV",
      @playlist_id="PL0FtIyL-iyaOO_hxe07XsH4DKYiAJS_AP",
      @position=0,
      @published_at=
       #<DateTime: 2016-09-25T00:32:05+00:00 ((2457657j,1925s,0n),+0s,2299161j)>,
      @resource_id=
       #<Google::Apis::YoutubeV3::ResourceId:0x00000003519d68
        @kind="youtube#video",
        @video_id="PS1jTwuXI0Y">,
      @thumbnails=
       #<Google::Apis::YoutubeV3::ThumbnailDetails:0x000000035186c0
        @default=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000351fad8
          @height=90,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/default.jpg",
          @width=120>,
        @high=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000351e4d0
          @height=360,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/hqdefault.jpg",
          @width=480>,
        @maxres=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000351cf18
          @height=720,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/maxresdefault.jpg",
          @width=1280>,
        @medium=
         #<Google::Apis::YoutubeV3::Thumbnail:0x000000035238e0
          @height=180,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/mqdefault.jpg",
          @width=320>,
        @standard=
         #<Google::Apis::YoutubeV3::Thumbnail:0x00000003522328
          @height=480,
          @url="https://i.ytimg.com/vi/PS1jTwuXI0Y/sddefault.jpg",
          @width=640>>,
      @title="????夏!!!BANG!BANG!BANG!!!">>,
   #<Google::Apis::YoutubeV3::PlaylistItem:0x00000003520730
    @etag="\"I_8xdZu766_FSaexEaDXTIfEWc0/oUHNLvMf4PX8UqpCBcJ0iU5d_LQ\"",
    @id="UEwwRnRJeUwtaXlhT09faHhlMDdYc0g0REtZaUFKU19BUC43OEFDM0Q4REIzREZBNEY4",
    @kind="youtube#playlistItem",
    @snippet=
     #<Google::Apis::YoutubeV3::PlaylistItemSnippet:0x00000003526ea0
      @channel_id="UCIW5K2iQsZn6dz0yLNlT1Nw",
      @channel_title="eggmansan",
      @description=
       "動画の説明 長いので省略",
      @playlist_id="PL0FtIyL-iyaOO_hxe07XsH4DKYiAJS_AP",
      @position=1,
      @published_at=
       #<DateTime: 2016-09-24T02:46:35+00:00 ((2457656j,9995s,0n),+0s,2299161j)>,
      @resource_id=
       #<Google::Apis::YoutubeV3::ResourceId:0x000000035246f0
        @kind="youtube#video",
        @video_id="YAOK5wEpAX8">,
      @thumbnails=
       #<Google::Apis::YoutubeV3::ThumbnailDetails:0x0000000352aff0
        @default=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000352a500
          @height=90,
          @url="https://i.ytimg.com/vi/YAOK5wEpAX8/default.jpg",
          @width=120>,
        @high=
         #<Google::Apis::YoutubeV3::Thumbnail:0x00000003528f48
          @height=360,
          @url="https://i.ytimg.com/vi/YAOK5wEpAX8/hqdefault.jpg",
          @width=480>,
        @maxres=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000352f910
          @height=720,
          @url="https://i.ytimg.com/vi/YAOK5wEpAX8/maxresdefault.jpg",
          @width=1280>,
        @medium=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000352e358
          @height=180,
          @url="https://i.ytimg.com/vi/YAOK5wEpAX8/mqdefault.jpg",
          @width=320>,
        @standard=
         #<Google::Apis::YoutubeV3::Thumbnail:0x0000000352cda0
          @height=480,
          @url="https://i.ytimg.com/vi/YAOK5wEpAX8/sddefault.jpg",
          @width=640>>,
      @title="CHERRSEE 「白いシャツ」 Music Video Dance ver.">>],
 @kind="youtube#playlistItemListResponse",
 @next_page_token="CAIQAA",
 @page_info=
  #<Google::Apis::YoutubeV3::PageInfo:0x00000003532728
   @results_per_page=2,
   @total_results=1320>>```
```

# 参考
参考にしたコード

* https://github.com/dddaisuke/google-apis/blob/master/calendar_v3/calendar.rb

あとで追記
google-api-ruby-clientのリポジトリにもサンプルがあった
* https://github.com/google/google-api-ruby-client/blob/master/samples/cli/lib/samples/you_tube.rb

参考にしたページ

* [GOOGLEの各種APIをRUBYから操作する方法](http://blog.daisukeyamashita.com/post/2462.html)
* [google-api-ruby-clientが非互換なアップデートされた](http://rcmdnk.github.io/blog/2016/01/17/blog-octopress-javascript-analytics/)