Estoy creando un tablero para mí que me ayuda a realizar un seguimiento de los anuncios de Facebook que estoy publicando.
Lo que no he podido descifrar es:
¿Cómo puedo recuperar una serie de identificadores de anuncios para todos los anuncios que están activos o que podrían estarlo pronto si no tomo ninguna otra acción de mi parte?
En otras palabras, quiero todos los anuncios que configuré como Activos y que existen dentro de los Conjuntos de anuncios y Campañas que están activos (y, por lo tanto, estos anuncios están activos en este momento)... además de todos los anuncios que, desde mi perspectiva, están Activos pero que Facebook ha establecido otro estado, como Pendiente de revisión (y pronto volverá a estar Activo).
Tengo un código a continuación, pero el problema es que accidentalmente también incluye anuncios pendientes que, una vez revisados y aprobados por Facebook, estarán inactivos en lugar de activos (porque los configuré de esa manera). Y NO deseo que este tipo de anuncios se incluyan en mi informe.
Mi informe solo debe mostrarme aquellos en los que estoy gastando dinero activamente o tengo el potencial de gastar dinero tan pronto como FB los apruebe.
Creo que entiendo la diferencia entre el configured_status y el estado effective_status en AbstractArchivableCrudObjectFields , pero no sé si es suficiente para ayudarme porque tengo muchos anuncios configurados como Activos que están dentro de Conjuntos de anuncios que están Inactivos, y no quiero ver los enumerados en mi informe.
¿Alguna recomendación?
public function getActiveAdIds() { $key = 'activeAdIds'; $adIdsJson = Cache::get($key); if ($adIdsJson) { $adIds = json_decode($adIdsJson); } else { $adsResponse = $this->getAdsByStatus([ArchivableCrudObjectEffectiveStatuses::ACTIVE, ArchivableCrudObjectEffectiveStatuses::PENDING_REVIEW]); $ads = $adsResponse->data; $adIds = []; foreach ($ads as $ad) { $adIds[] = $ad->id; } $adIdsJson = json_encode($adIds); Cache::put($key, $adIdsJson, 1); } return $adIds; } public function getAdsByStatus($statuses) { $params = [\FacebookAds\Object\Fields\AbstractArchivableCrudObjectFields::EFFECTIVE_STATUS => $statuses]; $adAccount = new AdAccount(self::ACT_PREPEND . $this->fbConfig['account_id']); $cursor = $adAccount->getAds([], $params); $response = $cursor->getResponse(); $jsonString = $response->getBody(); return json_decode($jsonString); }Obtengo estadísticas basadas en activos para mis campañas activas. Tengo 119 cuentas publicitarias. Este es el código php que usé para este propósito (cualquier sugerencia para mejorarlo será apreciada):
$fields = array(AdsInsightsFields::ACCOUNT_NAME,AdsInsightsFields::CAMPAIGN_ID, AdsInsightsFields::CAMPAIGN_NAME, AdsInsightsFields::ADSET_ID, AdsInsightsFields::ADSET_NAME,AdsInsightsFields::DATE_START, AdsInsightsFields::DATE_STOP,AdsInsightsFields::REACH, AdsInsightsFields::SPEND, AdsInsightsFields::IMPRESSIONS, AdsInsightsFields::CLICKS, AdsInsightsFields::WEBSITE_CLICKS, AdsInsightsFields::CALL_TO_ACTION_CLICKS,AdsInsightsFields::ACTIONS, AdsInsightsFields::TOTAL_ACTIONS,AdsInsightsFields::CPC, AdsInsightsFields::CPM,AdsInsightsFields::CPP, AdsInsightsFields::CTR,AdsInsightsFields::OBJECTIVE,); $params_c['date_preset'] = AdDatePresetValues::YESTERDAY; $params_c['time_increment'] = 1; $params_c['action_attribution_windows'] = array('1d_view', '28d_click'); $params_c['effective_status'] = AdStatusValues::ACTIVE; $params_c['level'] = AdsInsightsLevelValues::ADSET; $params_c['filtering'] = [array("field"=>"campaign.delivery_info", "operator"=>"IN", "value"=>array("active"))]; $params_c['fields']= $fields; try{ // Initialize a new Session and instanciate an Api object Api::init(self::api_key, self::secret_token, self::extended_token)->getHttpClient()->setCaBundlePath( $this->path_cert); // The Api object is now available trough singleton $api = Api::instance(); $user = new \FacebookAds\Object\Business($business_id); $user->read(array(BusinessFields::ID)); //get all ad_account from Business $accounts = $user->getAssignedAdAccounts( array( AdAccountFields::ID, ), array('limit'=>1000,) ); } catch (FacebookAds\Exception\Exception $ex) { return $ex->getMessage(); } if(isset($accounts) && ($accounts->count() > 0)): do{ $ad_account = $accounts->current(); $adset_insights = $ad_account->getInsights($fields,$params_c); do { $adset_insights->fetchAfter(); } while ($adset_insights->getNext()); $adsets = $adset_insights->getArrayCopy(true); } while ($accounts->current()); endif;Si incluye el adset{end_time} en la consulta del anuncio, puede suponer que el anuncio no se está ejecutando realmente si el end_time fue en el pasado. Así es como obtenemos una lista base de anuncios para consultar.
El siguiente paso que tomamos (que probablemente no lo ayude, lamentablemente, pero puede ayudar a otros) es crear un lote de solicitudes simples (una por anuncio) para ver si hay datos de estadísticas para ese día. Si la respuesta es una matriz de 'datos' vacía, podemos eliminar esa ID de la lista de anuncios.
Una vez que hayamos reducido el tamaño de la lista de anuncios con esos dos pasos, podemos realizar solicitudes para ejecutar todos nuestros informes de desglose. Este método casi reduce nuestras solicitudes de API a la mitad.
Todavía tengo que encontrar una manera de hacer una consulta de "dame todos los anuncios que seguramente se publicarán este día" en un solo paso.
Editar: Acabo de encontrar una mejor manera de hacer esto.... :
curl -G \ -d 'access_token=<ACCESS_TOKEN>' \ -d 'level=campaign' \ -d 'filtering=[{field:"ad.impressions",operator:"GREATER_THAN",value:0}]' \ 'https://graph.facebook.com/v2.7/act_<ACCOUNT_ID>/insights'