21535


ruby 2.2.0  
gem 'google-api-client', require: 'google/api_client'

以下のような実装で、実行しても、本日のカレンダーの一覧が取得できませんでした。  
自分のカレンダーには確かに予定は入っております。

勿論issuerのところは正しい値を入れております。

[code]

    class GoogleCalendarService
      def self.today_events
        cal = @client.discovered_api('calendar', 'v3')
        @client.execute(
          api_method: cal.events.list,
          parameters: {
            calendarId: 'primary',
            orderBy: 'startTime',
            timeMin: Time.current.beginning_of_day.iso8601,
            timeMax: Time.current.end_of_day.iso8601,
            singleEvents: 'True'
          }
        ).data.items
      end
    
      def self.client
        @client ||= Google::APIClient.new(application_name: '').tap do |client|
          key = Google::APIClient::PKCS12.load_key('p12ファイルのパス', 'notasecret')
          client.authorization = Signet::OAuth2::Client.new(
            token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
            audience: 'https://accounts.google.com/o/oauth2/token',
            scope: 'https://www.googleapis.com/auth/calendar.readonly',
            issuer: 'issuer@api-project-250641402888.iam.gserviceaccount.com',
            signing_key: key
          )
          client.authorization.fetch_access_token!
        end
      end
    end
    
    
[/code]

デバッグをする中で、

[code]

    cal
    => Google::APIClient::API:0x3ff89b41c6ec ID:calendar:v3
    
    hoge =     @client.execute(
      api_method: cal.events.list,
      parameters: {
        calendarId: 'primary',
        orderBy: 'startTime',
        timeMin: Time.current.beginning_of_day.iso8601,
        timeMax: Time.current.end_of_day.iso8601,
        singleEvents: 'True'
      }
    )
    
    
[/code]

hogeの返り値はGoogle::APIClient::Result:0x007ff13865fac8で、色々とデータが入っておりました。

hoge.data

[code]

    Google::APIClient::Schema::Calendar::V3::Events:0x3ff89d345604 DATA:{"kind"=>"calendar#events", "etag"=>"\"1454212261000000\"", "summary"=>"issuer@api-project-250641402888.iam.gserviceaccount.com", "updated"=>"2016-01-31T03:51:01.000Z", "timeZone"=>"UTC", "accessRole"=>"owner", "defaultReminders"=>[], "items"=>[]}
    
    
[/code]

hoge.data.items

[code]

    []
    
[/code]

となってしまい、肝心なhoge.data.itemsの値は取得できませんでした。

ログを見ている限り、どこに原因があるのかがわからず、どうしたらいいのかわかりません。  
どなたかアドバイスいただけないでしょうか？  
宜しくお願いします。


CC BY-SA 3.0
2016-01-31T05:01:26.157
21528
2016-01-31T08:57:05.683
13175
question
ruby-on-rails ruby rubygems
google-api-clientでカレンダーを取得したいのですが、認証は成功しているものの、data.itemsが取得できません。


サービスアカウントは独立した一つのアカウントなので、サービスアカウントを作っただけではユーザーのデータにアクセスすることはできません。質問のコードでアクセスしてるのはユーザーのカレンダーではなくサービスアカウントのカレンダーです。当然何のデータもありません。

  * カレンダーの設定で、アクセスさせたいカレンダーをサービスアカウントに対し共有する
  * APIでそのカレンダーのIDを指定する

が必要です。

またはサービスアカウントではなくトークンを使ったアクセスに変更してください。


CC BY-SA 3.0
2016-01-31T08:57:05.683
21535
2016-01-31T08:57:05.683
5793
21528
answer