Beispiel #1
0
def test_campaign_upload(campaign_data, account):
    """
    Args:
        campaign_data (dict): parameters parsed from Json
        account (str): Account where to upload the campaing

    Returns:
        TYPE: Description
    """
    # Check if we're working with the correct account
    active_account = AdAccount(account)
    active_account.remote_read(fields=[AdAccount.Field.name])

    print('Uploading a campaign to %s' % active_account[AdAccount.Field.name])

    confirm = input('Do you want to continue? Y/N  --> ')
    if confirm not in ('y', 'Y'):
        print('Aborted campaign upload')
        return

    print("\nRunning validations...")
    # Initial validations
    validate(campaign_data)

    print("\nUploading campaign...")
    # Get existing or create a new campaign
    campaign_id = create_campaign(campaign_data, account)
    print('Campaign uploaded!')
    # Create Ad set
    print("\nUploading AdSet...")
    create_ad_set(campaign_data, account, campaign_id)
    print('Ad set uploaded!')
def reach_esitmate():
    cities = get_cities("Bangalore")
    targeting_spec_city = []
    for city in cities:
        targeting_spec_city.append(
            {
                'key': city._data['key'],
                'radius': 12,
                'distance_unit': 'mile'
            }
        )

    account = AdAccount('act_259842962')
    targeting_spec = {
        'geo_locations': {
            'cities': targeting_spec_city
        },
        'age_min': 20,
        'age_max': 40,
        'custom_audiences': [6037977332713]  # custom audience id
    }
    params = {
        'optimize_for': AdSet.OptimizationGoal.offsite_conversions,
        'targeting_spec': targeting_spec,
    }
    reach_estimate = account.get_reach_estimate(params=params)
    print(reach_estimate)
    return reach_estimate
Beispiel #3
0
    def get_report(self, fields, params, file_dir):
        """
            Uses asynchronous calls to avoid time out. Pins every 15 seconds to check status. Once done, pull 
            the data, and dump data into a local file
            :param fields: all valid fields we can retrieve from an Ad account
            :param params: specifies report level, report dates, breakdowns, filters
            :param file_dir: specifies the downloading location
            :return: None
        """
        with gzip.open(file_dir, 'wb') as outfile:
            for account_id in self.account_ids:
                account = AdAccount('act_' + account_id)

                async_job = account.get_insights(fields=fields,
                                                 params=params,
                                                 async=True)
                async_job.remote_read()
                while async_job[
                        AdReportRun.Field.async_status] != 'Job Completed':
                    time.sleep(5)
                    async_job.remote_read()
                time.sleep(1)

                for result in async_job.get_result():
                    json.dump(result.export_all_data(), outfile)
                    outfile.write('\n')
        outfile.close()
    def get_ads_insight(self, report_date,account_id):

        ad_account = AdAccount(fbid=account_id)
        limit = 5000
        fields = ['campaign_name',
                'ad_id',
                'reach',
                'date_start',
                'date_stop',
                'impressions',
                'actions',
                'ctr',
                'clicks',
                'objective',
                'spend'
            ]
        params = {
            'time_range': {
                'since': report_date,
                'until': report_date
            },
#            'date_preset':'last_7d',
            'action_attribution_windows': ['28d_click','28d_view'],
            'breakdowns': ['gender', 'age'],
            'time_increment':'1',             
            'level': 'ad',
            'limit': limit if limit > 0 else None
        }
        insights = ad_account.get_insights(fields, params)
        return insights
 def get_account_business_info(self, account_id):
     account = AdAccount('act_%s' % str(account_id))
     account.remote_read(fields=[AdAccount.Field.business])
     business_info = account[AdAccount.Field.business]
     if business_info:
         return business_info
     return {}
 def get_account_info(self, account_id):
     account = AdAccount('act_%s' % str(account_id))
     account.remote_read(fields=[
         AdAccount.Field.id, AdAccount.Field.name,
         AdAccount.Field.account_status
     ])
     if account: return account
     return {}
 def get_campaigns_info_by_account(self, account_id):
     account = AdAccount('act_%s' % str(account_id))
     campaigns = account.get_campaigns(fields=[
         Campaign.Field.id, Campaign.Field.name, Campaign.Field.objective,
         Campaign.Field.status, Campaign.Field.updated_time
     ])
     if campaigns: return campaigns
     return {}
Beispiel #8
0
def get_campaigns(account_id):
    fields = ["id", "name"]

    def decorate(x):
        return {"value": x["id"], "name": x["name"]}

    account = AdAccount(account_id)
    return [decorate(x) for x in account.get_campaigns(fields)]
Beispiel #9
0
    def get_ads_insight(self, account_id, from_time, to_time):
        """sample_response:: <api.Cursor> [
            <AdsInsights> {
                "ad_name": "Ad name here",
                "adset_name": "Sample name",
                "campaign_id": "123456789",
                "campaign_name": "Campaign Test name",
                "cost_per_unique_click": "0.727143",
                "cpc": "0.727143",
                "ctr": "1.62037",
                "date_start": "2019-12-10",
                "date_stop": "2019-12-10",
                "spend": "5.09",
                "clicks": "7",
                "unique_clicks": "7"
            },
        ]"""
        params = self.build_params(from_time, to_time)
        the_ad_account = AdAccount(account_id)
        try:
            async_job = the_ad_account.get_insights_async(fields=self.fields,
                                                          params=params)
            status = async_job.remote_read()
            while status['async_percent_completion'] < 100:
                time.sleep(1)
                status = async_job.remote_read()
            result = async_job.get_result()

            insight_data_list = []
            for item_ad_insight in result._queue:
                temp_dict = {}
                for _key in self.fields:
                    try:
                        temp_dict.update({
                            _key:
                            item_ad_insight.__getitem__(_key),
                        })
                    except KeyError:
                        temp_dict.update({
                            _key: '',
                        })
                if temp_dict:
                    insight_data_list.append(temp_dict)
            for k in self.required_merged_field_list:
                self.final_data.update(
                    {k: self.add_value_by_key(k, insight_data_list)})
            if len(insight_data_list) > 0:
                remaining_fields_set = set(self.fields) ^ set(
                    self.required_merged_field_list)
                for f in remaining_fields_set:
                    # remaining fields has same value of all items of the list. That's why only first item is considered
                    self.final_data.update(
                        {f: insight_data_list[0].get(f, '')})
        except FacebookRequestError:
            pass
            # print(er)
        return self.final_data
Beispiel #10
0
def create_campaign(account_id, name, objective, status):
    account = AdAccount(account_id)

    campaign = Campaign(parent_id=account.get_id_assured())
    campaign[Campaign.Field.name] = name
    campaign[Campaign.Field.objective] = objective
    campaign[Campaign.Field.configured_status] = status

    print(campaign.remote_create())
    def get_adset_info_by_account(self, account_id):
        account = AdAccount('act_%s' % str(account_id))
        adsets = account.get_ad_sets(fields=[
            AdSet.Field.id, AdSet.Field.name, AdSet.Field.campaign_id,
            AdSet.Field.status
        ])

        if adsets: return adsets
        return {}
def adset_comment_fetcher(account, params, fields):
    """
    fetches ad ids and corresponding adset name from active campaigns for the selected ad account
    """
    account = AdAccount(account)

    adset_insights = account.get_insights(fields=fields, params=params)
    for insight in adset_insights:
        adset_name_ad_id[insight['adset_name']] = insight['ad_id']
    return adset_name_ad_id
Beispiel #13
0
    def getfacebookApi(self):
        if self.secret != '-':
            self.api = FacebookAdsApi.init(access_token=self.token,
                                           app_secret=self.secret,
                                           api_version='v3.2')
        else:
            self.api = FacebookAdsApi.init(access_token=self.token,
                                           api_version='v3.2')

        self.account = AdAccount('act_' + act_id)
Beispiel #14
0
def facebook_data_extraction(config):
    '''
    Facebook Ads platform data extraction
    '''
    facebook_get_service(config)
    me = User(fbid='me')
    print('me', me)
    print('me.remote_read(fields=[User.Field.permissions])', me.remote_read())
    ad_account = AdAccount(config['ad_account_id'])
    print('ad_account', ad_account.remote_read())
    print('ad_account', ad_account.get_campaigns())
    return ''
 def get_account_category(self, account_id):
     account_category_dict = {"category": "unknow", "subcategory": "unknow"}
     account = AdAccount('act_%s' % str(account_id))
     application = account.get_applications(
         fields=["category", "subcategory"])
     if application:
         if "category" in application[0].keys():
             account_category_dict["category"] = application[0]["category"]
         if "subcategory" in application[0].keys():
             account_category_dict["subcategory"] = application[0][
                 "subcategory"]
     return account_category_dict
    def match_custom_audience(self, **kwargs):
        fb_api_init()
        out = []
        words = [x.lower() for x in kwargs['words']]
        account = AdAccount(kwargs['account_id'])
        ca = account.get_custom_audiences(fields=[CustomAudience.Field.name])

        for audience in ca:
            if any(word in [x.lower() for x in audience['name'].split(' ')]
                   for word in words):
                out.append(audience)

        return out
def ad_ids_fetcher(account, params, fields):
    """
    fetches ad ids from active campaigns for the selected ad account

    """
    account = AdAccount(account)
    try:
        adset_insights = account.get_insights(fields=fields, params=params)
    except Exception:
        exception_catcher('/facebook_ads_comments_analyzer/')

    ad_ids_list = [insight['ad_id'] for insight in adset_insights]

    return ad_ids_list
 def ads(self, report_date, account_id):
     ad_account = AdAccount(fbid=account_id)
     limit = 5000
     fields = ['id', 'creative', Ad.Field.name]
     params = {
         'time_range': {
             'since': report_date,
             'until': report_date
         },
         #        'date_preset':'last_90d',
         'limit': limit if limit > 0 else None
     }
     insights = ad_account.get_ads(fields, params)
     return insights
 def get_creatives(self, report_date, account_id):
     ad_account = AdAccount(fbid=account_id)
     limit = 500
     fields = [AdCreative.Field.thumbnail_url]
     params = {
         'time_range': {
             'since': report_date,
             'until': report_date
         },
         #        'date_preset':'last_90d',
         'limit': limit if limit > 0 else None
     }
     insights = ad_account.get_ad_creatives(fields, params)
     return insights
Beispiel #20
0
def get_fb_data(AccountId):
    FacebookAdsApi.init(facebookConfig.Configs['App_id'],
                        facebookConfig.Configs['App_secret'],
                        facebookConfig.Configs['Access_token'])

    my_account = AdAccount(facebookConfig.Accounts[AccountId])

    # Grab insight info for all ads in the adaccount

    #Ever this function will get data from yesterday
    #If somebody wants to change the range of date, is necessary to change the param 'date_preset'
    #You can change the level of your request. example: ad, adset or campaign
    '''
    I dont recommend change the param date_preset because the data comes cumulative, not good for me.
    The data from yesterday is better and trustworthy . I suggest to compare with reports from your Business manager facebook
    '''
    data = my_account.get_insights(
        params={
            'date_preset': 'yesterday',
            'level': 'ad'
        },
        fields=[
            AdsInsights.Field.account_id,
            AdsInsights.Field.account_name,
            #AdsInsights.Field.campaign_id,
            AdsInsights.Field.campaign_name,
            AdsInsights.Field.ad_name,
            AdsInsights.Field.ad_id,
            AdsInsights.Field.adset_id,
            AdsInsights.Field.adset_name,
            AdsInsights.Field.cost_per_outbound_click,
            AdsInsights.Field.outbound_clicks,
            AdsInsights.Field.spend,
            AdsInsights.Field.clicks,
            AdsInsights.Field.inline_link_clicks,
            AdsInsights.Field.inline_link_click_ctr,
            AdsInsights.Field.cpm,
            AdsInsights.Field.ctr,
            AdsInsights.Field.reach,
            AdsInsights.Field.frequency,
            AdsInsights.Field.impressions
        ])

    dataNormalize = normalize.dumps_data(data)

    df = normalize.change_types(dataNormalize)

    return df
Beispiel #21
0
def create_video(request):
    FacebookAdsApi.init(account_id=settings.FACEBOOK_MAIN_AD_ACCOUNT,
                        access_token=settings.FACEBOOK_TEST_TOKEN)
    ad_video = AdAccount(
        fbid=settings.FACEBOOK_MAIN_AD_ACCOUNT
    ).create_ad_video(
        params={
            AdVideo.Field.slideshow_spec: {
                'images_urls': [
                    'https://www.downtownrochestermn.com/_files/images/sbs15tkssblue[1].png',
                    'http://d3sdoylwcs36el.cloudfront.net/VEN-virtual-enterprise-network-business-opportunities-small-fish_id799929_size485.jpg',
                    'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQmvDxaUoi9wsAm2H0qvdaCn8ISnkqOPSBDojx7WznZLoAMhvW_mjI7Pw'
                ]
            }
        })
    return JsonResponse(ad_video.export_all_data(), safe=False)
Beispiel #22
0
def getvalues():
    tmp_string = str(AdAccount(ad_account_id).get_insights(
        fields=fields,
        params=params,
    )).split('<AdsInsights>')
    tmp_string = str(tmp_string)[7:][:-3]

    i = 2
    list_of_jsons = str(tmp_string).split(', \'')
    for json1 in list_of_jsons:
        json1 = json1.replace('\\n    ', '')
        json1 = json1.replace('\\n', '')
        try:
            j = json.loads(json1)
            cn = j['campaign_name']
            sp = j['spend']
            print cn
            print type(cn)
            cost = Decimal(sp) * Parser.q
            print cost
            sheet.update_acell('B1', month)
            if modified_list.find(cn) != -1:
                print ("String in the string!")
            else:
                sheet.update_acell('A' + str(i), cn)

            sheet.update_acell('B' + str(i), cost)

            i += 1
        except ValueError:
            'stupid error, everything works'
Beispiel #23
0
def get_campaign_data(ad_account: adaccount.AdAccount) -> {}:
    """Retrieves the campaign data of the ad account as a dictionary

    Args:
        ad_account: An ad account for which to retrieve the campaign data

    Returns:
        A dictionary with {campaign_id: {'name': 1, 'attributes': {}}} format

    """
    logging.info('get campaign data for account {}'.format(ad_account['account_id']))
    campaigns = ad_account.get_campaigns(
        fields=['id',
                'name',
                'adlabels'],
        params={'limit': 1000,
                'status': ['ACTIVE',
                           'PAUSED',
                           'ARCHIVED']})
    result = {}

    for campaign in campaigns:
        result[campaign['id']] = {'name': campaign['name'],
                                  'attributes': parse_labels(
                                      campaign.get('adlabels', []))}
    return result
Beispiel #24
0
def read_campaign():
    # account = AdAccount(ACCOUNT)
    account = AdAccount.get_my_account() # > First account associated with the user    
    print(account)
    adsets = account.get_ad_sets(fields=[AdSet.Field.targeting, AdSet.Field.name])
    account.remote_read(fields=[AdAccount.Field.name])
    print(adsets)
Beispiel #25
0
 def __init__(self, account_id):
     prefs = Preferences.objects.get()
     ad_account_id = 'act_%s' % account_id
     FacebookAdsApi.init(access_token=prefs.facebook_access_token)
     fields = [
         'account_id',
         'account_name',
         'cost_per_total_action',
         'impressions',
         'total_action_value',
         'spend',
     ]
     now = timezone.now()
     last_day = calendar.monthrange(now.year, now.month)[1]
     params = {
         'time_range': {
             'since': now.strftime('%Y-%m-01'),
             'until': now.strftime('%Y-%m-') + '%s' % last_day
         },
         'filtering': [],
         'level': 'account',
         'breakdowns': [],
     }
     try:
         self.data = AdAccount(ad_account_id).get_insights(fields=fields,
                                                           params=params)[0]
     except:
         self.data = None
    def get_ad_accounts(self, business_id):
        """Returns list of adaccounts associated with the ads pixel"""
        response = self.get_api_assured().call(
            'GET',
            (self.get_id_assured(), 'shared_accounts'),
            params={'business': business_id},
        ).json()

        ret_val = []
        if response:
            keys = response['data']
            for item in keys:
                search_obj = AdAccount()
                search_obj.update(item)
                ret_val.append(search_obj)
        return ret_val
Beispiel #27
0
def get_campaign_list(account_id):
    try:
        ad_account = AdAccount(account_id)
        campaigns = ad_account.get_campaigns(fields=[
            Campaign.Field.name, Campaign.Field.id, Campaign.Field.status
        ])
        active_campaign_hash = {}
        for campaign in campaigns:
            if 'ACTIVE' in campaign[Campaign.Field.status]:
                active_campaign_hash[campaign[Campaign.Field.id]] = campaign[
                    Campaign.Field.name]
        logger.info(active_campaign_hash)
        return active_campaign_hash

    except exceptions.FacebookError, e:
        logger.error('Error %s' % e)
        return {}
    def get_ad_accounts(self, business_id):
        """Returns list of adaccounts associated with the ads pixel"""
        response = self.get_api_assured().call(
            'GET',
            (self.get_id_assured(), 'shared_accounts'),
            params={
                'business': business_id
            },
        ).json()

        ret_val = []
        if response:
            keys = response['data']
            for item in keys:
                search_obj = AdAccount()
                search_obj.update(item)
                ret_val.append(search_obj)
        return ret_val
 def api_create(self,
                parent_id,
                fields=None,
                params=None,
                batch=None,
                pending=False):
     from facebookads.adobjects.adaccount import AdAccount
     return AdAccount(api=self._api, fbid=parent_id).get_insights_async(
         fields, params, batch, pending)
 def api_create(self,
                parent_id,
                fields=None,
                params=None,
                batch=None,
                pending=False):
     from facebookads.adobjects.adaccount import AdAccount
     return AdAccount(api=self._api, fbid=parent_id).create_custom_audience(
         fields, params, batch, pending)
 def api_create(self,
                parent_id,
                fields=None,
                params=None,
                batch=None,
                pending=False):
     from facebookads.adobjects.adaccount import AdAccount
     return AdAccount(api=self._api,
                      fbid=parent_id).create_reach_frequency_prediction(
                          fields, params, batch, pending)
Beispiel #32
0
 def get_prospecting_campaign_id(self, acc_id):
     """Takes in an account id and searches across the ad accounts campaigns looking for the campaign name Prospecting. If found, return the campaign id."""
     account = AdAccount(acc_id).get_campaigns()
     for camp in account:
         campaign =  Campaign(camp['id'])
         campaign.remote_read(fields=[
             Campaign.Field.name,
         ])
         if campaign['name'] == 'Prospecting':
             return camp['id']
 def remote_read(
     self,
     batch=None,
     failure=None,
     fields=None,
     params=None,
     success=None,
     api_version=None,
 ):
     if self[self.__class__.Field.id]:
         _, image_hash = self[self.__class__.Field.id].split(':')
         account = AdAccount(fbid=self.get_parent_id_assured())
         params = {
             'hashes': [
                 image_hash,
             ],
         }
         images = account.get_ad_images(fields=fields, params=params)
         if images:
             self._set_data(images[0]._data)
def get_customer_audicence():
    account = AdAccount('act_259842962')
    resp = account.get_custom_audiences(fields=["name"])
    print(resp)
    return resp
  params=params,
)
print 'adaccounts', adaccounts
adaccount_id = adaccounts[0].get_id()
print 'adaccount_id:', adaccount_id, '\n'

# AdCampaign create
fields = [
]
params = {
  'name': 'My campaign',
  'objective': 'LINK_CLICKS',
  'status': 'PAUSED',
}
adcampaign = AdAccount(adaccount_id).create_campaign(
  fields=fields,
  params=params,
)
print 'adcampaign', adcampaign
adcampaign_id = adcampaign.get_id()
print 'adcampaign_id:', adcampaign_id, '\n'

# AdSet create
fields = [
]
params = {
  'name': 'My Reach Ad Set',
  'optimization_goal': 'REACH',
  'billing_event': 'IMPRESSIONS',
  'bid_amount': '2',
  'daily_budget': '1000',
  'campaign_id': adcampaign_id,