使用Python通过Facebook广告API批量创建广告系列?

时间:2018-01-09 20:16:19

标签: python python-3.x facebook-ads-api facebook-marketing-api

我正在尝试构建一个API工具,一次创建100多个广告系列,但到目前为止,我一直遇到超时错误。我有一种感觉,因为我不是作为批处理/异步请求执行此操作,但我似乎无法找到专门用于在Python中批量创建活动的简单指令。任何帮助都会非常感激!

我已准备好所有广告系列详细信息并准备进入Google工作表,然后我的脚本会读取(使用pygsheets)并尝试创建广告系列。以下是目前的情况:

from facebookads.adobjects.campaign import Campaign
from facebookads.adobjects.adaccount import AdAccount
from facebookads.api import FacebookAdsApi
from facebookads.exceptions import FacebookRequestError
import time
import pygsheets

FacebookAdsApi.init(access_token=xxx)
gc = pygsheets.authorize(service_file='xxx/client_secret.json')

sheet = gc.open('Campaign Prep')
tab1 = sheet.worksheet_by_title('Input')
tab2 = sheet.worksheet_by_title('Output')
# gets range size, offsetting it by 1 to account for the range starting on row 2
row_range = len(tab1.get_values('A1', 'A', returnas='matrix', majdim='ROWS', include_empty=False))+1
# finds first empty row in the output sheet
start_row = len(tab2.get_values('A1', 'A', returnas='matrix', majdim='ROWS', include_empty=False))

def create_campaigns(row):
    campaign = Campaign(parent_id=row[6])
    campaign.update({
        Campaign.Field.name: row[7],
        Campaign.Field.objective: row[9],
        Campaign.Field.buying_type: row[10],
        })
    c = campaign.remote_create(params={'status': Campaign.Status.active})
    camp_name = c['name']
    camp_id = 'cg:'+c['id']
    return camp_name, camp_id

r = start_row
# there's a header so I have the range starting at 2
for x in range(2, int(row_range)):
        r += 1
        row = tab1.get_row(x)
        camp_name, camp_id = create_campaigns(row)
        # pastes the generated campaign ID, campaign name and account id back into the sheet
        tab2.update_cells('A'+str(r)+':C'+str(r).format(r),[[camp_id, camp_name, row[6].rsplit('_',1)[1]]])

我已尝试将其置于try循环中,如果遇到FacebookRequestError,它会执行time.sleep(5)然后继续尝试,但我仍然会遇到超时错误,每5到10行循环一次。当它没有超时它确实有效,我想我只需要想办法让它更有效地处理大批量的活动。

有什么想法?我是Facebook API的新手,我仍然是Python的新手,但我发现这些东西非常有趣!如果有人对这个脚本如何更好(以及一般的Python建议)有任何建议,我很乐意听到它! :)

1 个答案:

答案 0 :(得分:0)

您可以发布实际的错误消息吗?

听起来你所描述的是你在拨打一定数量的电话后达到了速率限制。如果是这样的话,time.sleep(5)就不够了。费率分数会随着时间的推移而衰减,并会在5分钟后重置https://developers.facebook.com/docs/marketing-api/api-rate-limiting。在这种情况下,我建议在每次通话之间休息。但是,更好的选择是升级您的API状态。如果您快速达到速率限制,我假设您处于开发人员级别。首先尝试升级到Basic,然后再升级到标准版,您不应该遇到这些问题。 https://developers.facebook.com/docs/marketing-api/access

另外,正如您所提到的,利用Facebook的批量请求API可能是一个好主意。 https://developers.facebook.com/docs/marketing-api/asyncrequests/v2.11

这是一个包含使用Python SDK的Batch API示例的线程:https://github.com/facebook/facebook-python-ads-sdk/issues/116

相关问题