Google AdWords API Python client only returns RefreshError: invalid_grant: Bad Request
Google AdWords API Python client only returns RefreshError: invalid_grant: Bad Request
我是 AdWords 的新手,正在尝试根据此处显示的说明使用 Google 的 AdWords API Python 设置我的第一个 API 请求客户:https://developers.google.com/adwords/api/docs/guides/first-api-call
我已尽我所能按照说明进行操作,但只能获得 API 对 return 的调用:
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 管理器帐户(不是测试帐户)的开发人员令牌,client_id 和 client_secret 在第 6 步中生成,在第 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}')
**** 编辑:我解决了我的问题 ****
generate_refresh_token.py 的脚本是在 Python 2 中编写的,我试图在 Python 3 中 运行 它。脚本的第 101 行使用 raw_input( ) 方法,已在 Python 3 中更改为 input()。这导致脚本执行错误,没有提示我输入在步骤 8 中导航到 URL 后获得的访问代码(我获得了访问令牌,而不是刷新令牌我之前也想过)。
在将脚本更改为 input() 并在 Python 3 编译器中将其 运行ning 后,我被提示提供访问代码,该访问代码在命令行上返回刷新代码。我希望这可以帮助其他与 Python API 客户苦苦挣扎的人。
我是 AdWords 的新手,正在尝试根据此处显示的说明使用 Google 的 AdWords API Python 设置我的第一个 API 请求客户:https://developers.google.com/adwords/api/docs/guides/first-api-call 我已尽我所能按照说明进行操作,但只能获得 API 对 return 的调用: 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 管理器帐户(不是测试帐户)的开发人员令牌,client_id 和 client_secret 在第 6 步中生成,在第 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}')
**** 编辑:我解决了我的问题 ****
generate_refresh_token.py 的脚本是在 Python 2 中编写的,我试图在 Python 3 中 运行 它。脚本的第 101 行使用 raw_input( ) 方法,已在 Python 3 中更改为 input()。这导致脚本执行错误,没有提示我输入在步骤 8 中导航到 URL 后获得的访问代码(我获得了访问令牌,而不是刷新令牌我之前也想过)。
在将脚本更改为 input() 并在 Python 3 编译器中将其 运行ning 后,我被提示提供访问代码,该访问代码在命令行上返回刷新代码。我希望这可以帮助其他与 Python API 客户苦苦挣扎的人。