def get_campaigns(query): urllib3.disable_warnings() campaigns = list() dst_url = tool.FB_HOST_URL + os.environ["act_id"] + '/campaigns?{}'.format(query) while True: try: html = requests.get(dst_url, verify=False).text json_out = json.loads(html) if 'data' not in json_out: time.sleep(5) else: for node in json_out['data']: campaign_id = node['id'] adset_id = node['adsets']['data'][0]['id'] ad_id = node['adsets']['data'][0]['ads']['data'][0]['id'] campaigns.append((campaign_id, adset_id, ad_id)) if 'paging' in json_out: if 'next' in json_out['paging']: dst_url = json_out['paging']['next'] else: break else: break except Exception as e: log.logger.info(str(e)) log.log_exp() time.sleep(60) return campaigns
def online_check(): # 获取状态为ACTIVE的广告数量 online_count = cur_index['active'] + cur_index['pending'] set_size = int(os.environ["init_ads_size"]) if bb.delivery_status == "off": set_size = 0 else: set_size = int(round(set_size*math.pow((5-bb.blood_control_coef)/4, 3), 0)) log.logger.info("online ads:" + str(online_count)) if online_count < set_size: ready_to_create = set_size - online_count log.logger.info("ready to create " + str(ready_to_create) + " ads.") try: if bb.blood_control_coef >= 2: log.logger.info('directly apply...') real_n = mother.create_new_ads(ready_to_create) mongo.update_delivery_data(cur_index['today'], 0, 0, 0, 0, 0, online_count, cur_index['paused'], real_n, 0, 0, cur_index['gt6']) else: need_awake_num = round(ready_to_create) real_awake_num = awake(need_awake_num) log.logger.info('awake '+str(real_awake_num)+' ads.') real_n = mother.create_new_ads(ready_to_create - real_awake_num) mongo.update_delivery_data(cur_index['today'], 0, 0, 0, 0, 0, online_count, cur_index['paused'], real_n, real_awake_num, 0, cur_index['gt6']) except Exception as e: log.logger.info("create ads exception:" + str(e)) log.log_exp()
def status_check(): # 去掉状态为 In Review 且发布时间超过4小时的广告 pending_campaigns = ds.snap_data.pending_campaigns disapproved_campaigns = ds.snap_data.disapproved_campaigns need_remove_campaigns = [] need_remove_campaigns_cmd_type = [] need_remove_ads = [] if len(pending_campaigns) > 0: time_now = datetime.datetime.now(tool.tz).strftime('%Y-%m-%d %H:%M:%S') new_date = datetime.datetime.strptime(time_now, '%Y-%m-%d %H:%M:%S') ads_time = mongo.get_campaigns_create_time(pending_campaigns) for record in ads_time: old_date = datetime.datetime.strptime(record['create_time'], '%Y-%m-%d %H:%M:%S') diff_val = new_date - old_date if diff_val.seconds / 3600 + diff_val.days * 24 >= 4: need_remove_campaigns.append(record['campaign_id']) need_remove_campaigns_cmd_type.append('DELETED') need_remove_ads.append(record['ad_id']) if len(need_remove_campaigns) > 0: ntp.control_campaign(need_remove_campaigns, cmd_type=need_remove_campaigns_cmd_type) mongo.remove_ads(need_remove_ads) log.logger.info(" remove "+str(len(need_remove_campaigns)) + " campaigns for staying In Review status over 4 hours.") pending_campaigns_count = len(pending_campaigns) - len(need_remove_campaigns) # 发现状态为 Not Approved 的广告触发报警机制 if len(disapproved_campaigns) > 0: message = "discover " + str(len(disapproved_campaigns)) + " ads Not Approved. from : " + os.environ["name"] try: sms_service.gsm_message(message) log.logger.info(message) except Exception as e: log.logger.info(str(e)) log.log_exp() return pending_campaigns_count, len(need_remove_campaigns)
def control_campaign(campaign_ids, cmd_type): loop = asyncio.get_event_loop() try: loop.run_until_complete(run(loop, campaign_ids, cmd_type)) except Exception as e: log.log_exp() raise e
def work(self, dict_key): while True: try: req_out = requests.post(os.environ["facebook_service"], data=self.data_dict[dict_key], headers=tool.HEADERS) self.result[dict_key] = json.loads(req_out.text) break except Exception as e: log.logger.info(str(e)) log.log_exp() time.sleep(20)
def period_control(): data = { "delt_name": os.environ["name"], "utc8_datetime": tool.get_cur_date(), "period": "12" } try: req_out = requests.post(os.environ["period_blood_service"], data=json.dumps(data)) json_out = json.loads(req_out.text) for element in json_out: if not mongo.check_prize(element['ad_id']) and not mongo.check_period(element['ad_id']): if element['ad_id'] in bb.ads_group_blood: # 针对活跃的广告,周期回血 bb.set_blood(element['ad_id'], element['backBlood'], 0) mongo.blood_return(element['ad_id'], element['backBlood'], 'period') log.logger.info("周期回血 -> ad_id(" + element['ad_id'] + ") add blood:" + str(element['backBlood'])) except Exception as e: log.logger.info("period blood exception:"+str(e)) log.log_exp()
def update_bid_amount(ad_set_id, bid_amount): url = tool.FB_HOST_URL + ad_set_id data = tool.compose({'bid_amount': bid_amount}, is_utf8=True) while True: try: req_out = requests.post(url, data=data) log.logger.info(req_out.text) except Exception as e: log.logger.info(e) log.log_exp() time.sleep(60) else: json_out = json.loads(req_out.text) if 'success' in json_out and json_out['success']: log.logger.info("update bid success!") log.logger.info('adset ' + ad_set_id + ' update bid amount to ' + str(bid_amount)) break else: log.logger.info("update bid failure!") time.sleep(60)