예제 #1
0
        def test_get_params(self):
            event = Event(event_name='Purchase', event_time=int(time.time()))
            pixel_id = 'pixel123'
            expected = {
                'test_event_code': 'test-code-1',
                'namespace_id': '222',
                'upload_id': '333',
                'upload_tag': 'upload-tag4',
                'upload_source': 'upload-source5',
                'partner_agent': 'partner-agent-6',
                'data': json.dumps([event.normalize()]),
            }
            event_request_async = EventRequestAsync(
                pixel_id=pixel_id,
                events=[event],
                test_event_code=expected['test_event_code'],
                namespace_id=expected['namespace_id'],
                upload_id=expected['upload_id'],
                upload_tag=expected['upload_tag'],
                upload_source=expected['upload_source'],
                partner_agent=expected['partner_agent'],
            )

            self.assertEqual(event_request_async.get_params(), expected)
            self.assertEqual(event_request_async.pixel_id, pixel_id)
예제 #2
0
def notify_view_content(product_id, url, remote_address, user_agent):
    user_data = UserData(
        # It is recommended to send Client IP and User Agent for Conversions API Events.
        client_ip_address=remote_address,
        client_user_agent=user_agent
        # fbc='fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890',
        # fbp='fb.1.1558571054389.1098115397',
    )

    content = Content(
        product_id=product_id,
    )

    custom_data = CustomData(
        contents=[content],
    )

    event = Event(
        event_name='ViewContent',
        event_time=int(time.time()),
        user_data=user_data,
        custom_data=custom_data,
        event_source_url=url,
        action_source=ActionSource.WEBSITE,
    )

    event_request = EventRequest(
        events=[event],
        pixel_id=FACEBOOK_PIXEL_ID,
    )

    event_response = event_request.execute()
예제 #3
0
        def test_clone_without_events(self):
            event_request_async = EventRequestAsync(
                pixel_id='pixel123',
                events=[
                    Event(event_name='Purchase', event_time=int(time.time()))
                ],
                test_event_code='test-code-1',
                namespace_id='222',
                upload_id='333',
                upload_tag='upload-tag4',
                upload_source='upload-source5',
            )
            expected_event_request_async = EventRequestAsync(
                pixel_id=event_request_async.pixel_id,
                events=[],
                test_event_code=event_request_async.test_event_code,
                namespace_id=event_request_async.namespace_id,
                upload_id=event_request_async.upload_id,
                upload_tag=event_request_async.upload_tag,
                upload_source=event_request_async.upload_source,
            )
            event_request_async_cloned = event_request_async.clone_without_events(
            )

            self.assertEqual(event_request_async_cloned,
                             expected_event_request_async)
예제 #4
0
    def test_action_source_validation(self):
        action_source = 'wrong type'
        expected_exception_message = 'action_source must be an ActionSource. TypeError on value: ' + action_source

        with self.assertRaises(TypeError) as context:
            Event(
                event_name='event-name',
                event_time=1,
                action_source=action_source,
            ).normalize()

        self.assertTrue(expected_exception_message in str(context.exception))
예제 #5
0
    def test_constructor(self):
        event_name = 'event_name-0'
        event_time = 123
        event_source_url = 'event_source_url-2'
        opt_out = False
        event_id = 'event_id-3'
        user_data = UserData(email='*****@*****.**')
        custom_data = CustomData(order_id=123)
        data_processing_options = ['4' '5']
        data_processing_options_country = 6
        data_processing_options_state = 7
        action_source = ActionSource.APP
        event = Event(
            event_name=event_name,
            event_time=event_time,
            event_source_url=event_source_url,
            opt_out=opt_out,
            event_id=event_id,
            user_data=user_data,
            custom_data=custom_data,
            data_processing_options=data_processing_options,
            data_processing_options_country=data_processing_options_country,
            data_processing_options_state=data_processing_options_state,
            action_source=action_source,
        )
        expected_params = {
            'event_name': event_name,
            'event_time': event_time,
            'event_source_url': event_source_url,
            'opt_out': opt_out,
            'event_id': event_id,
            'user_data': user_data.normalize(),
            'custom_data': custom_data.normalize(),
            'data_processing_options': data_processing_options,
            'data_processing_options_country': data_processing_options_country,
            'data_processing_options_state': data_processing_options_state,
            'action_source': action_source.value,
        }

        self.assertEqual(event.normalize(), expected_params)
예제 #6
0
def notify_initiate_checkout(basket_id, user_id, url, remote_address, user_agent):
    basket = Basket.objects.get(id=basket_id)
    user_phone = None
    user_email = None
    if user_id:
        user = ShopUser.objects.get(id=user_id)
        user_phone = user.phone
        user_email = user.email

    user_data = UserData(
        email=user_email,
        phone=user_phone,
        # It is recommended to send Client IP and User Agent for Conversions API Events.
        client_ip_address=remote_address,
        client_user_agent=user_agent
        # fbc='fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890',
        # fbp='fb.1.1558571054389.1098115397',
    )

    contents = []
    for item in basket.items.all():
        contents.append(Content(
            product_id=item.product.id,
            title=item.product.title,
            brand=item.product.manufacturer.name,
            item_price=str(item.price.quantize(Decimal('1'), rounding=ROUND_HALF_EVEN)),
            quantity=item.quantity
        ))

    custom_data = CustomData(
        contents=contents,
        content_type='product',
        currency='rub',
        value=float(basket.total)
    )

    event = Event(
        event_name='InitiateCheckout',
        event_time=int(time.time()),
        user_data=user_data,
        custom_data=custom_data,
        event_source_url=url,
        action_source=ActionSource.WEBSITE,
    )

    event_request = EventRequest(
        events=[event],
        pixel_id=FACEBOOK_PIXEL_ID,
    )

    event_response = event_request.execute()
    log.error(event_response)
    def test_http_client(self):
        mock_http_client = Mock(HttpServiceInterface)
        event = Event(event_name='Purchase', event_time=int(time.time()))
        expected_event = json.dumps(
            {'event_name': event.event_name, 'event_time': event.event_time}
        )
        access_token = 'access-token-0'
        pixel_id = 'pixel123'
        appsecret = 'app-secret-234'
        appsecret_proof = Util.appsecret_proof(appsecret, access_token)
        expected_params = {
            'data': [expected_event],
            'test_event_code': 'test-code-1',
            'namespace_id': '222',
            'upload_id': '333',
            'upload_tag': 'upload-tag4',
            'upload_source': 'upload-source5',
            'access_token': access_token,
            'appsecret_proof': appsecret_proof,
        }
        event_request = EventRequest(
            pixel_id=pixel_id,
            events=[event],
            test_event_code=expected_params['test_event_code'],
            namespace_id=expected_params['namespace_id'],
            upload_id=expected_params['upload_id'],
            upload_tag=expected_params['upload_tag'],
            upload_source=expected_params['upload_source'],
            http_client=mock_http_client,
            access_token=access_token,
            appsecret=appsecret
        )
        expected_event_response = EventResponse(
            events_received=2, fbtrace_id='traceid1', messages=['1', '2']
        )
        mock_http_client.execute.return_value = expected_event_response
        expected_headers = FacebookAdsApi.HTTP_DEFAULT_HEADERS
        expected_url = '%s/%s/%s/events' % (FacebookSession.GRAPH, FacebookAdsApi.API_VERSION, pixel_id)
        expected_request_options = RequestOptions(
            ca_bundle_path=Util.ca_bundle_path(),
        )
        actual_event_response = event_request.execute()

        mock_http_client.execute.assert_called_with(
            url=expected_url,
            method=HttpMethod.POST,
            request_options=expected_request_options,
            headers=expected_headers,
            params=expected_params,
        )
        self.assertEqual(actual_event_response, expected_event_response)
예제 #8
0
def build_predicted_revenue_events(df, event_name):
    """
    Creates a list of Facebook Event objects which can be pushed to the Facebook Conversions API.
    Also creates DataFrame for logging which can be used to stream insert to a BigQuery log table.

    :param df: A DataFrame with the events to build Facebook events for
    :type df: pd.DataFrame

    Returns: A tuple with a list of Facebook events and a DataFrame for logs
    rtype: (list of Event, pd.DataFrame)
    """
    events = []
    logs = []
    for index, row in df.iterrows():
        date = int(time.mktime(datetime.strptime(row['date'], '%Y%m%d').timetuple()))
        user_data = UserData(
            country_code=row['shop'],
            fbp=row['facebook_browser_id']
        )

        custom_data = CustomData(
            currency=row['currency'],
            value=row['predicted_revenue']
        )

        event = Event(
            event_name=event_name,
            event_time=date,
            user_data=user_data,
            custom_data=custom_data,
            data_processing_options=[]
        )
        events.append(event)

        logs.append(
            {
                "facebook_browser_id": row['facebook_browser_id'],
                "shop": row['shop'],
                "date_source": row['date'],
                "date_processed": datetime.today().strftime('%Y-%m-%d-%H:%M:%S'),
                "predicted_revenue": row['predicted_revenue'],
                "currency": row['currency']
            }
        )
    df_logs = pd.DataFrame(logs)
    return events, df_logs
    def test_constructor(self, pixel_mock):
        event = Event(event_name='Purchase', event_time=int(time.time()))
        expected_event = json.dumps(
            {'event_name': event.event_name, 'event_time': event.event_time}
        )
        pixel_id = 'pixel123'
        expected_data = {
            'data': [expected_event],
            'test_event_code': 'test-code-1',
            'namespace_id': '222',
            'upload_id': '333',
            'upload_tag': 'upload-tag4',
            'upload_source': 'upload-source5',
            'partner_agent': 'partner-agent-6',
        }
        event_request = EventRequest(
            pixel_id=pixel_id,
            events=[event],
            test_event_code=expected_data['test_event_code'],
            namespace_id=expected_data['namespace_id'],
            upload_id=expected_data['upload_id'],
            upload_tag=expected_data['upload_tag'],
            upload_source=expected_data['upload_source'],
            partner_agent=expected_data['partner_agent'],
        )
        ads_pixel = {
            'events_received': 2,
            'fbtrace_id': 'traceid1',
            'messages': ['1', '2'],
        }
        expected_event_response = EventResponse(
            events_received=2, fbtrace_id='traceid1', messages=['1', '2']
        )
        pixel_instance_mock = pixel_mock.return_value
        pixel_instance_mock.create_event.return_value = ads_pixel
        actual_event_response = event_request.execute()

        pixel_mock.assert_called_with(pixel_id)
        pixel_instance_mock.create_event.assert_called_with(
            fields=[], params=expected_data
        )
        self.assertEqual(actual_event_response, expected_event_response)
예제 #10
0
def notify_add_to_cart(product_id, url, remote_address, user_agent):
    product = Product.objects.get(id=product_id)

    user_data = UserData(
        # It is recommended to send Client IP and User Agent for Conversions API Events.
        client_ip_address=remote_address,
        client_user_agent=user_agent
        # fbc='fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890',
        # fbp='fb.1.1558571054389.1098115397',
    )

    content = Content(
        product_id=product_id,
        item_price=str(product.price.quantize(Decimal('1'), rounding=ROUND_HALF_EVEN))
    )

    custom_data = CustomData(
        contents=[content],
        content_type='product',
        currency='rub'
    )

    event = Event(
        event_name='AddToCart',
        event_time=int(time.time()),
        user_data=user_data,
        custom_data=custom_data,
        event_source_url=url,
        action_source=ActionSource.WEBSITE,
    )

    event_request = EventRequest(
        events=[event],
        pixel_id=FACEBOOK_PIXEL_ID,
    )

    event_response = event_request.execute()
    log.error(event_response)
예제 #11
0
content = Content(
    product_id='product123',
    quantity=1,
    delivery_category=DeliveryCategory.HOME_DELIVERY,
)

custom_data = CustomData(
    contents=[content],
    currency='usd',
    value=123.45,
)

event = Event(
    event_name='Purchase',
    event_time=int(time.time()),
    user_data=user_data,
    custom_data=custom_data,
    event_source_url='http://jaspers-market.com/product/123',
    action_source=ActionSource.WEBSITE,
)

events = [event]

event_request = EventRequest(
    events=events,
    pixel_id=pixel_id,
)

event_response = event_request.execute()
print(event_response)
# DEALINGS IN THE SOFTWARE.

import time

from facebook_business.adobjects.serverside.event import Event
from facebook_business.adobjects.serverside.event_request import EventRequest
from facebook_business.adobjects.serverside.user_data import UserData
from facebook_business.api import FacebookAdsApi

access_token = '<ACCESS_TOKEN>'
pixel_id = 'ADS_PIXEL_ID>'

FacebookAdsApi.init(access_token=access_token)

user_data = UserData(
    email='*****@*****.**',
    fbc='fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890',
    fbp='fb.1.1558571054389.1098115397')

event = Event(
    event_name='PageView',
    event_time=int(time.time()),
    user_data=user_data,
)

events = [event]

event_request = EventRequest(events=events, pixel_id=pixel_id)

event_response = event_request.execute()
print(event_response)
예제 #13
0
access_token = '<ACCESS_TOKEN>'
pixel_id = 'ADS_PIXEL_ID>'

FacebookAdsApi.init(access_token=access_token)

user_data = UserData(
    email='*****@*****.**',
    fbc='fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890',
    fbp='fb.1.1558571054389.1098115397'
)

custom_data = CustomData(
    currency='usd',
    value=123.45
)

event = Event(
    event_name='Purchase',
    event_time=int(time.time()),
    user_data=user_data,
    custom_data=custom_data,
)

events = [event]

event_request = EventRequest(
    events=events,
    pixel_id=pixel_id)

event_response = event_request.execute()
print(event_response)
예제 #14
0
def pixel():
    access_token = request.headers.get('token')
    pixel_id = request.headers.get('pixel')
    page_id = request.headers.get('page_id')

    FacebookAdsApi.init(access_token=access_token)
    now = int(time.time())
    action_source = ActionSource('chat')
    payload = request.json

    if payload['opt_out'].lower().strip() == 'false':
        opt_out = False
    else:
        opt_out = True

    user_data = payload['user_data']
    user_data = {
        key: None if user_data[key].find('{{') != -1
        and user_data[key].find('}}') != -1 else user_data[key]
        for key, value in user_data.items()
    }
    user_data_0 = UserData()
    for key, value in user_data.items():
        setattr(user_data_0, key, value)

    custom_data = payload['custom_data']
    if payload["event_name"] == 'Purchase':
        try:
            custom_data['value'] = float(custom_data['value'])
        except ValueError or TypeError:
            response = f'{custom_data["value"]} is not allowed as value for {payload["event_name"]} event'
            entry = dict(message={
                'page_id': page_id,
                'log': response
            },
                         component='arbitrary-property')
            print(json.dumps(entry))
            return response, 400
    if 'predicted_ltv' in custom_data.keys():
        custom_data['predicted_ltv'] = float(custom_data['predicted_ltv'])
    if 'num_items' in custom_data.keys():
        custom_data['num_items'] = int(custom_data['num_items'])
    custom_data_0 = CustomData()
    for key, value in custom_data.items():
        setattr(custom_data_0, key, value)

    event_0 = Event(event_name=payload['event_name'],
                    event_time=now,
                    opt_out=opt_out,
                    user_data=user_data_0,
                    custom_data=custom_data_0,
                    data_processing_options=[],
                    action_source=action_source)

    events = [event_0]

    if payload['test_event_code'] == '':
        event_request = EventRequest(
            events=events,
            pixel_id=pixel_id,
        )
    else:
        test_event_code = payload['test_event_code']
        event_request = EventRequest(events=events,
                                     pixel_id=pixel_id,
                                     test_event_code=test_event_code)

    try:
        event_response = event_request.execute()
    except (TypeError, AttributeError) as error:
        error_message = error.args[0]
        response = {'response': error_message}
        return response, 400
    except FacebookRequestError as error:
        error_message = error.body()['error']['message']
        response = {'response': error_message}
        return response, 400
    else:
        response = event_response.to_dict()
        return response
    finally:
        entry = dict(message={'page_id': page_id, 'log': response})
        print(json.dumps(entry))