def _facebook_report( self, account_id: str, api: FacebookAdsApi, params: Dict[str, Any], fields: List[str], sleep_time: int = 5, ) -> List[AdsInsights]: """ Pulls data from the Facebook Ads API with given account_id :param account_id: Facebook Account ID that holds ads information https://developers.facebook.com/docs/marketing-api/reference/ads-insights/ :type account_id: str :param api: FacebookAdsApi created in the hook :type api: FacebookAdsApi :param fields: List of fields that is obtained from Facebook. Found in AdsInsights.Field class. https://developers.facebook.com/docs/marketing-api/insights/parameters/v6.0 :type fields: List[str] :param params: Parameters that determine the query for Facebook https://developers.facebook.com/docs/marketing-api/insights/parameters/v6.0 :type params: Dict[str, Any] :param sleep_time: Time to sleep when async call is happening :type sleep_time: int """ ad_account = AdAccount(account_id, api=api) _async = ad_account.get_insights(params=params, fields=fields, is_async=True) while True: request = _async.api_get() async_status = request[AdReportRun.Field.async_status] percent = request[AdReportRun.Field.async_percent_completion] self.log.info("%s %s completed, async_status: %s", percent, "%", async_status) if async_status == JobStatus.COMPLETED.value: self.log.info("Job run completed") break if async_status in [ JobStatus.SKIPPED.value, JobStatus.FAILED.value ]: message = f"{async_status}. Please retry." raise AirflowException(message) time.sleep(sleep_time) report_run_id = _async.api_get()["report_run_id"] report_object = AdReportRun(report_run_id, api=api) self.log.info("Extracting data from returned Facebook Ads Iterators") insights = report_object.get_insights() return list(insights)
def bulk_facebook_report( self, params: Dict[str, Any], fields: List[str], sleep_time: int = 5, ) -> List[AdsInsights]: """ Pulls data from the Facebook Ads API :param fields: List of fields that is obtained from Facebook. Found in AdsInsights.Field class. https://developers.facebook.com/docs/marketing-api/insights/parameters/v6.0 :type fields: List[str] :param params: Parameters that determine the query for Facebook https://developers.facebook.com/docs/marketing-api/insights/parameters/v6.0 :type fields: Dict[str, Any] :param sleep_time: Time to sleep when async call is happening :type sleep_time: int :return: Facebook Ads API response, converted to Facebook Ads Row objects :rtype: List[AdsInsights] """ api = self._get_service() ad_account = AdAccount(api.get_default_account_id(), api=api) _async = ad_account.get_insights(params=params, fields=fields, is_async=True) while True: request = _async.api_get() async_status = request[AdReportRun.Field.async_status] percent = request[AdReportRun.Field.async_percent_completion] self.log.info("%s %s completed, async_status: %s", percent, "%", async_status) if async_status == JobStatus.COMPLETED.value: self.log.info("Job run completed") break if async_status in [ JobStatus.SKIPPED.value, JobStatus.FAILED.value ]: message = "{async_status}. Please retry.".format( async_status=async_status) raise AirflowException(message) time.sleep(sleep_time) report_run_id = _async.api_get()["report_run_id"] report_object = AdReportRun(report_run_id, api=api) insights = report_object.get_insights() self.log.info("Extracting data from returned Facebook Ads Iterators") return list(insights)