package main import ( "fmt" "github.com/gin-gonic/gin" "math/rand" "miads/adslib" "miads/adslib/addata" "miads/adslib/ads_checker" "miads/adslib/city" "miads/adslib/device" "miads/adslib/graylog" "miads/adslib/ip2region" "miads/adslib/redis_data" "miads/adslib/utils" "net/url" "strconv" "strings" "time" ) var DECRYPT_KEY = "%videoopen%!@#$%" func adsHandler(c *gin.Context) { c.Header("Content-Type", "application/json") request := Request{} request.Parse(c) //uaClientOrigin := utils.GetArgument(c, "ua","") //originMac := utils.GetArgument(c, "mac","") //clientImei := request.Imei fmt.Printf("%+v", request) advertiser := "xiaomi" uaClient := request.UaClient // 获取ua if uaClient == "" { uaClient = c.GetHeader("User-Agent") if uaClient == "" { uaClient = "Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 4LTE MIUI/6.9.1)" } } // 获取ip checkReqSourceFlag, err := ads_checker.CheckReqSource(request.ReqSource) if err != nil { c.String(404, "check req source failed") return } ip := "" if checkReqSourceFlag { ip = request.ReqSourceIp } if ip=="" { ip = c.GetHeader("X-Forwarded-For") } if ip == "" { ip = c.GetHeader("X-Real-IP") } if ip == "" { ip = c.Request.RemoteAddr } if strings.Index(ip, ",") != -1 { ip = strings.Split(ip, ",")[0] } ipInfo, err := ip2region.Ip2Region(ip) if err != nil { c.String(404, "ip 2 region failed") return } // 上報 if request.NewAdsFlag == 1 { grayLogData := struct { Ip string Imei string Model string NetworkType string `json:"network_type"` Provice string City string ScreeSize string `json:"screen_size"` Ua string Brand string Androidid string `json:"android_id"` ShortMessage string `json:"short_message"` ReqSource string `json:"req_source"` }{ Ip: ip, Imei: request.Imei, Model: request.Model, NetworkType: request.NetworkType, Provice: ipInfo.Province, City: ipInfo.City, ScreeSize: request.ScreenSize, Ua: request.UaClient, Brand: request.Brand, Androidid: request.Androidid, ShortMessage: "ads_api_log", ReqSource: "zhiku", } graylog.Log(grayLogData) } cityCode, err := city.GetCityCode(ipInfo.City) if err != nil { c.String(404, "get city code failed") return } // 是否是安卓 if request.Imei =="" { device.SetAdsTagLog(advertiser, request.ReqSource, "DS_IOS", cityCode) graylog.LogApi("ios_device", request.Idfa,"", request.ReqSource) } else { device.SetAdsTagLog(advertiser, request.ReqSource,"DS_ANDRIOID", cityCode) } freqControlInterval := 600 // 深圳,东莞强行用600秒控制, 其他地区从配置读取 if strings.Index(ipInfo.City, "深圳")== -1 && strings.Index(ipInfo.City, "东莞")==-1 { // 频率控制 freqControlConf, err := redis_data.GetFreqCrontolConf(request.ReqSource) if err != nil { c.String(404, "get freq control conf failed") return } hour, _ := strconv.Atoi(time.Now().Format("01")) tmpCrontrolInterval, ok := freqControlConf.GetControlTime(hour) if ok { freqControlInterval = tmpCrontrolInterval } } lastReqTime, err := device.GetIpReqTime(ip) if err != nil { c.String(404, "get last req time failed") return } needControl := false if request.ReqSource != "wzb_h5" && lastReqTime != 0 && time.Now().Unix() - lastReqTime < int64(freqControlInterval) { // 需要凭空 needControl = true device.SetAdsTagLog(advertiser, request.ReqSource,"DS_FREQ_0", cityCode) } else { device.SetIpReqTime(ip, time.Now().Unix()) device.SetAdsTagLog(advertiser, request.ReqSource,"DS_FREQ_1", cityCode) } //### 检查是否是ip黑名单 isIpBlack, err := ads_checker.CheckBlackIp(ip) if err != nil { c.String(404, "get city code failed") return } if isIpBlack { graylog.LogApi("black_ip_list", ip,"", request.ReqSource) device.SetAdsTagLog(advertiser, request.ReqSource,"DS_BLACK_IP", cityCode) } // 获取渠道的黑白性 reqChannelFlag, err := redis_data.GetChannelFlag(request.ReqSource,"ads_req") if err != nil { c.String(404, "get req channel flag failed") return } flowWeight := reqChannelFlag.Weigth flowRandomNum := rand.Intn(100) flowFlag := 0 // 有效的百分比 if flowRandomNum <= flowWeight{ flowFlag = 1 } if reqChannelFlag.ChannelFlag == 1 { device.SetAdsTagLog(advertiser, request.ReqSource,fmt.Sprintf("DS_REQ_SOURCE_{%d}", reqChannelFlag.ChannelFlag), cityCode) } // 替换成小米的设备 replaceFlag := 0 imei := request.Imei sendPhoneType := 0 userFlag := 0 originImei := "" // 检查是否是小米的设备 specialDeviceNum := 0 if request.ReqSource == "wzb_h5" { specialDeviceNum = 6 // wzb_h5渠道只綁定一个imei, 具体愿意不知道 } if request.ReqSource == "moyuntv" || (!request.IsMiDevice() && (!isIpBlack && !needControl && reqChannelFlag.ChannelFlag ==1) && flowFlag == 1) { randomNum := 3 deviceConf, realRedisKey, err := device.GetMiDeviceConf(ip, randomNum, specialDeviceNum) if err != nil { c.String(404, "get req channel flag failed") return } if deviceConf != nil { device.SetAdsTagLog(advertiser, request.ReqSource, "DS_CACHE", cityCode) // 通过缓存请求 imei = deviceConf.Imei uaClient = deviceConf.Ua originImei = deviceConf.OriginImei if imei != "" { replaceFlag = 1 userFlag = 1 } } else { // 先从对应的城市找,找不到在走原来的逻辑 // 上报事件 graylog.LogApi("city_search_city_code", strconv.Itoa(cityCode), ipInfo.City, request.ReqSource) device.SetAdsTagLog(advertiser, request.ReqSource, "DS_CODE_REQ", cityCode) // 可做城市替换 if cityCode != 0 { device.SetAdsTagLog(advertiser, request.ReqSource, "DS_CODE", cityCode) // 替换成功 fakeImei := "" fakeDeviceConf, leftCnt, err := device.GetDailyFakeDeviceConfByCityCode(cityCode) if err != nil { c.String(404, "get device conf failed") return } // 0 没有获取到, 1 获取到了 gotCityFakeDeviceConfFlag := 0 replaceUa := "" if fakeDeviceConf != nil { device.SetAdsTagLog(advertiser, request.ReqSource, "DS_REPL", cityCode) device.SetMiDeviceConf(realRedisKey, *fakeDeviceConf) imei = fakeDeviceConf.Imei uaClient = fakeDeviceConf.Ua originImei = fakeDeviceConf.OriginImei fakeImei = fakeDeviceConf.Imei if fakeDeviceConf.Imei != "" { gotCityFakeDeviceConfFlag = 1 userFlag = 2 replaceFlag = 1 } } grayLogData := struct { ReqSource string `json:"req_source"` OldImei string `json:"old_imei"` NewImei string `json:"new_imei"` IP string `json:"ip"` City string `json:"city"` CityCode int `json:"city_code"` Province string HitFlag int `json:"hit_flag"` LeftCnt int `json:"left_cnt"` ReplaceUa string `json:"replace_ua"` ShortMessage string `json:"short_message"` }{ ReqSource: request.ReqSource, OldImei: request.Imei, NewImei: fakeImei, IP: ip, City: ipInfo.City, CityCode: cityCode, Province: ipInfo.Province, HitFlag: gotCityFakeDeviceConfFlag, LeftCnt: leftCnt, ReplaceUa: replaceUa, ShortMessage: "", } // 进行日志的上报 graylog.Log(grayLogData) } } // 解码ua_client uaClient, _ = url.QueryUnescape(uaClient) } else if request.IsMiDevice() { device.SetAdsTagLog(advertiser, request.ReqSource,"DS_MI_REAL", cityCode) // 是小米设备 userFlag = 3 sendPhoneType = 1 } // 检查下,替换后的设备是否是黑名单, 再次检查, 防止放入cache后, 新增了黑名单 isBlackImei, err := device.CheckIsBlackImei(imei, false) if err != nil { c.String(404, "get device conf failed") return } if isBlackImei { if replaceFlag == 1 { device.SetAdsTagLog(advertiser, request.ReqSource, "DS_BLACK_IMEI_REPLACE", cityCode) } else { device.SetAdsTagLog(advertiser, request.ReqSource,"DS_BLACK_IMEI", cityCode) } } // 组装公共的dsp_info dspInfo := utils.DspParam{} dspInfo.Init() dspInfo.DspCityCode = cityCode dspInfo.Imei = imei dspInfo.OriginImei = request.Imei dspInfo.OsVersion = request.OsVersion dspInfo.Mac = strings.ToUpper(request.Mac) dspInfo.OriginMac = request.Mac dspInfo.Idfa = request.Idfa dspInfo.Model = request.Model dspInfo.Brand = request.Brand dspInfo.ScreenSize = request.ScreenSize dspInfo.NetworkType = request.NetworkType dspInfo.Androidid = request.Androidid dspInfo.Platform = request.Platform dspInfo.Ip = ip dspInfo.Ua = uaClient dspInfo.City = ipInfo.City dspInfo.Province = ipInfo.Province dspInfo.UaOrigin = request.UaClient dspInfo.ReqSource = request.ReqSource if request.IsMiDevice() { dspInfo.RealMiFlag = 1 } dspInfo.ReplaceFlag = replaceFlag dspInfo.RealReqSource = request.ReqSource dspInfo.SendPhoneType = sendPhoneType md5Imei := imei if dspInfo.ReplaceFlag == 0 { md5Imei = utils.Md5(imei) } dspInfo.RealMd5Imei = md5Imei //response = {'result': 0, 'msg': 'ok','ads_result':''} //ads_item = None //xiaomi_response = [] hour, _ := strconv.Atoi(time.Now().Format("01")) canRequest := true if 0 <= hour && hour <=1 { randNum := rand.Intn(100) if randNum > 5 { canRequest = false } } var adData *addata.AdData var xiaomiResponse []addata.XiaomiAdData xiaomiRspAction := make(map[string]int, 100) var adDataNum int // 非频率控制,设备黑名单,ip黑名单,白名单渠道,并且替换了小米设备的 if canRequest && !isBlackImei && reqChannelFlag.ChannelFlag == 1 && flowFlag ==1 && !isIpBlack && advertiser == "xiaomi" && request.ReqSource != "" && !isBlackImei && !needControl && (replaceFlag==1 || request.IsMiDevice()) { adData, xiaomiResponse, xiaomiRspAction, adDataNum, err = addata.GetAdsInfos(&dspInfo, advertiser) } //can_mix_flag = 1 //xiaomi_response_flag = 0 if adData != nil && len(adData.TargetAddition) > 1 { realTarget := "" if adData.Target != ""{ md5Skip := utils.Md5(addata.Target) conf := adslib.GetConf() realTarget = conf.Host + fmt.Sprintf("?action=LOADING&req_source=%s&advertiser=video&skip=%s&brand=%s&request_id=%s&skip_other=%s", dspInfo.ReqSource, "", dspInfo.Brand, dspInfo.RequestId, md5Skip) // 塞入Redis中 redis_data.SetSkipInfo(md5Skip, adData.Target) } adData.Target = realTarget adData.JsOrderId, _ = redis_data.GetMinScriptOrderByAdv(advertiser) adData.UserAgent = uaClient if dspInfo.ReqSource =="kuxin" && adData.Target != "" { adData.DpReport = fmt.Sprintf("%s?action=DP_CLICK&advertiser=video&req_source=%s", common.get_request_host(None), dspInfo.ReqSource) adData.Dp = adslib.GetConf().DpTest } if dspInfo.SendPhoneType == 0 { device.SetAdsTagLog(advertiser,dspInfo.ReqSource,"ADS_GET", cityCode) // 广告获取成功 } else if dspInfo.SendPhoneType==1 { device.SetAdsTagLog(advertiser,dspInfo.ReqSource,"ADS_GET_1", cityCode) // 广告获取成功 } device.SetAdsTagLog(advertiser, dspInfo.ReqSource, fmt.Sprintf("ADS_USER_%d", userFlag), cityCode) // 广告类型,缓存,新用户,小米手机 // 判断这个渠道是否要去融合和融合的流量占比 mixChannelFlag, err := redis_data.GetChannelFlag(dspInfo.ReqSource, "ads_mix") if err != nil { c.String(404, "get device conf failed") return } flowRandomNum = rand.Intn(100) isOverFlow := false //flow_flag = 0 if flowRandomNum > mixChannelFlag.Weigth { isOverFlow = true } if mixChannelFlag.ChannelFlag !=1 || isOverFlow { //extra_infos = [] } adDataNew, err := xiaomi_mix.combine_mix_infos_v2(ads_item,extra_infos) // 组装返回去的action //target_addition_infos = ads_item.get('target_addition') //server_action_response = {"server_view":0,"server_click":0,"server_close":0,"server_video_finish":0,"server_video_timer":0} //for target_info in target_addition_infos: //if target_info['type']=="VIEW": //server_action_response['server_view']=1 //redis_device.set_req_source_view('xiaomi',req_source,'xiafa') //if target_info['type']=="CLICK": //server_action_response['server_click']=1 //if target_info['type']=="CLOSE": //server_action_response['server_close']=1 //if target_info['type']=="VIDEO_FINISH": //server_action_response['server_video_finish']=1 //if target_info['type']=="VIDEO_TIMER": //server_action_response['server_video_timer']=1 //response_report_flag = 1 //#增加跟随订单 //if len(target_addition_infos) == 2 and server_action_response['server_video_finish'] == 1 and req_source in ['kuxin','zhiku']: //from thirds import tt_thirds //ads_item_new =yield tt_thirds.combine_order_by(ads_item_new,dsp_info) //# 检查最后是否有click //last_target_addition_infos = ads_item_new.get('target_addition',[]) //for last_target_addition_info in last_target_addition_infos: //if last_target_addition_info['type']=="CLICK": //can_mix_flag = 0 //break //if last_target_addition_info['type']=="VIDEO_TIMER": //can_mix_flag = 0 //break //if new_ads_flag==0: //response.update(ads_item_new) //else: //encrypt_ads_item = self.prpcrypt_tools.to_encrypt_content(json.dumps(ads_item_new)) //response['ads_result']=encrypt_ads_item //hour = int(time.strftime("%H",time.localtime(time.time()))) //if (hour>=0 and hour<=23) and replace_flag==1: //random_num = abs(hash(ads_imei))%(10 ** 4) //if random_num<3000: //response_report_flag = 1 //else: //response_report_flag = 0 //if response_report_flag==1: //try: //add_beanstalk_response.BeanstalkHandle().add_ads_response_info(md5_imei,ads_ip,web.utf8(province),web.utf8(city),ads_item_new,dsp_city_code,req_source,real_imei,xiaomi_response,xiaomi_action,server_action_response,dsp_info.request_id,xiaomi_ads_data_num) //except: //log.send_try_except() } //if can_mix_flag==1: //response['result'] = 2 //response['msg'] = 'no ads' //if xiaomi_response_flag==1: //response['result'] = 0 //response['msg'] = 'ok' //#增加打底广告 //if req_source in ['kuxin','zhiku'] and freq_contro_flag==1 and device_black_flag==0: //short_message = "kong" //## 先跑定投 //from thirds import tt_thirds //ads_item,extra_item = yield tt_thirds.get_ads_infos(dsp_info,fix_flag=0,xiaomi_has_flag=xiaomi_response_flag) //## 定投没有就跑其他的 //if not extra_item: //from thirds import tt_thirds //ads_item,extra_item = yield tt_thirds.get_ads_infos(dsp_info,fix_flag=1,xiaomi_has_flag=xiaomi_response_flag) //redis_device.set_ads_tag_log(advertiser,req_source,'ADS_ZIYOU_GET',dsp_city_code) # 广告获取成功 //if extra_item: //short_message = "ads_tt_thirds" //order_name = extra_item['order_name'] //if extra_item and extra_item['order_name'] == 'mh_dsp' and xiaomi_response_flag==0: //redis_device.set_ads_tag_log(advertiser,req_source,'ADS_ZIYOU_MH',dsp_city_code) # 广告获取成功 //#如果是外部dsp,走这个逻辑 //from thirds import xiaomi_extra //extra_item,ads_item = yield xiaomi_extra.get_ads_infos(dsp_info) //short_message = "ads_vast_response" //if extra_item and extra_item['order_name']=="xiaodu_dsp" and xiaomi_response_flag==0: //redis_device.set_ads_tag_log(advertiser,req_source,'ADS_ZIYOU_XIAODU',dsp_city_code) # 广告获取成功 //from thirds import xiaodu //extra_item,_ = yield xiaodu.get_ads_infos(dsp_info) //short_message = "ads_xiaodu_response" //if extra_item is not None and short_message in ['ads_xiaodu_response','ads_vast_response','ads_tt_thirds']: //response_data_report = {} //response_data_report['ip'] = ads_ip //response_data_report['short_message'] = short_message //response_data_report['req_source'] = req_source //response_data_report['response_vast'] = json.dumps(extra_item) //response_data_report['order_name']=order_name //response_data_report['advertiser']=advertiser //log.send_to_graylog_tornado(gelf_data=response_data_report) //if short_message=="ads_tt_thirds": //from thirds import thirds_mix_xiaomi //extra_item = thirds_mix_xiaomi.mix_last_infos(extra_item,response) //if (extra_item) != None: //redis_device.set_ads_tag_log(advertiser,req_source,'ADS_ZIYOU_HAVE',dsp_city_code) # 广告获取成功 //if req_source in ['zhiku']: //response['result']=0 //response['msg']='ok' //response['ads_result']= self.prpcrypt_tools.to_encrypt_content(json.dumps(extra_item)) //self.report_graylog(json.dumps(extra_item)) //self.write(json.dumps(response)) //self.finish() //return //else: //extra_item['result']=0 //extra_item['msg']="ok" //json_response = json.dumps(extra_item) //self.report_graylog(json_response) //self.write(json_response) //self.finish() //return //redis_tools.set_ads_real_request_num(advertiser) //json_response = json.dumps(response) //try: //if new_ads_flag==0: //self.report_graylog(json_response) //redis_device.set_ads_tag_log(advertiser,req_source,'DS_REQ',dsp_city_code) # 所有请求 //except: //pass //self.write(json_response) //self.finish() c.String(200, "hehe") }