Google AdWords API Python 客户端仅返回 RefreshError: invalid_grant: Bad Request

Posted

技术标签:

【中文标题】Google AdWords API Python 客户端仅返回 RefreshError: invalid_grant: Bad Request【英文标题】:Google AdWords API Python client only returns RefreshError: invalid_grant: Bad Request 【发布时间】:2019-03-23 17:47:48 【问题描述】:

我是 AdWords 新手,我正在尝试按照此处显示的说明使用 Google 的 AdWords API Python 客户端设置我的第一个 API 请求: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 经理帐户并申请我的开发者令牌 2. 收到通知,我的开发令牌现在处于待处理状态 3. 使用与我用于请求开发人员令牌的电子邮件地址不同的电子邮件地址创建了一个测试经理帐户 4. 在测试经理帐户下创建测试活动 5. 按照提供的说明安装 Python 客户端库 6. 在与用于请求我的开发者令牌的电子邮件地址关联的 Google 开发者控制台中,我设置了 OAuth 客户端 ID 并收到了我的 client_ID 和 client_secret 7. 将这些凭据用于 generate_refresh_token.py 文件并运行脚本以接收 URL 以生成刷新令牌。 8. 导航到提供的 URL 并使用 TEST MANAGER 帐户登录并收到刷新令牌 9. 在 googleads.yaml 文件(位于我硬盘的根目录)中,我添加了来自 AdWords 管理器帐户(不是测试帐户)的开发者令牌、第 6 步中生成的 client_id 和 client_secret,刷新第 8 步中生成的令牌,以及来自 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: Bad Request', '\n "error": "invalid_grant",\n "error_description": "Bad Request"\n')

【问题讨论】:

【参考方案1】:

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

【讨论】:

我在创建测试帐户时遇到了麻烦,您能给我一些建议吗? 我可以试试。你遇到了什么麻烦? 感谢您的回复,我按照您的步骤创建了一个测试帐户..

以上是关于Google AdWords API Python 客户端仅返回 RefreshError: invalid_grant: Bad Request的主要内容,如果未能解决你的问题,请参考以下文章

Google AdWords API Python 客户端仅返回 RefreshError: invalid_grant: Bad Request

使用 suds 在 Python 中使用 OAuth2 进行 Google Adwords API 身份验证

为 Google Adwords API 设置客户 ID

如何通过 python adwords API 与 gclids 一起获得 adwords 转换?

Google Adwords API 查询每次点击的转化次数

google adwords api 与 google-adwords-api gem