2015-10-29 31 views
0

我是Python新手,试图编写脚本来控制Facebook营销API中的广告系列预算。你并不需要知道Facebook营销平台能够帮助我,因为这主要是一个Python相关的问题,因为我是Python新手,不知道如何去编写代码。Python以JSON格式存储Facebook广告集并创建计时器

#==========specify account ID in which the campaign you want to budget control resides========================= 
AD_ACCOUNT_ID = 'act_4534633563' 
#=============================================================================== 

campaign = Campaign(34635645764574) 
fields = [ 
    AdSet.Field.name, 
    AdSet.Field.lifetime_budget, 
] 
adsets = campaign.get_ad_sets(fields=fields) 

with open('data.json', 'w') as f: 
    for adset in adsets: 
     print(adset[AdSet.Field.name]) 
     json.dump(adset, f) 

结果:

Traceback (most recent call last): 
    File "C:\Python27\Scripts\JSonTest1.py", line 50, in <module> 
    json.dump(adset, f) 
    File "C:\Python27\Lib\json\__init__.py", line 189, in dump 
    for chunk in iterable: 
    File "C:\Python27\Lib\json\encoder.py", line 442, in _iterencode 
    o = _default(o) 
    File "C:\Python27\Lib\json\encoder.py", line 184, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: <AdSet> { 
    "id": "534534533454353", 
    "lifetime_budget": "50000", 
    "name": "US, CA, BR, PL, CN, IN, PK, SA, DE, AR, VE, JP, EG - 14+ - Copy" 
} is not JSON serializable 

这个脚本应该通过在一天的开始存储某个广告活动的广告台ID和终身预算成JSON,让广告系列一级预算控制。然后,此脚本应每六个小时轮询一次预算,以便在一天的开始时间内(每天早上在JSON文件内存储)减去当前生命周期(实时数据值)预算。如果所有广告组的生命周期的累计预算达到当天的用户指定广告系列预算,则广告系列会暂停一天,然后在第二天重新启动。

我有一对夫妇在这里问题.....

  1. 如何克服这个问题,JSON在那里说:我想存储的数据不是序列化?

  2. 如何存储/读取JSON对象,以便可以减去终身预算?

  3. 我可以在Python中做些什么,以便脚本每天运行并运行一整天,然后在一天结束时关闭。

回答

0

您不能序列化自定义的对象。相反,你可以创建你所需要的值的Python字典,然后序列化:

for adset in adsets: 
    print(adset[AdSet.Field.name]) 
    adset_json = {'name': adset[AdSet.Field.name], 
        'budget': adset[AdSet.Field.lifetime_budget]} 
    json.dump(adset_json, f) 

存储和使用JSON读取很简单:那样json.dump()和json.load()

对于运行脚本每天我会推荐使用Linux机器(或虚拟机)并设置Cron作业(Cron用于在Linux中安排任务)。我相信有一种等效的方法可以在Windows中做到这一点,但我不知道如何。

1

sdk使用自己的字典值作为对象。使用python的内置函数,转换为str。另外,你真的不需要使用Json转储,你可以将str转换为csv,然后转换为pandas df。

me = objects.AdUser(fbid='me') 
    my_accounts = (me.get_ad_accounts()) 
` my_account = my_accounts[0] 
    a = str(my_account) 
相关问题