Facebook 营销 API - 目的地 Link

Facebook Marketing API - Destination Link

我正在使用 Facebook 营销 API 进行公司报告。我需要开始获取目标 URL 广告到 link 具有正确广告组的支出数据(存储在我们的个人数据库中)。但是,当我进行此额外调用时,它针对的是不支持异步的报告,我们很快就达到了速率限制。关于如何将 AdInsights 和创意信息简化为一次调用的任何想法?或者减轻创意信息的负载?

# This program downloads all relevant Facebook traffic info as a csv file
# This program requires info from the Facebook Ads API: https://github.com/facebook/facebook-python-ads-sdk

# Import all the facebook mumbo jumbo
from facebookads.api import FacebookAdsApi
from facebookads.adobjects.adsinsights import AdsInsights
from facebookads.adobjects.adaccount import AdAccount
from facebookads.adobjects.business import Business
from facebookads.adobjects.adreportrun import AdReportRun
from facebookads.adobjects.adcreative import AdCreative

# Import th csv writer and the date/time function
import datetime
from datetime import date
import time
from datetime import timedelta
import csv
import string

# Set the info to get connected to the API. Do NOT share this info
my_app_id = '***'
my_app_secret = '***'
my_access_token = '***'

# Start the connection to the facebook API
FacebookAdsApi.init(my_app_id, my_app_secret, my_access_token)

# Create a business object for the *** business account
#business = Business('***')

# Get yesterday's date for the filename, and the csv data
yesterdayday = date.today() - timedelta(days=1)
yesterdayhyphen = (yesterdayday).strftime('%Y-%m-%d')

# Define the destination filename
filename = yesterdayhyphen + '_fb.csv'
filelocation = "/cron/downloads/"+ filename

# Get all ad accounts on the business account
#accounts = business.get_owned_ad_accounts(fields=[AdAccount.Field.id])
accounts = ['act_***', 'act_***', 'act_***', 'act_***', 'act_***', 'act_***', 'act_***', 'act_***']

# Open or create new file 
try:
    csvfile = open(filelocation , 'w+', 0777)
except:
    print ("Cannot open file.")


# To keep track of rows added to file
rows = 0

try:
    # Create file writer
    filewriter = csv.writer(csvfile, delimiter=',')
except Exception as err:
    print(err)

# Iterate through the adaccounts
for account in accounts:
    # Create an addaccount object from the adaccount id to make it possible to get insights
    #tempaccount = AdAccount(account[AdAccount.Field.id])

    tempaccount = AdAccount(account)

    # Grab insight info for all ads in the adaccount
    ads = tempaccount.get_insights(params = {'level' : 'ad',
                                             'date_preset' : 'yesterday' },
                                   fields = [AdsInsights.Field.account_id,
                                             AdsInsights.Field.account_name,
                                             AdsInsights.Field.ad_id,
                                             AdsInsights.Field.ad_name,
                                             AdsInsights.Field.adset_id,
                                             AdsInsights.Field.adset_name,
                                             AdsInsights.Field.campaign_id,
                                             AdsInsights.Field.campaign_name,
                                             AdsInsights.Field.cost_per_outbound_click,
                                             AdsInsights.Field.outbound_clicks,
                                             AdsInsights.Field.spend],
                                   async = True)

    ads.remote_read()

    while ((ads[AdReportRun.Field.async_percent_completion] < 100) and (ads[AdReportRun.Field.async_status] != "Job Completed")):
        time.sleep(1)
        ads.remote_read()

    time.sleep(1)

    ads = ads.get_result()

    print(ads)

    adcreatives = tempaccount.get_ad_creatives(params = {'level' : 'ad',
                                                   'date_preset' : 'yesterday'},
                                               fields = [AdCreative.Field.object_story_spec])

    # Iterate through all accounts in the business account
    for ad in ads:
        # Set default values in case the insight info is empty
        date = yesterdayhyphen
        accountid = ad[AdsInsights.Field.account_id]
        accountname = ""
        adid = ""
        adname = ""
        adsetid = ""
        adsetname = ""
        campaignid = ""
        campaignname = ""
        costperoutboundclick = ""
        outboundclicks = ""
        spend = ""
        destinationurl = ""

        # Set values from insight data
        if ('account_id' in ad) :
            accountid = ad[AdsInsights.Field.account_id]
        if ('account_name' in ad) :
            accountname = ad[AdsInsights.Field.account_name]
        if ('ad_id' in ad) :
            adid = ad[AdsInsights.Field.ad_id]
        if ('ad_name' in ad) :
            adname = ad[AdsInsights.Field.ad_name]
        if ('adset_id' in ad) :
            adsetid = ad[AdsInsights.Field.adset_id]
        if ('adset_name' in ad) :
            adsetname = ad[AdsInsights.Field.adset_name]
        if ('campaign_id' in ad) :
            campaignid = ad[AdsInsights.Field.campaign_id]
        if ('campaign_name' in ad) :
            campaignname = ad[AdsInsights.Field.campaign_name]
        if ('cost_per_outbound_click' in ad) : # This is stored strangely, takes a few steps to break through the layers
            costperoutboundclicklist = ad[AdsInsights.Field.cost_per_outbound_click]
            costperoutboundclickdict = costperoutboundclicklist[0]
            costperoutboundclick = costperoutboundclickdict.get('value')
        if ('outbound_clicks' in ad) : # This is stored strangely, takes a few steps to break through the layers
            outboundclickslist = ad[AdsInsights.Field.outbound_clicks]
            outboundclicksdict = outboundclickslist[0]
            outboundclicks = outboundclicksdict.get('value')
        if ('spend' in ad) :
            spend = ad[AdsInsights.Field.spend]

        for adcreative in adcreatives:
            if ( ad[AdsInsights.Field.ad_id] == adcreative[ 'id' ] ):
                destinationurl = adcreative[AdCreative.Field.object_story_spec.link_url]


        # Write all ad info to the file, and increment the number of rows that will display
        filewriter.writerow([date, accountid, accountname, adid, adname, adsetid, adsetname, campaignid, campaignname, costperoutboundclick, outboundclicks, spend, destinationurl])
        rows += 1



csvfile.close()

# Print report
print (str(rows) + " rows added to the file " + filelocation)

以下是我使用 php 的方式:

<?php
    $dbhost = "***";
    $dbname = "***";
    $dbtable = "***";
    $dbusername ="***";
    $dbpassword = "***";

    $accounts = [ *** ];

    $i = "-1";      
    $yesterday = date( 'Y-m-d', strtotime( $i.' day' ) ) . " 01:01:01";
    echo $yesterday;
    $yesterday_no_time = date( 'Y-m-d', strtotime( $i.' day' ) );

    $conn = mysqli_connect( $dbhost, $dbusername, $dbpassword, $dbname );
    if ($conn->connect_error) {
        die( "Connection failed: " . $conn->connect_error );
    }

    $traffic_source_id = 2;
    $delete = "DELETE FROM spend WHERE date( created_at ) = '" . date( 'Y-m-d', strtotime( $i.' day' ) ) . "' AND traffic_source_id = " . $traffic_source_id;
    if ($conn->query($delete) === TRUE) {
        if( $conn->affected_rows > 0 ) {
            echo "Yesterday's data already exists. " . $conn->affected_rows . " record(s) deleted successfully. \n";
        }
    } else {
        echo "Error deleting record(s): " . $conn->error;
    }

    $select = $conn->prepare( "SELECT website_id, website_type_id, user_id, campaign_id FROM groups WHERE id = ?" );
    $select->bind_param( "i", $group_id );

    $insert = $conn->prepare( "INSERT INTO spend ( campaign_name, group_name, ad_name, " .
        "source_campaign_id, source_group_id, source_ad_id, impressions, clicks, leads, spend, website_id, website_type_id,".
        "traffic_source_id, user_id, campaign_id, group_id, created_at, updated_at ) VALUES " .
        "( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )" );
    $insert->bind_param( "sssiiiiiidiiiiiiss", $campaign_name, $group_name, $ad_name, $source_campaign_id, 
        $source_group_id, $source_ad_id, $impressions, $clicks, $leads, $spend, $website_id, $website_type_id, $traffic_source_id, 
        $user_id, $campaign_id, $group_id, $yesterday, $yesterday );

    $ch = curl_init();

    foreach ( $accounts as $account ) {
        $url = "https://graph.facebook.com/v3.1/$account/insights?" .
            "level=ad&time_range[since]=".$yesterday_no_time."&time_range[until]=".$yesterday_no_time."&fields=ad_id,ad_name,adset_id,adset_name,campaign_id," .
            "campaign_name,impressions,outbound_clicks,spend,unique_actions&limit=5000&status=ACTIVE&" .
            "access_token=EAACsZAOuIZAVMBAEJ37BHI8XezLfeX3fXQfatCSODBOAquV8j3SHD7qNRXz29fNnvF2bCu5m0agpbshRswGEIz6bIUZBsAfhgl3BVNPvCPwvyeQvuluy3XJ8M4KLxSTkzrmfRwjA95Ri29ynuKi5fmFyngq4JiAZBbfir0AjXAZDZD";
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        $insights = json_decode( curl_exec( $ch ),True );

        $url = "https://graph.facebook.com/v3.1/$account/ads?fields=ad_id,adcreatives{object_story_spec}&status=ACTIVE&limit=2000&time_range[since]=".$yesterday_no_time."&time_range[until]=".$yesterday_no_time."&" .
            "access_token=EAACsZAOuIZAVMBAEJ37BHI8XezLfeX3fXQfatCSODBOAquV8j3SHD7qNRXz29fNnvF2bCu5m0agpbshRswGEIz6bIUZBsAfhgl3BVNPvCPwvyeQvuluy3XJ8M4KLxSTkzrmfRwjA95Ri29ynuKi5fmFyngq4JiAZBbfir0AjXAZDZD";
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        $creatives = json_decode( curl_exec( $ch ), True );

        $creative_links = [];
        $creative_links[ 0 ] = [];
        $key = 0;
        foreach( $creatives[ "data" ] as $creativesAd ) {
            if( isset( $creativesAd[ 'adcreatives' ][ 'data' ][ 0 ][ 'object_story_spec' ] ) ) {
                $creative_links[ $key ][ 'id' ] =  $creativesAd[ 'id' ];
                $objectStorySpec = $creativesAd[ 'adcreatives' ][ 'data' ][ 0 ][ 'object_story_spec' ];
                $final_url = "";
                if ( isset( $objectStorySpec[ 'link_data' ] ) ) {
                    $final_url = $objectStorySpec[ 'link_data' ][ 'link' ];
                } else if ( isset( $objectStorySpec[ 'video_data' ] ) ) {
                    $final_url = $objectStorySpec[ 'video_data' ][ 'call_to_action' ][ 'value' ][ 'link' ];
                }
                $creative_links[ $key ][ 'link' ] =  $final_url;
                $key++;
            }
        }
        while( isset( $creatives[ 'paging']['next' ] ) ) {
            $next_link = $creatives[ 'paging']['next' ];
            curl_setopt( $ch, CURLOPT_URL, $next_link );
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
            $creatives = json_decode( curl_exec( $ch ), True );

            foreach( $creatives[ "data" ] as $creativesAd ) {
                if( isset( $creativesAd[ 'adcreatives' ][ 'data' ][ 0 ][ 'object_story_spec' ] ) ) {
                    $creative_links[ $key ][ 'id' ] =  $creativesAd[ 'id' ];
                    $objectStorySpec = $creativesAd[ 'adcreatives' ][ 'data' ][ 0 ][ 'object_story_spec' ];
                    $final_url = "";
                    if ( isset( $objectStorySpec[ 'link_data' ] ) ) {
                        $final_url = $objectStorySpec[ 'link_data' ][ 'link' ];
                    } else if ( isset( $objectStorySpec[ 'video_data' ] ) ) {
                        $final_url = $objectStorySpec[ 'video_data' ][ 'call_to_action' ][ 'value' ][ 'link' ];
                    }
                    $creative_links[ $key ][ 'link' ] =  $final_url;
                    $key++;
                }
            }
        }

        foreach ( $insights as $insightsData ) {
            foreach ( $insightsData as $ad ) {
                if ( isset( $ad[ 'campaign_name' ] ) ) {
                    $campaign_name = $ad[ 'campaign_name' ];
                    $group_name = $ad[ 'adset_name' ];
                    $ad_name = $ad[ 'ad_name' ];
                    $source_campaign_id = $ad[ 'campaign_id' ];
                    $source_group_id = $ad[ 'adset_id' ];
                    $source_ad_id = $ad[ 'ad_id' ];
                    $impressions = $ad[ 'impressions' ];
                    $clicks = 0;
                    if ( isset( $ad[ 'outbound_clicks' ] ) ) {
                        $clicks = $ad[ 'outbound_clicks' ][ 0 ][ 'value' ];
                    }
                    $leads = 0;
                    if ( isset( $ad[ 'unique_actions' ] ) ) {
                        foreach( $ad[ 'unique_actions' ] as $unique_action ) {
                            if( isset( $unique_action[ 'action_type' ] ) && $unique_action[ 'action_type' ] == "offsite_conversion.fb_pixel_lead" ) {
                                $leads = $unique_action[ 'value' ];
                            }
                        }
                    }
                    $spend = $ad[ 'spend' ];

                    foreach ( $creative_links as $creative_link ) {
                        if ( isset( $creativesAd[ 'id' ] ) ) {
                            if( $source_ad_id == $creative_link[ 'id' ] ) {
                                $link = $creative_link[ 'link' ];
                            }
                        }
                    }

                    $group_id = 0;
                    $parts = parse_url($link);
                    if ( isset( $parts['query'] ) ) {
                        parse_str($parts['query'], $query);
                        if ( isset( $query[ 'tc_gid' ] ) ) {
                            $group_id = (int) $query[ 'tc_gid' ];
                        } else if ( isset( $query[ 'tcagid' ] ) ) {
                            $group_id = (int) $query[ 'tcagid' ];
                        } else if ( isset( $query[ 'tcdgid' ] ) ) {
                            $group_id = (int) $query[ 'tcdgid' ];
                        }
                    }

                    $select->execute();
                    $result = $select->get_result();
                    if ( $result->num_rows > 0 ) {
                        $row = $result->fetch_assoc();
                        $website_id = $row[ 'website_id' ];
                        $website_type_id = $row[ 'website_type_id' ];
                        $user_id = $row[ 'user_id' ];
                        $campaign_id = $row[ 'campaign_id' ];
                    } else {
                        $website_id = 0;
                        $website_type_id = 0;
                        $user_id = 0;
                        $campaign_id = 0;
                    }

                    $insert->execute();
                }
            }
        }
        sleep( 20 );
    }
//}
    curl_close( $ch );
    $select->close();
    $insert->close();
    $conn->close();
?>