У меня возникли проблемы с созданием токена обновления с помощью Python для API AdWords, и мне нужна помощь. Вот такая ситуация:

  • У меня есть клиент в AdWords, для которого я хочу получать отчеты через AdWords API (для этого у нас есть токен разработчика). Предположим, что в AdWords учетная запись клиента - 521-314-0974 (это выдумка). Вот где я запутался:

Ниже приведен следующий фрагмент кода, необходимый для создания токена обновления, который я пытаюсь заставить работать:

"""Generates a refresh token for use with AdWords."""

__author__ = 'Nathaniel Payne'

import sys
import urllib2

from oauthlib import oauth2

# Your OAuth 2.0 Client ID and Secret. If you do not have an ID and Secret yet,
# please go to https://console.developers.google.com and create a set.
CLIENT_ID = 'INSERT_CLIENT_ID_HERE'
CLIENT_SECRET = 'INSERT_CLIENT_SECRET_HERE'

# You may optionally provide an HTTPS proxy.
HTTPS_PROXY = None

# The AdWords API OAuth 2.0 scope.
SCOPE = u'https://adwords.google.com/api/adwords'
# This callback URL will allow you to copy the token from the success screen.
CALLBACK_URL = 'urn:ietf:wg:oauth:2.0:oob'
# The HTTP headers needed on OAuth 2.0 refresh requests.
OAUTH2_REFRESH_HEADERS = {'content-type':
                          'application/x-www-form-urlencoded'}
# The web address for generating new OAuth 2.0 credentials at Google.
GOOGLE_OAUTH2_AUTH_ENDPOINT = 'https://accounts.google.com/o/oauth2/auth'
GOOGLE_OAUTH2_GEN_ENDPOINT = 'https://accounts.google.com/o/oauth2/token'


def main():
  oauthlib_client = oauth2.WebApplicationClient(CLIENT_ID)

  authorize_url = oauthlib_client.prepare_request_uri(
      GOOGLE_OAUTH2_AUTH_ENDPOINT, redirect_uri=CALLBACK_URL, scope=SCOPE)
  print ('Log in to your AdWords account and open the following URL: \n%s\n' %
         authorize_url)
  print 'After approving the token enter the verification code (if specified).'
  code = raw_input('Code: ').strip()

  post_body = oauthlib_client.prepare_request_body(
      client_secret=CLIENT_SECRET, code=code, redirect_uri=CALLBACK_URL)
  if sys.version_info[0] == 3:
    post_body = bytes(post_body, 'utf8')
  request = urllib2.Request(GOOGLE_OAUTH2_GEN_ENDPOINT, post_body,
                            OAUTH2_REFRESH_HEADERS)
  if HTTPS_PROXY:
    request.set_proxy(HTTPS_PROXY, 'https')
  raw_response = urllib2.urlopen(request).read().decode()
  oauth2_credentials = oauthlib_client.parse_request_body_response(raw_response)

  print ('Your access token is %s and your refresh token is %s'
         % (oauth2_credentials['access_token'],
            oauth2_credentials['refresh_token']))
  print ('You can cache these credentials into a yaml file with the '
         'following keys:\nadwords:\n  client_id: %s\n  client_secret: %s\n'
         '  refresh_token: %s\n'
         % (CLIENT_ID, CLIENT_SECRET, oauth2_credentials['refresh_token']))


if __name__ == '__main__':
  main()

Вопросы: 1) Нужно ли мне настраивать специальный проект для каждого клиента AdWords на console.developers.google.com, чтобы использовать API отчетов AdWords? Или я могу просто указать секрет клиента и идентификатор для общей учетной записи в консоли?

2) Исходя из этого, может ли кто-нибудь подтвердить, что должно быть вместо client_ID и Client_Secret, чтобы блок кода Python, указанный ниже, работал. Я имею в виду, что я использовал идентификатор клиента и секрет клиента из https://console.developers.google.com < / a> ... для учетной записи аналитики, для которой у нас настроен биллинг (и которую я ранее использовал для доступа к BigQuery API). Это правильно? Я не совсем понимаю, как это будет связано с учетной записью AdWords для этого клиента.

2) В экране согласия я поставил свой e-mail, так как являюсь владельцем проекта. Тем не менее, когда я запускаю код, я получаю ссылку на URL-адрес, который мне нужно запустить для генерации кода. Тем не менее, когда я загораю этот фрагмент:

print ('Log in to your AdWords account and open the following URL: \n%s\n' %
             authorize_url)
      print 'After approving the token enter the verification code (if specified).'
      code = raw_input('Code: ').strip()

Я получаю ошибку Это сообщение, которое я получаю по ошибке:

Error: redirect_uri_mismatch
The redirect URI in the request: urn:ietf:wg:oauth:2.0:oob did not match a registered redirect URI

Learn more
    Request Details
    cookie_policy_enforce=false
    scope=https://adwords.google.com/api/adwords
    response_type=code
    access_type=online
    redirect_uri=urn:ietf:wg:oauth:2.0:oob
    display=page
    client_id=XXXXXXXXX.apps.googleusercontent.com

Я здесь озадачен. Некоторые люди предлагали изменить адрес электронной почты на экране согласия (что я сделал ... но безуспешно). Опять же, моя простая цель - получить один отчет от этих клиентов через AdWords API (который я расширю, как только доберусь до него). Любая помощь будет оценена. Ваше здоровье.

3
Nathaniel Payne 25 Мар 2014 в 22:58

1 ответ

Лучший ответ

После некоторой работы мне удалось успешно решить эту проблему. Вот подробные шаги, которые я предпринял, чтобы добраться до точки, в которой я мог успешно извлекать данные через API. В моей ситуации я управляю Центром клиентов AdWords с несколькими учетными записями. Таким образом, я вернулся к началу многих справочных руководств и сделал следующее:

  1. Создайте новый проект под названием AdWords-API-XXXX.
  2. На экране учетных данных на консоли я создал новый «Идентификатор клиента для собственного приложения». Это позволило мне сгенерировать мои CLIENT_ID и CLIENT_SECRET, которые мне были нужны. Что критически важно, он также сгенерировал перенаправленный URI, который был источником моей проблемы.
  3. Я взял оба этих значения, добавил их в основной скрипт и запустил скрипт generate_refresh_token.py. Это позволило мне создать рабочий токен обновления. Мне нужно было войти в свой MCC аккаунта AdWords, чтобы убедиться, что OAuth2 предоставил мне возможность доступа ко всем потенциальным клиентам AdWord внутри моего MCC. Я получил экран аутентификации, сгенерированный URL-адресом для этого процесса, который попросил меня подтвердить, что разрешение на доступ к AdWords было предоставлено.
  4. После этого я создал новый скрипт googleads.yaml и поместил его в свой каталог c: \ gsutil. Это код большинства программ Python, в котором программа ищет файл googleads.yaml:

    adwords_client = adwords.AdWordsClient.LoadFromStorage()
    
  5. Как только это было сделано, я смог успешно запустить сценарий из командной строки для генерации окончательного вывода. Сценарий был:

    python download_criteria_report.py
    

Обратите внимание, конечно, что я ранее изменил свою переменную пути, чтобы запустить Python 2.7 из командной строки. Этот сценарий был запущен в каталоге файла download_criteria_report.py. Этот скрипт успешно запустился и позволил мне получить данные из AdWords API для одного из моих тестовых клиентов.

Следующей задачей будет работа с выводом, возвращаемым API, и его преобразование в формат, который я могу быстро использовать для анализа и хранения.

8
Nathaniel Payne 26 Мар 2014 в 02:36
1
Хороший пост, полезный для новичков, похоже, не хватает подробных руководств!
 – 
RealityDysfunction
26 Мар 2014 в 21:52
Спасибо. Рад, что это помогает. Я чувствовал то же самое. Я медленно прорабатываю стек Google Cloud и по ходу буду публиковать вопросы (вместе с решениями, если я их найду или их найдут другие).
 – 
Nathaniel Payne
26 Мар 2014 в 23:31
Когда я использовал generate_refresh_token.py, он дал мне токен обновления, это тот же токен разработчика? Как выглядит ваш файл googleads.yaml?
 – 
deweydb
19 Дек 2014 в 07:11
О, нм, только что нашел это: github.com/googleads/ googleads-python-lib / blob / master /…
 – 
deweydb
19 Дек 2014 в 07:14