使用Python调用DV360 API获取性能指标时遭遇AttributeError错误求助
使用Python调用DV360 API获取性能指标时遭遇AttributeError错误求助
嘿,我来帮你搞定这个问题!你遇到的AttributeError: 'Resource' object has no attribute 'queries'其实是个常见的API资源调用错误,咱们一步步解决它,顺便帮你顺利拿到想要的性能指标。
错误根源:用错了DV360 API的资源端点
DV360的Display Video v3版本API里根本没有queries这个资源,你原代码里的service.queries().create()是不存在的调用方式。根据你的需求(生成一次性或可复用的KPI报告),有两个正确的API方法可选:
- 如果想创建可复用的查询(后续能重复运行):用
savedQueries()资源 - 如果只想直接跑一次报告拿结果:用
reportTools().runReport()方法
解决方案1:创建可复用的保存查询并运行
这是最贴近你原代码逻辑的方案,修正资源调用后,还能添加轮询状态获取报告下载链接的逻辑:
from google.oauth2 import service_account from googleapiclient.discovery import build import time # 替换为你的服务账号密钥路径 SERVICE_ACCOUNT_FILE = "service_account.json" SCOPES = ['https://www.googleapis.com/auth/display-video'] # 认证部分没问题,保留即可 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) service = build('displayvideo', 'v3', credentials=credentials) # 你的查询参数可以保留,注意替换真实的广告客户ID query = { "metadata": { "title": "KPI_Report", "dataRange": {"range": "LAST_30_DAYS"}, "format": "CSV" }, "params": { "type": "STANDARD", "groupBys": [ "FILTER_DATE", "FILTER_PLATFORM", "FILTER_MONTH", "FILTER_YEAR", "FILTER_ADVERTISER_NAME", "FILTER_CAMPAIGN_NAME", "FILTER_MEDIA_TYPE" ], "metrics": [ "METRIC_IMPRESSIONS", "METRIC_CLICKS", "METRIC_TOTAL_CONVERSIONS", "METRIC_MEDIA_COST_ADVERTISER", "METRIC_GMAIL_CLICKS", "METRIC_CTR", "METRIC_CPM", "METRIC_CPC", "METRIC_CPV", "METRIC_CR", "METRIC_VIEWS", "METRIC_VTR", "METRIC_COMPLETE_VIDEO_VIEWS", "METRIC_COMPLETE_VIEW_RATE", "METRIC_CPCV", "METRIC_RICH_MEDIA_ENGAGEMENTS", "METRIC_FREQUENCY", "METRIC_REACH" ], "filters": [ {"type": "FILTER_ADVERTISER", "value": "YOUR_ADVERTISER_ID"} # 替换为真实数字ID ] }, "schedule": {"frequency": "ONE_TIME"} } # 修正:用savedQueries替换不存在的queries query_response = service.savedQueries().create(body=query).execute() saved_query_id = query_response.get('savedQueryId') print(f"已创建保存查询,ID:{saved_query_id}") # 运行这个保存的查询 report_run = service.savedQueries().run(savedQueryId=saved_query_id).execute() report_run_id = report_run.get('reportRunId') # 轮询报告生成状态(DV360生成报告需要一点时间) print("等待报告生成...") while True: report_status = service.reportRuns().get(reportRunId=report_run_id).execute() if report_status['state'] == 'REPORT_RUN_STATE_DONE': download_url = report_status['metadata']['googleCloudStoragePath'] print(f"报告已生成!下载地址:{download_url}") break elif report_status['state'] == 'REPORT_RUN_STATE_FAILED': print("报告生成失败,请检查查询参数或权限!") break time.sleep(10) # 每10秒检查一次状态
解决方案2:直接运行一次性报告(无需保存查询)
如果不需要复用查询,直接用reportTools().runReport()更简洁,注意这里的维度和指标命名略有不同(不需要加FILTER_或METRIC_前缀):
# 认证部分和上面一致,省略... # 一次性报告的查询参数 one_time_report_query = { "dateRange": {"range": "LAST_30_DAYS"}, "dimensions": [ "DATE", "PLATFORM", "MONTH", "YEAR", "ADVERTISER_NAME", "CAMPAIGN_NAME", "MEDIA_TYPE" ], "metrics": [ "IMPRESSIONS", "CLICKS", "TOTAL_CONVERSIONS", "MEDIA_COST_ADVERTISER", # 其他你需要的指标直接写名称即可 ], "advertiserId": "YOUR_ADVERTISER_ID", # 替换为真实数字ID "format": "CSV" } # 直接运行报告 report_run = service.reportTools().runReport(body=one_time_report_query).execute() report_run_id = report_run.get('reportRunId') # 同样轮询状态获取下载链接(代码和上面一致,省略...)
额外注意事项
- 权限验证:确保你的服务账号已经被添加到对应的DV360广告客户中,并且分配了至少「查看者」或「报告编辑者」的角色,否则会出现权限错误。
- 参数正确性:维度和指标的枚举值要严格匹配DV360 API的要求,不能拼错单词,大小写也要正确。
- 广告客户ID:必须填写真实的数字ID,不是广告客户名称,你可以在DV360界面的广告客户设置里找到这个ID。
这样修改后,你不仅能解决AttributeError的问题,还能顺利生成包含曝光、点击、转化等你需要的所有KPI指标的报告啦!
备注:内容来源于stack exchange,提问作者Bits
相关产品推荐
相关产品推荐

