【Ruby】Google APIをRubyから叩いてみる

2020年8月25日

こんにちは、しきゆらです。

今回は、タイトル通りですが、GoogleのAPIを利用したアプリケーションを作るときの流れを見ていきます。

大まかな流れとしては、以下のとおりです。

  • Google Cloud Consoleから、APIを有効にする
  • APIを叩くための認証を通す
  • 認証情報をもとに、APIを叩く

では、それぞれ見ていきます。

Google Cloud ConsoleからAPIを有効にする

アカウント作成

URLはこちら。=> https://console.cloud.google.com/?hl=ja

「Google Cloud Console」でググっても出てきます。

こちら、アカウントを作成しなければいけないようです。

今回は、すでにアカウントがあったので特に何もしませんが、

Googleのアカウントがあれば特に何も必要ないはずです。

APIプロジェクトを作成

Googleさんは、様々なAPIを公開しています。

必要なものだけを有効化してあげなければいけません。

APIプロジェクトを作成し、プロジェクトごとにAPIを有効にする流れのようです。

では、まずはプロジェクトを作っていきます。

ログインすると、トップページに行くはずです。

トップページ右上にあるプロジェクト作成。

所定の項目を入力して作成。

APIを有効化

「ナビゲーションメニュー」 => 「APIとサービス」=>「ダッシュボード」から「APIとサービスの有効化」をクリック。

すると、様々なAPIやサービスの一覧が表示されます。

検索窓で、Calendar APIを探します。

見つけたら、「有効にする」をクリックすれば完了です。

API認証情報の設定

準備の最後です。

認証情報を取得します。

左側のバーにマウスオーバーすると、「認証情報」という欄があるのでクリック。

認証情報を作成。

いくつか種類があります。

  • APIキー:ユーザデータを必要としないWebアプリ向け
  • OAuthクライアントID:ユーザデータにアクセスする場合向け
  • サービスアカウントキー:アプリケーション用の特別なアカウント

今回は、OAuthクライアントIDを選択します。

すると、同意画面を作成しろ、と怒られるので作成します。

最低限、メールアドレスとサービス名を書いて保存すればOKです。

サービス名は、自由に決めることができます。

次に、アプリケーションの種類を聞かれます。

今回はRubyさんから叩きたいので「その他」にしておきます。

すると、クライアントIDとクライアントシークレットの2つの値が表示されます。

これは、JSONファイルでダウンロードできるので、メモしなくても大丈夫です。

作成できたら、右端にあるダウンロードアイコンをクリックするとJSONファイルが取得できます。

取得できたJSONファイルは「client_secret.json」としておきます。

これにて、準備は完了です。

APIを叩くための認証を通す

APIを叩くためには、認証を通してから出ないと叩けません。

Rubyさんから認証を通す方法としては、Googleさんが提供してくれているライブラリを利用するのが簡単かと思います。

Google Auth Library for Ruby

https://github.com/google/google-auth-library-ruby

Bundlerで管理していきます。

Gemfileには

gem 'googleauth'

を書き込みインストール。

なお、まだアルファ版のようで仕様が変更されることがあります。

ご注意を。

さて、認証のためのスクリプトは、サンプルをほとんどそのまま利用します。

Example (Command Line)のコードを少しいじって、以下のようなコードを作成。

ついでに、先程取得したJSONファイルを以下のスクリプトと同じところにおいておきます。

require 'googleauth'
require 'googleauth/stores/file_token_store'
    
OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
user_id = 'your_id@gmail.com'
    
client_id = Google::Auth::ClientId.from_file('./client_secret.json')
token_store = Google::Auth::Stores::FileTokenStore.new(file: 'google_api.yml')
scope = 'https://www.googleapis.com/auth/calendar'
authorizer = Google::Auth::UserAuthorizer.new(client_id, scope, token_store)
    
credentials = authorizer.get_credentials(user_id)
    
if credentials.nil?
   url = authorizer.get_authorization_url(base_url: OOB_URI)
   puts "ブラウザで次のURLを開き、APIを許可してください"
   puts url
   puts '応答ページに表示されるコードを入力してください'
   print 'code:' 
   code = gets
   credentials = authorizer.get_and_store_credentials_from_code(
       user_id: user_id,
       code: code,
       base_url: OOB_URI
   )
end

コードを実行し、URLをブラウザで開き、認証コードを取得後、コードを貼り付ければ認証できているはずです。

エラー等がなければ完了です。

認証情報をもとに、APIを叩く

では、実際にAPIを叩いていきます。

HTTPでアクセスできれば何でもいいですが、こちらもGoogleさんが提供してくれているライブラリを利用するのが簡単かと思います。

Google API Client

github.com/google/google-api-ruby-client

こちらもGemfileに追加し、インストール。

gem 'google-api-client'

APIを叩くコード

APIを叩くコードは、Calendar APIと同じメソッドが定義されているので、APIリファレンスとクライアントのメソッド両方を参考にしましょう。

APIリファレンス

https://developers.google.com/calendar/v3/reference/

ライブラリのCalendar該当部分

https://github.com/google/google-api-ruby-client/blob/ca56db5630f7d003834e9a31f28fc1f0f0bdda0c/generated/google/apis/calendar_v3/service.rb

APIリファレンスでは、APIを叩いた結果をテストできる機能があります。

取得できるJSONの形式を確認しておくと、欲しい情報を取得するときに参考になると思います。

ライブラリの方は、リクエスト時に送るべきパラメータや、Rubyから取得するメソッド名など実際に利用するときの参考になるかと思います。

さて、今回は簡単に「自分のカレンダーの一覧を取得する」ということをやってみます。

利用するAPIは「CalendarList」です。

CalendarList: list

https://developers.google.com/calendar/v3/reference/calendarList/list

認証が通れば、APIを叩くだけで結果を取得できるので簡単で良いです。

とりあえず、先程の認証コードの下に以下を追記。

require 'google/apis/calendar_v3'
    
# Calendar APIを利用するためのインスタンスを作成
service = Google::Apis::CalendarV3::CalendarService.new
# 認証情報を付加
service.authorization = credentials
    
# list_calendar_lists:カレンダーリストを取得するAPIを叩く
# 返り値は、カレンダー要素の配列。eachですべてを表示している。
puts service.list_calendar_lists.items.each{|calendar| puts calendar.summary}

実行し、カレンダーの名前が列挙されれば成功です。

なお、上記サイトではAPIをブラウザ上で実行し、結果をJSON形式で確認することができます。

必要なデータがどの階層に入っているのかを確認すると便利です。

例えば、今回はカレンダーの名前を列挙していますが、

itemsという配列の中にある要素のsummaryが名前を表しているため、上記のようなコードになっています。

まとめ

さて、さっくりとではありますがGoogle APIを利用するための流れや使い方を確認してみました。

認証部分がバグっていたようでサンプルコードが動かない場面がありましたが、

バグは現在修正されているので問題なく動くはずです。

あとは、これを自分の作っているサービスと組み合わせたり、データを自分なりに可視化したりできそうですね。

今回はここまで。

おわり

Ruby

Posted by shikiyura