Ejemplo n.º 1
0
def view_ad(request):
    FacebookAdsApi.init(access_token=access_token,
                        app_id=app_id,
                        app_secret=app_secret)
    my_account = AdAccount('act_' + user_id)
    adsets = my_account.get_ad_sets()
    adset_id = []
    for i in range(len(adsets)):
        adset_id.append(adsets[i]["id"])

    for adset in adset_id:
        ad_set = AdSet(adset)
        fields = [
            Ad.Field.name,
            Ad.Field.id,
        ]
        ad_iter = ad_set.get_ads(fields=fields)
    ad_data = []
    for ad in ad_iter:
        result = {}
        result["id"] = ad[Ad.Field.id]
        result["name"] = ad[Ad.Field.name]
        ad_data.append(result)
    context = {'ads': ad_data}

    return render(request, 'fbapp/view_ad.html', context)
Ejemplo n.º 2
0
 def create_ad_set(self, accountid, name, dailybudget, campaignid,
                   optimization_goal, billing_event, bid_amount, targeting,
                   appinfo):
     """
     Step 3: create an ad set in campaign we just created. See
     [Ad Set](https://developers.facebook.com/docs/marketing-api/adset)
     for further details on the API used here.
     """
     pdata = {
         AdSet.Field.name: name,
         AdSet.Field.optimization_goal: optimization_goal,
         AdSet.Field.billing_event: billing_event,
         AdSet.Field.bid_amount: bid_amount,
         AdSet.Field.daily_budget: dailybudget,
         AdSet.Field.campaign_id: campaignid,
         AdSet.Field.promoted_object: {
             'application_id': appinfo['fbapplication_id'],
             'object_store_url': appinfo['appstore_link']
         },
         AdSet.Field.targeting: targeting,
     }
     pdata['status'] = AdSet.Status.paused
     adset = AdSet(parent_id=accountid)
     adset.remote_create(params=pdata)
     return adset[AdSet.Field.id]
Ejemplo n.º 3
0
def create_adset(request, camid):
    FacebookAdsApi.init(access_token=access_token,
                        app_id=app_id,
                        app_secret=app_secret)

    my_account = AdAccount('act_' + user_id)

    adset = AdSet(parent_id=my_account.get_id_assured())
    adset[AdSet.Field.name] = 'Ad Set created by afnan -' + str(
        random.randint(1, 10))
    adset[AdSet.Field.promoted_object] = {
        'application_id': app_id,
    }
    adset[AdSet.Field.campaign_id] = camid
    adset[AdSet.Field.daily_budget] = 10000
    adset[AdSet.Field.billing_event] = AdSet.BillingEvent.impressions
    adset[AdSet.Field.bid_amount] = 2
    adset[AdSet.Field.status] = 'PAUSED'
    adset[AdSet.Field.targeting] = {
        Targeting.Field.geo_locations: {
            'countries': ['US'],
        },
        Targeting.Field.publisher_platforms: ['facebook', 'audience_network'],
        Targeting.Field.device_platforms: ['mobile'],
        Targeting.Field.user_os: [
            'IOS',
        ],
    }

    adset.remote_create()

    result = {"id": adset.get_id()}

    return redirect('view-adset')
def connect_audience(campaign_id, audience_id, device_cat):
    adset = AdSet(fbid=audience_id, parent_id=f'act_{ad_account}')
    params = {
        AdSet.Field.name: 'A CPV Ad Set',
        AdSet.Field.campaign_id: campaign_id,
        AdSet.Field.daily_budget: 500,
        AdSet.Field.start_time: int(time.time()),
        AdSet.Field.end_time: int(time.time() + 100000),
        AdSet.Field.optimization_goal: AdSet.OptimizationGoal.video_views,
        AdSet.Field.billing_event: AdSet.BillingEvent.video_views,
        AdSet.Field.bid_amount: 100,
        AdSet.Field.targeting: {
            "geo_locations": {
                "countries": ["Ukraine"],
            },
            "age_min": 18,
            "age_max": 65,
            "custom_audiences": [{
                "id": audience_id
            }]
        },
        Targeting.Field.device_platforms: [device_cat],
    }
    adset.update(params=params)
    return adset
Ejemplo n.º 5
0
def view_adset(request):
    FacebookAdsApi.init(access_token=access_token,
                        app_id=app_id,
                        app_secret=app_secret)

    my_account = AdAccount('act_' + user_id)

    adsets = my_account.get_ad_sets()
    adset_id = []
    for i in range(len(adsets)):
        adset_id.append(adsets[i]["id"])

    adset_data = []
    for id in adset_id:
        adset = AdSet(fbid=id)
        fields = [
            AdSet.Field.name,
            AdSet.Field.effective_status,
            AdSet.Field.campaign_id,
            AdSet.Field.status,
        ]
        adset.remote_read(fields=fields)

        result = {}
        result["id"] = id
        result["name"] = adset[AdSet.Field.name]
        result["campid"] = adset[AdSet.Field.campaign_id]
        result["status"] = adset[AdSet.Field.status]
        result["data_1"] = "ACTIVE"
        result["data_2"] = "PAUSED"
        adset_data.append(result)

    context = {'adsets': adset_data}

    return render(request, 'fbapp/view_adset.html', context)
    def get_insights_for_ad_set(self,
                                adset_id,
                                date_preset=Ad.DatePreset.lifetime,
                                limit=300):
        """
        retrieve performance insight for each adset.
        """

        params = {
            'date_preset':
            date_preset,
            'action_attribution_windows': [
                AdsInsights.ActionAttributionWindows.value_default,
                AdsInsights.ActionAttributionWindows.value_1d_click,
                AdsInsights.ActionAttributionWindows.value_7d_click
            ],
            'level':
            AdsInsights.Level.adset,
            'limit':
            limit
        }

        adset = AdSet(adset_id)
        insights = adset.get_insights([
            AdsInsights.Field.adset_name, AdsInsights.Field.adset_id,
            AdsInsights.Field.cpc, AdsInsights.Field.cpm,
            AdsInsights.Field.ctr, AdsInsights.Field.spend,
            AdsInsights.Field.clicks, AdsInsights.Field.impressions,
            AdsInsights.Field.reach, AdsInsights.Field.actions,
            AdsInsights.Field.action_values
        ], params)
        return insights
Ejemplo n.º 7
0
def update_interest(adset_id=None, adset_params=None):
    adset = AdSet(adset_id)
    update_response = adset.update(adset_params)
    remote_update_response = adset.remote_update(params={
        'status': 'PAUSED',
    })
    return
Ejemplo n.º 8
0
    def create_ad_set(self, campaign_id, budget, targeting_query):
        today = timezone.datetime.today()
        start_time = str(today + timezone.timedelta(weeks=1))
        end_time = str(today + timezone.timedelta(weeks=2))

        targeting = self.generate_targeting_spec(targeting_query)
        # print(targeting)
        # new AdSet instance
        adset = AdSet(parent_id=AD_ACCOUNT_ID)
        adset.update({
            AdSet.Field.name: 'My New Ad Set',
            AdSet.Field.campaign_id: campaign_id,
            AdSet.Field.daily_budget: budget,
            AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
            AdSet.Field.optimization_goal: AdSet.OptimizationGoal.reach,
            AdSet.Field.bid_amount: 2,
            AdSet.Field.targeting: targeting,
            AdSet.Field.start_time: start_time,
            AdSet.Field.end_time: end_time,
        })

        result = adset.remote_create(params={
            'status': AdSet.Status.paused,
        })
        # print(result)
        return result
Ejemplo n.º 9
0
def get_ad_id_list(adset_id):
    ad_id_list = list()
    adset = AdSet(adset_id)
    ads = adset.get_ads(fields=[AdSet.Field.id])
    for ad in ads:
        ad_id_list.append(ad[Ad.Field.id])
    return ad_id_list
 def get_adset_insights(self, date_preset=None):
     adset = AdSet(self.adset_id)
     params = {
         'date_preset': date_preset,
     }
     insights = adset.get_insights(params=params,
                                   fields=list(general_insights.values()) +
                                   list(target_insights.values()))
     if bool(insights):
         spend = insights[0].get(Field.spend)
         impressions = insights[0].get(Field.impressions)
         self.adset_insights.update({Field.spend: int(spend)})
         self.adset_insights.update({Field.impressions: int(impressions)})
     try:
         insights[0].get(Field.actions)
         for act in insights[0].get(Field.actions):
             if act["action_type"] in conversion_metrics:
                 self.adset_insights.update({
                     conversion_metrics[act["action_type"]]:
                     int(act["value"])
                 })
                 self.adset_insights.update({
                     'cost_per_' + conversion_metrics[act["action_type"]]:
                     float(spend) / float(act["value"])
                 })
     except:
         pass
     finally:
         return self.adset_insights
Ejemplo n.º 11
0
 def readInsightsForAdset(self,
                          adset_id,
                          params=None,
                          fields=all_adsinsights_fields):
     # query all fields by default
     ad_set = AdSet(fbid=adset_id)
     return ad_set.get_insights(fields=fields, params=params)
Ejemplo n.º 12
0
def delete_adset(request, adid):
    FacebookAdsApi.init(access_token=access_token,
                        app_id=app_id,
                        app_secret=app_secret)

    adset = AdSet(adid)
    adset.remote_delete()

    return redirect('view-adset')
Ejemplo n.º 13
0
def update_adset(request, adsetid, status):
    FacebookAdsApi.init(access_token=access_token,
                        app_id=app_id,
                        app_secret=app_secret)

    adset = AdSet(adsetid)
    adset[AdSet.Field.status] = status
    adset.remote_update()

    return redirect('view-adset')
Ejemplo n.º 14
0
 def run_query_on_fb_adset_obj_conf(self, params, ad_object_id, level):
     adset = AdSet(ad_object_id)
     if level == LEVELS_POSSIBLE_VALUES[1]:
         val_adset = adset.api_get(fields=self.desired_fields,
                                   params=params)
         yield val_adset
     else:
         raise ClickException(
             "Adset setup is available at 'adset' level. Received level: " +
             self.level)
Ejemplo n.º 15
0
 def fetch_adset_data(self, adset_id):
     adset = AdSet(adset_id)
     adset_datas = adset.get_insights(fields=[
         AdsInsights.Field.adset_id,
         AdsInsights.Field.spend,
         AdsInsights.Field.impressions,
         AdsInsights.Field.reach,
         AdsInsights.Field.unique_actions,
         AdsInsights.Field.adset_name],
         params={
             'breakdowns':
                 ['hourly_stats_aggregated_by_audience_time_zone'],
             'time_range': self.time_range})
     return adset_datas
Ejemplo n.º 16
0
def update_ad_set_date(request):
	if request.method == 'POST':
		print('----------------------------------')
		access_token=request.headers['token']

		received_json_data = json.loads(request.body)
		endDate = received_json_data['end_time']
		startDate = received_json_data['start_time']
		print('-----------' + endDate)
		adsetId = request.GET.get('adsetId')
		app_secret = 'db4b3037cd105cfd23b6032aecd2c3ff'
		app_id = '263805807945856'
		ADSET_ID = adsetId
		FacebookAdsApi.init(access_token=access_token)
		fields = ['start_time','end_time']
		print('><><>>',fields)
		params = {
			'start_time':startDate,
			'end_time':endDate,
		}
		updateadset= AdSet(ADSET_ID).api_update(
				fields=fields,
				params=params,
				)
		print(updateadset)
		return Response(updateadset)
	else:
		return HttpResponse('not found')
Ejemplo n.º 17
0
def create_adset(c: AdsetConf) -> AdSet:
    name = f"vlab-{c.stratum.id}"  # TODO: remove vlab prefix
    targeting = {**c.stratum.facebook_targeting}

    # TODO: document this funkyness - pretends it's runnign at midnight...
    midnight = datetime.utcnow().replace(microsecond=0,
                                         second=0,
                                         minute=0,
                                         hour=0)

    adset = AdSet()
    adset[AdSet.Field.end_time] = midnight + timedelta(hours=c.hours)
    adset[AdSet.Field.targeting] = targeting
    adset[AdSet.Field.status] = c.status
    adset[AdSet.Field.daily_budget] = c.budget
    adset[AdSet.Field.name] = name
    adset[AdSet.Field.start_time] = datetime.utcnow() + timedelta(minutes=5)
    adset[AdSet.Field.campaign_id] = c.campaign["id"]
    adset[AdSet.Field.optimization_goal] = c.optimization_goal
    adset[AdSet.Field.destination_type] = c.destination_type
    adset[AdSet.Field.billing_event] = AdSet.BillingEvent.impressions
    adset[AdSet.Field.bid_strategy] = AdSet.BidStrategy.lowest_cost_without_cap

    if c.instagram_id:
        adset[AdSet.Field.instagram_actor_id] = c.instagram_id

    return adset
Ejemplo n.º 18
0
def update_ad_set_targeting(request):
	if request.method == 'POST':
		print('----------------------------------')
		access_token=request.headers['token']
		received_json_data = json.loads(request.body)
		latitude = received_json_data['lati']
		latitude = float(latitude)
		print(latitude)
		longitude = received_json_data['long']
		longitude = float(longitude)
		print(longitude)
		adsetId = request.GET.get('adsetId')
		app_secret = 'db4b3037cd105cfd23b6032aecd2c3ff'
		app_id = '263805807945856'
		ADSET_ID = adsetId
		FacebookAdsApi.init(access_token=access_token)
		fields = ['targeting']
		print(fields)
		params = {
		'targeting': {'geo_locations':{'custom_locations':[
          {
            "radius":30,
            "latitude":latitude,
            "longitude":longitude
         }]},},
		}
		updateadset= AdSet(ADSET_ID).api_update(
				fields=fields,
				params=params,
				)
		print(updateadset)
		return Response(updateadset)
	else:
		return HttpResponse('not found')
def main(argv):
    k1 = parse_argv(argv)
    start_date = k1
    print(start_date)

    ########################
    ## build output here
    ########################
    fields = [
        'campaign_id', 'impressions', 'spend', 'unique_inline_link_clicks'
    ]
    params = {
        'time_range': {
            'since': str(start_date),
            'until': str(start_date)
        },
        'breakdowns': ['country'],
        'level': 'campaign'
        #  'time_increment': 1
    }

    #api calls
    output_json = ''
    for ad in AdSet(ad_account_id).get_insights(fields=fields, params=params):
        data = str(ad).replace('<AdsInsights> ', '')
        # remove newlline in json, add after end of line
        output_json = output_json + (data.replace("\n", ' ')) + "\n"

# save response to disk
    save_to_file(output_json, start_date)
Ejemplo n.º 20
0
 def loadAdsetFromJson(self, jsonFile):
     adset = AdSet(parent_id=self.account_id)
     config_file = open(jsonFile)
     config = json.load(config_file)
     config_file.close()
     for key in config.keys():
         adset[key] = config[key]
     return adset
Ejemplo n.º 21
0
def get_delivery(ids: List[str]) -> List[Dict]:
    deliveries = []
    for id in ids:
        adset = AdSet(id[0]).api_get(fields=["learning_stage_info", "status"])
        delivery = adset.get("learning_stage_info")
        status = adset.get("status")
        if delivery:
            delivery = status if delivery.get(
                "status") == "SUCCESS" else delivery.get("status")
        else:
            delivery = status
        deliveries.append({
            "ad_id": id[1],
            "adset_id": id[0],
            "Delivery Type": delivery
        })
    return deliveries
Ejemplo n.º 22
0
def fetch_adset_data(adset_id):
    adset = AdSet(adset_id)
    adset_datas = adset.get_insights(
        fields=[
            AdsInsights.Field.adset_id, AdsInsights.Field.spend,
            AdsInsights.Field.impressions, AdsInsights.Field.reach,
            AdsInsights.Field.unique_actions, AdsInsights.Field.adset_name
        ],
        params={
            'breakdowns': ['hourly_stats_aggregated_by_audience_time_zone'],
            'time_range': {
                'since': yesterday,
                'until': today
            }
        })
    for adset_data in adset_datas:
        print(adset_data)
        result = {}
        result['spend'] = adset_data['spend'] if 'spend' in adset_data else ''
        result['impression_count'] = adset_data['impressions'] if\
            'impressions' in adset_data else ''
        result['reach_count'] = adset_data['reach'] if\
            'reach' in adset_data else ''
        result['link_click_count'] = adset_data['link_click'] if\
            'link_click_count' in adset_data else ''
        result['ad_set_id'] = adset_data['adset_id'] if\
            'adset_id' in adset_data else ''
        result['stat_dt'] = adset_data['date_start']
        print(result['stat_dt'])
        result['stat_hour'] = \
            str(int(adset_data['hourly_stats_aggregated_by_audience_time_zone'][0:2]) + 1)
        try:
            for actions in adset_data['unique_actions']:
                if actions['action_type'] == 'link_click':
                    result['link_click_count'] = actions['value']
                if actions[
                        'action_type'] == 'offsite_conversion.fb_pixel_purchase':
                    result['effective_count'] = actions['value']
        except Exception as e:
            result['effective_count'] = ''
            result['link_click_count'] = ''
        result['create_time'] =\
            datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        yield result
Ejemplo n.º 23
0
    def enable_an_on_adsets(self, adsetids):
        """
        Method that takes a list of ad set ids and enables the audience network
        placement on them. Please note that this method does not perform any
        pre-validation check to see whether the ad set passed  satisfies the
        pre-requisites to have audience network enabled.

        Args:
            adsetids: List of ad set ids on which you want audience network
            enabled. Even if you have just one id, pass it as a list.
        Returns:
            A list of 'ad set id' vs. 'status' mapping with a further 'message'
            node whenever there was a failure to update the audience network.
            Returns an empty list when an empty list or non list element is
            passed.

            status 1 is a success.
            status 0 is a failure.

            Sample response format:
            [
                {'<ad_set_id_1>': {'status': 1}},
                {'<ad_set_id_2>': {'status': 0, 'message': '<exception_msg>'}},
                ...
            ]
        """
        results = []

        # check if adsets is a list
        if type(adsetids) is not list:
            return results

        # go over the list of adset ids
        for adsetid in adsetids:
            try:
                # read ad set info
                adset = AdSet(fbid=adsetid)
                adsetobj = adset.remote_read(fields=[AdSet.Field.targeting])

                # edit targeting spec info for placements
                targetinginfo = copy.deepcopy(adsetobj[AdSet.Field.targeting])
                targetinginfo[Targeting.Field.publisher_platforms]. \
                    append('audience_network')

                # update ad set info
                adset.update({AdSet.Field.targeting: targetinginfo})
                adset.remote_update()

                # update result list along with status
                results.append({adsetid: {'status': 1}})

            except FacebookError as e:

                # update result list along with status & message
                results.append({adsetid: {'status': 0, 'message': e.message}})

        return results
Ejemplo n.º 24
0
 def createAdSet(self, name):
     print("**Creating {} Ad Set...**".format(name))
     targeting_object = {
         Targeting.Field.geo_locations: {
             'countries': ['IN'],
         }
     }
     adset = AdSet()
     adset['_parent_id'] = self.id
     adset.update({
         AdSet.Field.name: name,
         AdSet.Field.campaign_id: self.campaign_id,
         AdSet.Field.lifetime_budget: 80 * 10000,
         AdSet.Field.bid_strategy: 'LOWEST_COST_WITHOUT_CAP',
         AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
         AdSet.Field.optimization_goal: AdSet.OptimizationGoal.reach,
         AdSet.Field.targeting: targeting_object,
         AdSet.Field.start_time: '2019-02-01 00:00:00',
         AdSet.Field.end_time: '2019-02-30 23:59:00',
         AdSet.Field.status: AdSet.Status.paused,
     })
     adset.remote_create()
     self.adset_id = str(adset[AdSet.Field.id])
     print("**AdSet ID: {}**".format(self.adset_id))
     return adset
Ejemplo n.º 25
0
def make_adset(adset_params):
    account_id = adset_params[AdSet.Field.account_id]
    new_adset = AdSet(parent_id='act_{}'.format(account_id))
    new_adset.update(adset_params)
    new_adset.remote_create(params={
        'status': 'ACTIVE',
    })
    return new_adset[AdSet.Field.id]
Ejemplo n.º 26
0
    def __run_adreport(
        self,
        account_id: str,
        fields: Optional[Sequence[str]],
        params: Dict[str, Any],
    ) -> AdReportRun:
        async_job = cast(
            AdReportRun,
            AdSet(account_id).get_insights(fields=fields,
                                           params=params,
                                           is_async=True),
        )

        while True:
            job = cast(AdReportRun, async_job.api_get())

            pct: int = job["async_percent_completion"]
            status: str = job["async_status"]
            job_id = job["id"]

            if status in ["Job Skipped", "Job Failed"]:
                logger.error(
                    f"job<{job_id}>({params}): failed with status: {status}")
                return async_job

            # https://developers.facebook.com/docs/marketing-api/insights/best-practices/#asynchronous
            # both fields need to be set to signify completion
            if status == "Job Completed" and pct == 100:
                job_start_time = datetime.fromtimestamp(job["time_ref"])
                job_completion_time = datetime.fromtimestamp(
                    job["time_completed"])
                duration = job_completion_time - job_start_time

                logger.info(f"job<{job_id}>: finished in {duration.seconds}s")

                return async_job

            # "Job Completed" does not mean that the job is done, which mweans that getting here=e
            # implies that status == "Job Completed" and pct < 100
            if status in [
                    "Job Not Started",
                    "Job Started",
                    "Job Running",
                    "Job Completed",
            ]:
                logger.info(f"job<{job_id}>: {status}")

                time.sleep(2)
                continue
Ejemplo n.º 27
0
def update_adset(source: AdSet, adset: AdSet) -> List[Instruction]:
    fields = [
        AdSet.Field.end_time,
        AdSet.Field.targeting,
        AdSet.Field.status,
        AdSet.Field.daily_budget,
        AdSet.Field.optimization_goal,
    ]

    if _eq(source, adset, fields):
        return []

    dat = adset.export_all_data()
    params = {f: dat[f] for f in fields}
    return [Instruction("adset", "update", params, source["id"])]
Ejemplo n.º 28
0
 def adset_status_update(self, adset_id):
     try:
         adset = AdSet(fbid=adset_id)
         adset.update({
             AdSet.Field.status: AdSet.Status.active,
         })
         adset.remote_update()
         print("Successfully AdSet updated!")
     except Exception as e:
         print(e)
    def test_get_ad_set_with_wrong_fields(self):
        with warnings.catch_warnings(record=True) as warning:
            self.mock_response.status_code = StatusCode.ERROR
            self.mock_request.return_value = self.mock_response

            fields = [
                'unexist_field',
            ]
            params = {}
            with self.assertRaises(FacebookRequestError):
                ad_set = AdSet(TestValue.ADSET_ID).api_get(
                    fields=fields,
                    params=params,
                )

            self.assertEqual(len(warning), 1)
            self.assertTrue((issubclass(warning[0].category, UserWarning)))
Ejemplo n.º 30
0
def get_adset_by_id(request):
	if request.method == 'GET':
		access_token=request.headers['token']

		adsetId = request.GET.get('adsetId')
		app_secret = 'db4b3037cd105cfd23b6032aecd2c3ff'
		app_id = '263805807945856'
		ADSET_ID = adsetId
		FacebookAdsApi.init(access_token=access_token)
		fields = ['name','start_time','end_time','targeting']
		params = {}
		ad_set = AdSet(ADSET_ID).api_get(
                fields=fields,
                params=params,
            )
		print(ad_set)
		return Response(ad_set)
	else:
		return HttpResponse('not found')