0

Я использую Garb(0.9.8) для извлечения данных из Google Analytics с нашего сервера напрямую с помощью OAuth1. Поскольку Google только поддерживает OAuth2 сейчас, поэтому я переключился на Signet gem и использовал учетную запись службы, чтобы получить access_token с сервера напрямую, поскольку нам нужно только взаимодействие сервера с сервером.Получение профилей Google Analytics с использованием Garb

key = Google::APIClient::KeyUtils.load_from_pkcs12(p12_key_path, 'notasecret') 
client = Google::APIClient.new(application_name: 'Service account demo', application_version: '0.0.1') 
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/analytics', 'https://www.googleapis.com/auth/analytics.readonly'], 
    :issuer => <service account email>, 
    :signing_key => key 
) 

access_token = client.authorization.fetch_access_token!["access_token"] 

Токен действителен, и я дважды проверил его с игровой площадки Google API. Учетная запись службы добавлена ​​как пользователь со всеми разрешениями для моей учетной записи Google Analytics. Если возможно, я хотел использовать Garb вместо того, чтобы полностью переключиться на gmail google-api-client, чтобы избежать повторной записи большого количества кода exisiting. Затем сделать Garb использовать access_token получить и извлечь все профили, которые я сделал следующее

garbsession = Garb::Session.new 
garbsession.access_token = access_token 
Garb::Management::Profile.all(garbsession) 

Но я получаю сообщение об ошибке:

NoMethodError: undefined method `get' for #<String:0xd877aa0> 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/garb-0.9.8/lib/garb/request/data.rb:94:in `oauth_user_request' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/garb-0.9.8/lib/garb/request/data.rb:41:in `send_request' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/garb-0.9.8/lib/garb/management/feed.rb:21:in `response' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/garb-0.9.8/lib/garb/management/feed.rb:13:in `parsed_response' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/garb-0.9.8/lib/garb/management/feed.rb:17:in `entries' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/garb-0.9.8/lib/garb/management/profile.rb:14:in `all' 
    from (irb):47 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/railties-3.2.19/lib/rails/commands/console.rb:47:in `start' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/railties-3.2.19/lib/rails/commands/console.rb:8:in `start' 
    from /home/alok/.rvm/gems/ruby-1.9.3-p385/gems/railties-3.2.19/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

я делаю что-то не так? Могу ли я использовать токен доступа, полученный другим методом в Garb, а затем получить доступ к API Google Analytics?

+0

вы можете изменить код для поиска профилей как: Гарб :: Управление :: Profile.all, удаление одеянии сессии –

+0

Я буду вести вас использовать HTTPS://github.com/tpitale/legato gem для аналитических материалов ... это потрясающий камень. –

+0

@AdnanDevops - Garb :: Management :: Profile.all тоже не работает. Я попробую Legato, но из того, что я вижу, он предлагает еще несколько функций, которые нам еще не нужны. –

ответ

2

Ошибка, которую я сделал, это Garb::Session.access_token должен быть экземпляром клиента OAuth2, а не самим токеном доступа. Я отправляю рабочий код в свой ответ, чтобы он мог помочь другим позже!. Применил код при просмотре жемчуга Legato для решения проблемы. Github вопрос ссылку, где я нашел решение- https://github.com/tpitale/legato/issues/90

p12_key_path = File.join(Rails.root, "config", <p12_key_path>) 
key = Google::APIClient::KeyUtils.load_from_pkcs12(p12_key_path, 'notasecret') 
auth_client = 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/analytics.readonly', 
    issuer: <ga_service_account email>, 
    signing_key: key 
) 
access_token = auth_client.fetch_access_token! 
raise "Google OAuth Access Token is blank" if access_token["access_token"].blank? 
oauth_client = OAuth2::Client.new("", "", { 
    authorize_url: 'https://accounts.google.com/o/oauth2/auth', 
    token_url: 'https://accounts.google.com/o/oauth2/token' 
    }) 
token = OAuth2::AccessToken.new(oauth_client, access_token["access_token"], expires_in: 1.hour) 
Garb::Session.access_token = token 

profile = Garb::Management::Profile.all