Python-клиент Google AdWords API возвращает только RefreshError: invalid_grant: неверный запрос - PullRequest
0 голосов
/ 23 марта 2019

Я новичок в AdWords и пытаюсь настроить мой первый запрос API в соответствии с инструкциями, приведенными здесь, с помощью Google Python-клиента AdWords API Google: https://developers.google.com/adwords/api/docs/guides/first-api-call Я следовал инструкциям как мог и могуполучить только вызов API для возврата: google.auth.exceptions.RefreshError: ('invalid_grant: Bad Request', '{\ n "error": "invalid_grant", \ n "error_description": "Bad Request" \ n}')

В соответствии с инструкциями я попробовал следующую последовательность действий:

1. Создайте учетную запись AdWords Manager и запросите мой токен разработчика

2. Получено уведомление о том, что мойТеперь токен dev находится в ожидании

3. Создана учетная запись Test Manager с использованием адреса электронной почты, отличного от того, который я использовал для запроса токена разработчика

4. Созданные тестовые кампании в рамках тестаУчетная запись менеджера

5. Установлена ​​клиентская библиотека Python согласно предоставленным инструкциям

6. В консоли разработчика Google, связанной с адресом электронной почты, который использовался для запроса моей разработкиИтак, я настроил идентификатор клиента OAuth и получил мои client_ID и client_secret

7. Использовал эти учетные данные в файле generate_refresh_token.py и запустил сценарий для получения URL-адреса для создания токена обновления.

8. Перешел по указанному URL-адресу и вошел в систему, используя учетную запись TEST MANAGER, и получил токен обновления

9. В файле googleads.yaml (который находится в моем корневом каталоге моего жесткого диска)Я добавил токен разработчика из учетной записи AdWords Manager (не тестовой), client_id и client_secret, сгенерированные на шаге 6, токен обновления, сгенерированный на шаге 8, и идентификатор клиента клиента из учетной записи TEST MANAGER.

10. Здесь создан файл Python с примером сценария API: https://github.com/googleads/googleads-python-lib/blob/master/examples/adwords/v201809/basic_operations/get_campaigns.py
Вот пример кода:

from googleads import adwords


PAGE_SIZE = 100


def main(client):
  # Initialize appropriate service.
  campaign_service = client.GetService('CampaignService', version='v201809')

  # Construct selector and get all campaigns.
  offset = 0
  selector = {
      'fields': ['Id', 'Name', 'Status'],
      'paging': {
          'startIndex': str(offset),
          'numberResults': str(PAGE_SIZE)
      }
  }

  more_pages = True
  while more_pages:
    page = campaign_service.get(selector)

    # Display results.
    if 'entries' in page:
      for campaign in page['entries']:
        print ('Campaign with id "%s", name "%s", and status "%s" was '
               'found.' % (campaign['id'], campaign['name'],
                           campaign['status']))
    else:
      print ('No campaigns were found.')
    offset += PAGE_SIZE
    selector['paging']['startIndex'] = str(offset)
    more_pages = offset < int(page['totalNumEntries'])


if __name__ == '__main__':
  adwords_client = adwords.AdWordsClient.LoadFromStorage()
  main(adwords_client)

Ожидаемый результат: ответ JSON со всеми кампаниями

Фактический вывод: google.auth.exceptions.RefreshError: ('invalid_grant: Bad Request', '{\ n "error": "invalid_grant", \ n "error_description": "Неверный запрос" \ n} ')

1 Ответ

1 голос
/ 24 марта 2019

**** РЕДАКТИРОВАТЬ: Я РАЗРЕШИЛ СВОЮ ПРОБЛЕМУ **** Сценарий для generate_refresh_token.py написан на Python 2, и я пытался запустить его на Python 3. Строка 101 сценария использует raw_input ()метод, который был изменен в Python 3 на input ().Это приводило к ошибке выполнения скрипта, которая не побуждала меня вводить код доступа, который мне давали после перехода к URL-адресу на шаге 8 (мне давали токен доступа, а НЕ токен обновления, как я раньше думал).
После изменения скрипта на input () и запуска его в компиляторе Python 3 мне было предложено указать код доступа, который возвращал код обновления в командной строке.Я надеюсь, что это поможет кому-то еще бороться с клиентом Python API.

...