我正在尝试从API中提取广告系列费用/总支出 我是API的100%新手,我无法通过
破解它我想: 1-每个广告系列获得费用 2-获取在GUI上显示的广告系列ID,而不仅仅是那种奇怪的代码,即8cdfn vs 1448530943
这是我到目前为止的python代码
from twitter_ads.client import Client
from twitter_ads.cursor import Cursor
from twitter_ads.http import Request
from twitter_ads.error import Error
import time
from twitter_ads.campaign import LineItem
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)
cids = map(lambda x: x.id, account.campaigns())
resource = ‘/2/stats/accounts/{account_id}/’.format(account_id=account.id)
params = { ‘entity’:‘CAMPAIGN’,
‘entity_ids’:cids,
‘start_time’: ‘2017-12-10’,
‘end_time’:‘2017-12-16’,
‘granularity’:‘TOTAL’,
‘metric_groups’: ‘BILLING’,
‘placement’: ‘PUBLISHER_NETWORK’}
try, build and execute the request with error handling
try:
response = Request(client, ‘get’, resource, params=params).perform()
print(response.body[‘data’])
except Error as e:
# see twitter_ads.error for more details
print e.details
raise
答案 0 :(得分:0)
这是对我有用的解决方案 诀窍是在API中无法传递多个展示位置
from datetime import date,timedelta
import datetime
import logging
import sys
import os
import gzip
import shutil
import csv
import requests
import json
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.client import Client
from twitter_ads.campaign import LineItem
from twitter_ads.enum import METRIC_GROUP
from twitter_ads.enum import GRANULARITY
import twitter_ads
import time
client = Client(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
# load the advertiser account instance
account = client.accounts(ACCOUNT_ID)
cids = list(map(lambda x: x.id.encode('utf-8'), account.campaigns()))
campaigns = list(map(lambda x: [x.id.encode('utf-8'),x.name.encode('utf-8'), int(x.id,36)] , account.campaigns()))
resource = '/2/stats/accounts/{account_id}/'.format(account_id=account.id)
spend=[]
for c in campaigns:
for p in ['ALL_ON_TWITTER', 'PUBLISHER_NETWORK']:
params = { 'entity':'CAMPAIGN',
'entity_ids':c[0], #cids,
'start_time': target_date,
'end_time':target_date+timedelta(1),
'granularity':'DAY',
'metric_groups': ['BILLING','ENGAGEMENT'],
'placement': p
}
# try, build and execute the request with error handling
try:
req =Request(client, 'get', resource, params=params)
response = req.perform()
val = response.body['data']
val.append(p)
val.append(c[0])
val.append(c[1])
val.append(c[2])
spend.append(val)
except Error as e:
# see twitter_ads.error for more details
print e.details
raise
ddd= json.loads(json.dumps(spend))
with open(target_path+row['account_id']+'_campaign_spend.csv', "w") as output:
writer = csv.writer(output, lineterminator='\n')
writer.writerow(['time_id','campaign_id_36', 'campaign_id','campaign_desc','placement','spend_micro', 'account_id'])
for val in ddd:
if (val[0]["id_data"][0]["metrics"]['billed_charge_local_micro'] and val[0]["id_data"][0]["metrics"]['billed_charge_local_micro'][0]):
writer.writerow([str(target_date).replace("/","-"),val[2],val[4],val[3],val[1], val[0]["id_data"][0]["metrics"]['billed_charge_local_micro'][0], ACCOUNT_ID])
答案 1 :(得分:0)
我将您最初写的大部分内容用于我自己最近的要求。这是我想出的:
from twitter_ads.client import Client
from twitter_ads.enum import ENTITY, GRANULARITY, METRIC_GROUP, PLACEMENT
from twitter_ads.http import Request
from twitter_ads.error import Error
from datetime import date, timedelta
CONSUMER_KEY = "CONSUMER_KEY"
CONSUMER_SECRET = "CONSUMER_SECRET"
ACCESS_TOKEN = "ACCESS_TOKEN"
ACCESS_TOKEN_SECRET = "ACCESS_TOKEN_SECRET"
ACCOUNT_ID = "ACCOUNT_ID"
client = Client(consumer_key=CONSUMER_KEY,
consumer_secret=CONSUMER_SECRET,
access_token=ACCESS_TOKEN,
access_token_secret=ACCESS_TOKEN_SECRET)
# For yesterday's total spend - for other date ranges you'll naturally need to
# update these two variables
time_offset = "T00:00:00-04:00"
yesterday = (date.today() - timedelta(1)).strftime("%Y-%m-%d") + time_offset
today = str(date.today()) + time_offset
# Could be done in a campaign loop as well ...
# account = client.accounts(id=ACCOUNT_ID)
# for camp in account.campaigns():
# print(str(camp.id) + ": " + camp.name)
resource = f"/7/stats/accounts/{ACCOUNT_ID}/"
params = {
"entity": ENTITY.CAMPAIGN,
"entity_ids": "CAMPAIGN ID HERE",
"start_time": yesterday,
"end_time": today,
"granularity": GRANULARITY.TOTAL,
"metric_groups": METRIC_GROUP.BILLING,
"placement": PLACEMENT.ALL_ON_TWITTER
}
try:
req = Request(client=client,
method="GET",
resource=resource,
params=params)
response = req.perform()
# Total spend in "micros"; for USD, $37.50 is represented as 37500000
spend_in_micros = response.body["data"][0]["id_data"][0]["metrics"]["billed_charge_local_micro"][0]
spend = round((spend_in_micros / 1000000), 2)
print(spend)
except Error as e:
print(e.details)
raise
答案 2 :(得分:0)
免责声明:我是 pywindsorai 的贡献者。
假设您只需要点击(或支出)数据,您也可以使用 windsor.ai 来完成此操作,使用起来更简单一些。您只需将您的 Twitter 帐户连接到 windsor.ai,然后使用他们的 Python SDK (pywindsorai) 将数据加载到 Pandas 中。
import pandas as pd
from pywindsorai.client import Client
from pywindsorai.enums import LAST_7D
from pywindsorai.enums import FIELD_SOURCE, FIELD_CAMPAIGN, FIELD_CLICKS
api_key = 'xxx' # Get this from your windsor.ai account
client = Client(api_key)
campaign_clicks = client.connectors(date_preset=LAST_7D, fields=[FIELD_SOURCE, FIELD_CAMPAIGN, FIELD_CLICKS])
df = pd.DataFrame(campaign_clicks['data'])