Google API OAuth2获令牌后调用服务报NoneType错误及500状态码
解决AdWords API调用时的'NoneType' object is not callable及回调500错误
嘿,我看了你遇到的问题——已经搞定OAuth2认证拿到了动态变化的access token,说明授权流程的令牌获取环节没问题,但调用CustomerService时却蹦出'NoneType' object is not callable的错误,还伴随回调500状态码。结合你的代码,我整理了几个关键排查点,应该能帮你解决:
1. 修正AdWordsClient的初始化方式(核心问题)
你手动构造GoogleAccessTokenClient的写法可能有问题——新版googleads库推荐直接用FLOW.credentials对象初始化AdWordsClient,不用手动封装token信息。把这部分代码改成这样:
# 替换原来的oauth2_client和adwords_client初始化代码 adwords_client = adwords.AdWordsClient( "DEVELOPER-TOKEN", credentials, # 直接传入FLOW拿到的credentials对象 "USER-AGENT", "CLIENT-CUSTOMER-ID" )
手动构造GoogleAccessTokenClient很容易漏传token过期时间或其他元数据,导致客户端内部状态异常,这大概率是你遇到NoneType错误的核心原因。
2. 检查AdWordsClient初始化的参数细节
确认这几个参数的正确性:
CLIENT-CUSTOMER-ID必须是XXX-XXX-XXXX的格式(带连字符),格式错误会导致客户端隐性初始化失败,后续GetService自然返回None。USER-AGENT要是合规的字符串(比如你的应用名称+版本),不符合规范可能引发未知异常。
3. 增加错误捕获,打印完整错误栈
你的回调函数现在只返回500,但看不到具体错误细节。加个try-except块,把完整错误信息打出来,能帮你精准定位:
def getAdwordsTokens(request): try: auth_code = request.GET.get('code') FLOW.fetch_token(code=auth_code) credentials = FLOW.credentials adwords_client = adwords.AdWordsClient( "DEVELOPER-TOKEN", credentials, "USER-AGENT", "CLIENT-CUSTOMER-ID" ) # 先确认服务对象是否正常获取 customer_service = adwords_client.GetService('CustomerService') print(f"CustomerService对象类型: {type(customer_service)}") # 检查是否为None customers = customer_service.getCustomers() print('你当前登录的客户ID: %s' % customers[0]['customerId']) return HttpResponseRedirect("/") except Exception as e: import traceback traceback.print_exc() # 打印完整错误信息到终端 return HttpResponse(f"出错了: {str(e)}", status=500)
4. 检查FLOW的全局初始化是否正确
确保FLOW是在模块顶部全局初始化的(只执行一次),不要在函数里重复创建:
from google_auth_oauthlib.flow import Flow # 全局初始化,放在模块顶部 FLOW = Flow.from_client_secrets_file( 'client_secret.json', # 你的OAuth2密钥文件路径 scopes=['https://www.googleapis.com/auth/adwords'], redirect_uri='http://localhost/oauth2callback' )
重复初始化FLOW会导致状态不一致,引发奇怪的错误。
5. 确认回调URL完全一致
要保证三个地方的回调URL完全匹配(包括是否带尾部斜杠):
- 代码里的
FLOW.redirect_uri url.py里的回调路径- Google Cloud Console中OAuth2客户端的已授权重定向URI
哪怕微小的差异,都可能导致fetch_token时出现隐性错误,进而让credentials状态异常。
按上面的步骤逐一排查,尤其是直接用credentials初始化AdWordsClient这一步,应该能解决你遇到的问题。
内容的提问来源于stack exchange,提问作者everydaymage
相关产品推荐
相关产品推荐

