#ruby #google-ads-api
#ruby #google-ads-api
Вопрос:
Я пытаюсь разработать скрипт ruby для запроса API Google Adwords с использованием учетных данных учетной записи службы. Я знаю, что файл учетных данных json работает в другом скрипте, который не является ruby, но я не могу пройти авторизацию в этом скрипте ruby. Я не могу найти никаких примеров, использующих этот шаблон. Я не хочу использовать OAuth2
. Я знаю, что этот скрипт недостаточно хорошо разработан, но я просто пытаюсь освоить основы. Что я здесь делаю не так?
У моей компании есть учетная запись G Suite, и у меня есть полные права администратора.
Вот мой код:
#!/usr/bin/ruby
require 'googleauth'
require 'fileutils'
require 'adwords_api'
API_VERSION = :v201809
scopes = ["https://www.googleapis.com/auth/adwords"]
credential_file = File.open('credentials/adwords-production.json')
prn = "adwords@mycompany.com"
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: credential_file, scope: scopes, prn: prn)
def get_report_fields(report_type)
adwords = AdwordsApi::Api.new
report_def_srv = adwords.service(:ReportDefinitionService, API_VERSION)
# Get report fields.
fields = report_def_srv.get_report_fields(report_type)
if fields
puts "Report type '%s' contains the following fields:" % report_type
fields.each do |field|
puts ' - %s (%s)' % [field[:field_name], field[:field_type]]
puts ' := [%s]' % field[:enum_values].join(', ') if field[:enum_values]
end
end
end
begin
report_type = 'ACCOUNT_PERFORMANCE_REPORT'
get_report_fields(report_type)
end
Комментарии:
1. кажется, вы объявляете
authorizer
, но никогда не используете.
Ответ №1:
Из документов Google здесь:
Все вызовы API AdWords должны быть авторизованы через OAuth2. OAuth2 позволяет вашему клиентскому приложению AdWords API получать доступ к учетной записи Google Ads пользователя без необходимости обрабатывать или сохранять данные для входа пользователя.
Похоже, вам придется использовать OAuth2
аутентификацию.
Дальнейшее чтение здесь подтверждает это:
Вашему приложению потребуется получить доступ к пользовательским данным и связаться с другими службами Google от вашего имени. Аутентификация через OAuth2 позволяет вашему приложению работать от имени вашей учетной записи.
Чтобы разрешить вашему приложению доступ к API, вам необходим идентификатор клиента OAuth2 и секрет клиента.
Вы говорите, что делали это где-то еще, где вы могли использовать файл JSON, поэтому я немного заглянул в исходный код.
Исходный код Ruby API находится здесь и здесь. Похоже, что действительно нет другого способа управлять учетными данными, по крайней мере, в Ruby API. Глядя здесь:
# Retrieve correct soap_header_handler.
#
# Args:
# - auth_handler: instance of an AdsCommon::Auth::BaseHandler subclass to
# handle authentication
# - version: intended API version
# - header_ns: header namespace
# - default_ns: default namespace
#
# Returns:
# - SOAP header handler
#
def soap_header_handler(auth_handler, version, header_ns, default_ns)
auth_method = @config.read('authentication.method', :OAUTH2)
handler_class = case auth_method
when :OAUTH2, :OAUTH2_SERVICE_ACCOUNT
AdsCommon::SavonHeaders::OAuthHeaderHandler
else
raise AdsCommon::Errors::AuthError,
"Unknown auth method: %s" % auth_method
end
return handler_class.new(@credential_handler, auth_handler, header_ns,
default_ns, version)
end
Обратите внимание, что если не используется OAuth, он выдает ошибку. На самом деле нет другого способа аутентификации. Даже если вам удалось пройти аутентификацию другим способом и попытаться передать его менеджеру учетных данных, он отклонит его.
Краткий ответ: Это невозможно в Ruby API без его какого-либо взлома.