|
|
@@ -18,17 +18,16 @@ |
|
|
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
# DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
-from facebookads.objects import (
|
|
|
- AdCampaign,
|
|
|
- AdSet,
|
|
|
- AdGroup,
|
|
|
- AdImage,
|
|
|
- AdCreative,
|
|
|
- TargetingSpecsField,
|
|
|
-)
|
|
|
+from facebookads.adobjects.campaign import Campaign
|
|
|
+from facebookads.adobjects.adset import AdSet
|
|
|
+from facebookads.adobjects.targeting import Targeting
|
|
|
+from facebookads.adobjects.ad import Ad
|
|
|
+from facebookads.adobjects.adimage import AdImage
|
|
|
+from facebookads.adobjects.adcreative import AdCreative
|
|
|
+
|
|
|
import itertools
|
|
|
from batch_utils import generate_batches
|
|
|
-
|
|
|
+from simple_create import api
|
|
|
|
|
|
def create_multiple_website_clicks_ads(
|
|
|
account,
|
|
|
@@ -41,8 +40,10 @@ def create_multiple_website_clicks_ads( |
|
|
urls,
|
|
|
image_paths,
|
|
|
|
|
|
- bid_type,
|
|
|
- bid_info,
|
|
|
+ optimization_goal,
|
|
|
+ pixel_id,
|
|
|
+ billing_event,
|
|
|
+ bid_amount,
|
|
|
daily_budget=None,
|
|
|
lifetime_budget=None,
|
|
|
start_time=None,
|
|
|
@@ -53,7 +54,7 @@ def create_multiple_website_clicks_ads( |
|
|
genders=None,
|
|
|
|
|
|
campaign=None,
|
|
|
- paused=False,
|
|
|
+ status=AdSet.Status.paused,
|
|
|
):
|
|
|
# Check for bad specs
|
|
|
if daily_budget is None:
|
|
|
@@ -67,22 +68,32 @@ def create_multiple_website_clicks_ads( |
|
|
)
|
|
|
|
|
|
# Create campaign
|
|
|
- if not campaign:
|
|
|
- campaign = AdCampaign(parent_id=account.get_id_assured())
|
|
|
- campaign[AdCampaign.Field.name] = name + ' Campaign'
|
|
|
- campaign[AdCampaign.Field.objective] = \
|
|
|
- AdCampaign.Objective.website_clicks
|
|
|
- campaign[AdCampaign.Field.status] = \
|
|
|
- AdCampaign.Status.active if not paused \
|
|
|
- else AdCampaign.Status.paused
|
|
|
+ if campaign:
|
|
|
+ campaign = Campaign(fbid=campaign)[Campaign.Field.id]
|
|
|
+ else:
|
|
|
+ campaign = Campaign(parent_id=account)
|
|
|
+ campaign[Campaign.Field.name] = name + ' Campaign'
|
|
|
+ campaign[Campaign.Field.objective] = \
|
|
|
+ Campaign.Objective.conversions
|
|
|
+ campaign[Campaign.Field.status] = \
|
|
|
+ Campaign.Status.active if not status \
|
|
|
+ else Campaign.Status.paused
|
|
|
campaign.remote_create()
|
|
|
+ campaign = campaign[AdSet.Field.id]
|
|
|
|
|
|
# Create ad set
|
|
|
- ad_set = AdSet(parent_id=account.get_id_assured())
|
|
|
- ad_set[AdSet.Field.campaign_group_id] = campaign.get_id_assured()
|
|
|
+ ad_set = AdSet(parent_id=account)
|
|
|
+ ad_set[AdSet.Field.campaign_id] = campaign
|
|
|
ad_set[AdSet.Field.name] = name + ' AdSet'
|
|
|
- ad_set[AdSet.Field.bid_type] = bid_type
|
|
|
- ad_set[AdSet.Field.bid_info] = bid_info
|
|
|
+ ad_set[AdSet.Field.optimization_goal] = optimization_goal
|
|
|
+ ad_set[AdSet.Field.promoted_object] = {
|
|
|
+ 'pixel_id': pixel_id,
|
|
|
+ 'custom_event_type': 'COMPLETE_REGISTRATION'
|
|
|
+
|
|
|
+ }
|
|
|
+ ad_set[AdSet.Field.billing_event] = billing_event
|
|
|
+ ad_set[AdSet.Field.bid_amount] = bid_amount
|
|
|
+
|
|
|
if daily_budget:
|
|
|
ad_set[AdSet.Field.daily_budget] = daily_budget
|
|
|
else:
|
|
|
@@ -92,22 +103,23 @@ def create_multiple_website_clicks_ads( |
|
|
if start_time:
|
|
|
ad_set[AdSet.Field.start_time] = start_time
|
|
|
targeting = {}
|
|
|
- targeting[TargetingSpecsField.geo_locations] = {
|
|
|
+ targeting[Targeting.Field.geo_locations] = {
|
|
|
'countries': [country]
|
|
|
}
|
|
|
if age_max:
|
|
|
- targeting[TargetingSpecsField.age_max] = age_max
|
|
|
+ targeting[Targeting.Field.age_max] = age_max
|
|
|
if age_min:
|
|
|
- targeting[TargetingSpecsField.age_min] = age_min
|
|
|
+ targeting[Targeting.Field.age_min] = age_min
|
|
|
if genders:
|
|
|
- targeting[TargetingSpecsField.genders] = genders
|
|
|
+ targeting[Targeting.Field.genders] = genders
|
|
|
ad_set[AdSet.Field.targeting] = targeting
|
|
|
+
|
|
|
ad_set.remote_create()
|
|
|
|
|
|
# Upload the images first one by one
|
|
|
image_hashes = []
|
|
|
for image_path in image_paths:
|
|
|
- img = AdImage(parent_id=account.get_id_assured())
|
|
|
+ img = AdImage(parent_id=account)
|
|
|
img[AdImage.Field.filename] = image_path
|
|
|
img.remote_create()
|
|
|
image_hashes.append(img.get_hash())
|
|
|
@@ -123,19 +135,20 @@ def callback_failure(response): |
|
|
itertools.product(titles, bodies, urls, image_hashes),
|
|
|
ADGROUP_BATCH_CREATE_LIMIT
|
|
|
):
|
|
|
- api_batch = account.get_api_assured().new_batch()
|
|
|
+ api_batch = api.new_batch()
|
|
|
|
|
|
for title, body, url, image_hash in creative_info_batch:
|
|
|
# Create the ad
|
|
|
- ad = AdGroup(parent_id=account.get_id_assured())
|
|
|
- ad[AdGroup.Field.name] = name + ' Ad'
|
|
|
- ad[AdGroup.Field.campaign_id] = ad_set.get_id_assured()
|
|
|
- ad[AdGroup.Field.creative] = {
|
|
|
+ ad = Ad(parent_id=account)
|
|
|
+ ad[Ad.Field.name] = name + ' Ad'
|
|
|
+ ad[Ad.Field.adset_id] = ad_set[AdSet.Field.id]
|
|
|
+ ad[Ad.Field.creative] = {
|
|
|
AdCreative.Field.title: title,
|
|
|
AdCreative.Field.body: body,
|
|
|
AdCreative.Field.object_url: url,
|
|
|
AdCreative.Field.image_hash: image_hash,
|
|
|
}
|
|
|
+ ad[Ad.Field.status] = status
|
|
|
|
|
|
ad.remote_create(batch=api_batch, failure=callback_failure)
|
|
|
ad_groups_created.append(ad)
|
|
|
@@ -156,8 +169,10 @@ def create_website_clicks_ad( |
|
|
url,
|
|
|
image_path,
|
|
|
|
|
|
- bid_type,
|
|
|
- bid_info,
|
|
|
+ optimization_goal,
|
|
|
+ pixel_id,
|
|
|
+ billing_event,
|
|
|
+ bid_amount,
|
|
|
daily_budget=None,
|
|
|
lifetime_budget=None,
|
|
|
start_time=None,
|
|
|
@@ -168,7 +183,7 @@ def create_website_clicks_ad( |
|
|
genders=None,
|
|
|
|
|
|
campaign=None,
|
|
|
- paused=False,
|
|
|
+ status=AdSet.Status.paused,
|
|
|
):
|
|
|
for ad in create_multiple_website_clicks_ads(
|
|
|
account=account,
|
|
|
@@ -181,8 +196,10 @@ def create_website_clicks_ad( |
|
|
urls=[url],
|
|
|
image_paths=[image_path],
|
|
|
|
|
|
- bid_type=bid_type,
|
|
|
- bid_info=bid_info,
|
|
|
+ optimization_goal=optimization_goal,
|
|
|
+ pixel_id=pixel_id,
|
|
|
+ billing_event=billing_event,
|
|
|
+ bid_amount=bid_amount,
|
|
|
daily_budget=daily_budget,
|
|
|
lifetime_budget=lifetime_budget,
|
|
|
start_time=start_time,
|
|
|
@@ -193,6 +210,6 @@ def create_website_clicks_ad( |
|
|
genders=genders,
|
|
|
|
|
|
campaign=campaign,
|
|
|
- paused=paused,
|
|
|
+ status=Ad.Status.paused,
|
|
|
):
|
|
|
return ad
|