python-3.x - Google AdWords API Python 客户端仅返回 RefreshError : invalid_grant: Bad Request

标签 python-3.x google-ads-api

我是 AdWords 新手,正在尝试按照此处显示的说明使用 Google 的 AdWords API Python 客户端设置我的第一个 API 请求:https://developers.google.com/adwords/api/docs/guides/first-api-call 我已尽力按照说明进行操作,并且只能返回 API 调用: google.auth.exceptions.RefreshError: ('invalid_grant: 错误请求', '{\n "error": "invalid_grant",\n "error_description": "错误请求"\n}')

根据说明,我尝试了以下顺序:

1. 设置 AdWords 管理工具帐户并请求我的开发者 token

2. 收到通知,我的开发 token 现在正在等待处理

3. 使用与我用来请求开发者 token 的电子邮件地址不同的电子邮件地址创建了一个测试经理帐户

4. 在测试经理帐户下创建测试事件

5. 按照提供的说明安装 Python 客户端库

6. 在与用于请求开发者 token 的电子邮件地址关联的 Google 开发者控制台中,我已设置 OAuth 客户端 ID 并收到我的 client_ID 和 client_secret

7. 将这些凭据用于generate_refresh_token.py 文件并运行脚本以接收 URL 以生成刷新 token 。

8. 导航到提供的 URL 并使用 TEST MANAGER 帐户登录并收到刷新 token

9. 在 googleads.yaml 文件(位于硬盘根目录)中,我添加了来自 AdWords 管理帐户(不是测试帐户)的开发人员 token 、第 6 步中生成的 client_id 和 client_secret,刷新第 8 步中生成的 token 以及来自 TEST MANAGER 帐户的客户端客户 ID。

10. 使用此处的示例 API 脚本创建了一个 Python 文件: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: 错误请求', '{\n "error": "invalid_grant",\n "error_description": "错误请求"\n}')

最佳答案

**** 编辑:我解决了我的问题 **** generate_refresh_token.py 的脚本是用 Python 2 编写的,我尝试在 Python 3 中运行它。脚本的第 101 行使用 raw_input() 方法,该方法在 Python 3 中已更改为 input()。这导致脚本执行中出现错误,该错误不会提示我输入在步骤 8 中导航到 URL 后给出的访问代码(我得到的是访问 token ,而不是我之前认为的刷新 token ) ).
将脚本更改为 input() 并在 Python 3 编译器中运行它后,系统提示我提供访问代码,该访问代码在命令行上返回刷新代码。我希望这可以帮助那些在 Python API 客户端上苦苦挣扎的人。

关于python-3.x - Google AdWords API Python 客户端仅返回 RefreshError : invalid_grant: Bad Request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55316656/

相关文章:

Java 如何在 dynamodb 中存储 JSON 对象或 JSON 数组而不将其转换为字符串?

python - Python 中的自定义格式化程序无法处理格式化的日志消息

php - 如何使用 google adwords api 获取所有广告系列的详细信息?

python - 使用 pytest 中的 AdWordsClient 时出错 - 检测到递归(相同的局部变量和位置)

java - 通过 Google Adwords API 获取特定 Adwords 报告可用的字段列表

python - 将世界城市映射到大都市统计区域(以及非美国 MSA 等效项)的数据库

python-3.x - 使用感叹号运行 bash 命令不适用于 python 提示符

python-3.x - 在 Jupyter 中调用定义的函数时出现名称错误

python - 即使我尝试更新它也无法更新 pip3

python-3.x - GEKKO中优化问题的并行化