Twitter Ads API获取广告系列总花费及GUI显示ID技术求助
解决Twitter Ads API拉取广告系列花费及匹配GUI显示ID的问题
刚接触Twitter Ads API就遇到这俩问题确实头疼,我帮你拆解一下解决方案,顺便修正你的代码:
核心问题分析
你的代码里有两个关键问题:
entity_ids参数格式不对,需要是逗号分隔的字符串,而不是你用map生成的迭代器- 你没区分开API返回的广告系列编码ID和GUI里显示的
legacy_id,这俩是不同字段
分步解决你的需求
1. 获取每个广告系列的花费
首先要确保请求参数正确,尤其是entity_ids的格式,同时要明确拉取spend这个具体指标(属于BILLING metric group)。另外建议用官方SDK提供的枚举值,避免字符串拼写错误。
2. 匹配GUI显示的正规广告系列ID
Twitter Ads API里,GUI中显示的数字ID对应的是广告系列对象的legacy_id字段,而id字段是API内部用的编码格式(比如8cdfn)。所以我们需要先获取所有广告系列的id和legacy_id映射关系,再和统计数据关联。
修改后的完整代码
from twitter_ads.client import Client from twitter_ads.cursor import Cursor from twitter_ads.http import Request from twitter_ads.error import Error from twitter_ads.campaign import Campaign from twitter_ads.enum import METRIC_GROUP from twitter_ads.enum import GRANULARITY # 初始化客户端和账户 client = Client(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) account = client.accounts(ACCOUNT_ID) # 第一步:获取所有广告系列,同时保存API编码ID和GUI显示的legacy_id campaign_map = {} for campaign in Cursor(Campaign, account): # 建立映射:API编码ID -> (GUI显示ID, 广告系列名称) campaign_map[campaign.id] = { 'legacy_id': campaign.legacy_id, 'name': campaign.name } # 准备请求参数 resource = '/2/stats/accounts/{account_id}/'.format(account_id=account.id) params = { 'entity': 'CAMPAIGN', # 把API编码ID转成逗号分隔的字符串 'entity_ids': ','.join(campaign_map.keys()), 'start_time': '2017-12-10T00:00:00Z', # 建议加上时区,避免歧义 'end_time': '2017-12-16T23:59:59Z', 'granularity': GRANULARITY.TOTAL.value, # 使用枚举值的value属性 'metric_groups': METRIC_GROUP.BILLING.value, 'placement': 'PUBLISHER_NETWORK' } # 执行请求并处理响应 try: response = Request(client, 'get', resource, params=params).perform() stats_data = response.body['data'] # 关联统计数据和GUI显示的ID result = [] for stat in stats_data: campaign_info = campaign_map.get(stat['entity_id']) if campaign_info: result.append({ 'gui_campaign_id': campaign_info['legacy_id'], 'campaign_name': campaign_info['name'], 'total_spend': stat['metrics']['spend']['amount'], 'currency': stat['metrics']['spend']['currency'] }) # 打印最终结果 for item in result: print(f"广告系列ID(GUI): {item['gui_campaign_id']}") print(f"广告系列名称: {item['campaign_name']}") print(f"总花费: {item['total_spend']} {item['currency']}\n") except Error as e: print(f"请求错误详情: {e.details}") raise
关键改动说明
- 用
Cursor(Campaign, account)遍历所有广告系列,获取legacy_id字段(就是你在GUI里看到的数字ID) - 将
entity_ids转换为逗号分隔的字符串,符合API参数要求 - 给时间参数加上时区后缀
Z,避免时间范围解析错误 - 把统计数据和广告系列的GUI ID、名称关联起来,输出更直观的结果
- 使用官方枚举类的
value属性,减少手动拼写错误的概率
内容的提问来源于stack exchange,提问作者Hussein Negm
相关产品推荐
相关产品推荐

