格式化Mac后无法用Python 2.7调用DFP API的问题求助
我之前升级OS系统后也碰到过类似的DFP API认证坑,结合你的情况来看,大概率是系统升级后SSL加密库、文件权限或者依赖版本的兼容性问题,给你几个针对性的排查和解决方向:
1. 优先排查OpenSSL版本冲突
OS Sierra自带的OpenSSL版本对旧密钥格式的支持有变化,而Python2.7默认会调用系统的OpenSSL。先检查当前Python绑定的OpenSSL版本:
import ssl print(ssl.OPENSSL_VERSION)
如果版本是1.0.2及以上,建议用brew安装兼容旧版本的OpenSSL,再重新编译Python2.7绑定这个版本(用pyenv管理会更方便,避免破坏系统Python):
# 安装兼容的旧版OpenSSL brew install openssl@1.0.2t # 用pyenv重新编译Python2.7,指定OpenSSL路径 env LDFLAGS="-L/usr/local/opt/openssl@1.0.2t/lib" CPPFLAGS="-I/usr/local/opt/openssl@1.0.2t/include" pyenv install 2.7.18
2. 确认.p12密钥的权限和路径
系统升级后文件权限可能被重置,先给密钥文件赋予可读权限:
chmod 644 your-key-file.p12
另外,脚本里尽量用绝对路径引用密钥文件,避免工作目录变化导致找不到文件:
# 替换成你的密钥实际绝对路径 KEY_FILE_PATH = '/Users/your-name/dfp-scripts/your-key-file.p12'
3. 更新到Python2.7兼容的googleads版本
旧版googleads库可能和OS Sierra的环境不兼容,建议升级到支持Python2.7的最后几个稳定版本:
pip install --upgrade googleads==4.1.0
(4.1.0是官方支持Python2.7的较新版本,更高版本只适配Python3了)
4. 检查认证代码的关键参数
确保你的认证代码没有遗漏必要参数,比如服务账号邮箱、API范围,正确的示例代码大概是这样的:
from googleads import dfp # 替换成你的实际配置 SERVICE_ACCOUNT_EMAIL = 'your-service-account@your-project.iam.gserviceaccount.com' KEY_FILE = '/path/to/your-key.p12' APPLICATION_NAME = 'Your DFP Operation App' def main(): # 手动加载服务账号凭证(比从配置文件加载更易排查) credentials = dfp.DfpServiceAccountClient.LoadServiceAccountCredentials( None, SERVICE_ACCOUNT_EMAIL, KEY_FILE, ['https://www.googleapis.com/auth/dfp'] ) dfp_client = dfp.DfpClient(credentials, APPLICATION_NAME) # 用简单接口测试是否认证成功 user_service = dfp_client.GetService('UserService', version='v202402') current_user = user_service.getCurrentUser() print(f"当前登录用户: {current_user['name']}") if __name__ == '__main__': main()
重点确认['https://www.googleapis.com/auth/dfp']这个权限范围不能写错。
5. 排查SSL证书验证问题
OS Sierra的根证书更新可能导致Python无法验证Google API的证书,你可以先临时关闭验证测试(仅用于排查,生产环境别这么做):
import ssl ssl._create_default_https_context = ssl._create_unverified_context
如果临时关闭后能正常运行,说明是证书问题,更新Python的CA证书即可:
pip install --upgrade certifi
如果以上方法都没解决,建议把完整的Traceback报错信息贴出来,能更精准定位问题——不过根据我之前的踩坑经验,前面几个方法大概率能搞定OS Sierra升级后的认证故障。
内容的提问来源于stack exchange,提问作者rnatarajan

