custom.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package addata
  2. import (
  3. "math/rand"
  4. "miads/adslib/redis_data"
  5. "miads/adslib/utils"
  6. )
  7. func CombineOrderBy(adData *AdData, dsp *utils.DspParam) {
  8. ads_item, extra_item = yield get_ads_infos(dsp, order_type = 1)
  9. if extra_item == None:
  10. raise
  11. gen.Return(infos)
  12. last_target_addition = infos.get('target_addition', [])
  13. extra_item_addition = extra_item.get('target_addition', [])
  14. if len(extra_item_addition) == 0:
  15. raise
  16. gen.Return(infos)
  17. if len(extra_item_addition) == 1:
  18. last_target_addition[0]['urls'].extend(extra_item_addition[0]['urls'])
  19. raise
  20. gen.Return(infos)
  21. else:
  22. last_target_addition[0]['urls'].extend(extra_item_addition[0]['urls'])
  23. last_target_addition[1]['urls'].extend(extra_item_addition[1]['urls'])
  24. infos['target'] = extra_item['target']
  25. infos['js_order_id'] = extra_item['js_order_id']
  26. last_target_addition[1]['type'] = 'CLICK'
  27. raise
  28. gen.Return(infos)
  29. }
  30. // 获取一个广告
  31. func GetOneAds(dsp *utils.DspParam, orderType int, fixFlag int) (*redis_data.AdOrderInfo, error){
  32. // 取出广告
  33. orders, err := redis_data.GetOrderInfos(dsp, fixFlag)
  34. if err != nil {
  35. return nil, err
  36. }
  37. if len(orders) == 0 {
  38. return nil, nil
  39. }
  40. gotOrders := make([]redis_data.AdOrderInfo, 0, 1000)
  41. allKpi := int64(0)
  42. for _, order := range orders {
  43. if order.OrderType == int64(orderType) {
  44. gotOrders = append(gotOrders, order)
  45. allKpi += order.ShowKpi
  46. }
  47. }
  48. orderRange := make([]int, 0, 1000)
  49. curRateIdx := 0
  50. // orderRange中记录的是当前同索引位置的gotOrders里的order的比例上限, 比如如果有两个order [ShowKpi:40, ShowKpi: 60]
  51. // 那么orderRange就是 [rate:400, rate: 1000], 所以要按比例取order, 只需要获得在比例上限里随机取一个数, 然后判断落在那个orderRange里,
  52. // 对应去gotOrders取同索引里的order即可, 因为算法里有对小于1的比例做补偿, 所以rate上限可能超出1000, rate乘1000而不是100主要是为了
  53. // 如果showKpi差异过大, 对大量小于1的订单做补偿, 会影响整体流量分布, 这里放到1000倍, 降低补偿1的影响, 算法复杂度是O(n), 只有三个非嵌套循环
  54. for _, order := range gotOrders {
  55. rate := int(float32(order.ShowKpi) / float32(allKpi) * 1000)
  56. // 防止比例过小, 取int后变为0
  57. if rate < 1 {
  58. rate = 1
  59. }
  60. curRateIdx = curRateIdx + rate
  61. orderRange = append(orderRange, curRateIdx)
  62. }
  63. randNum := rand.Intn(curRateIdx)
  64. for i, rateRange := range orderRange {
  65. if randNum <= rateRange {
  66. return &gotOrders[i], nil
  67. }
  68. }
  69. return nil, nil
  70. }
  71. func GetAdsInfos(dsp *utils.DspParam, advertiser string, orderType int, fixFlag int, xiaomiHasFlag int) {
  72. ua = dsp.ua_client
  73. req_source = dsp.req_source
  74. ads_item = getOneAds(dsp, order_type, fix_flag)
  75. if ads_item is
  76. None:
  77. raise
  78. gen.Return((None, None))
  79. r = random.randint(0, 100)
  80. if xiaomi_has_flag == 1:
  81. if ads_item['title'].find("_ios") > 0:
  82. raise
  83. gen.Return((None, None)) else:
  84. r = random.randint(50, 100)
  85. a = datetime.now()
  86. #获取剩余时间内的值
  87. all_count = get_sub_time_value(ads_item, a)
  88. all_count = all_count * 1.0
  89. #已经投放的key
  90. show_key = "order_kpi_%s_%d%d%d_show_kpi" % (ads_item['order_id'], a.year, a.month, a.day)
  91. click_key = "order_kpi_%s_%d%d%d_click_kpi" % (ads_item['order_id'], a.year, a.month, a.day)
  92. over_kpi = redis_tools.get_key_int_value(show_key)
  93. show_kpi = ads_item['show_kpi']
  94. click_kpi = ads_item['click_kpi']
  95. if all_count < 1:
  96. raise
  97. gen.Return((None, None))
  98. plan_key = "plan_all_kpi_%s_%d%d%d_show_kpi" % (ads_item['order_id'], a.year, a.month, a.day)
  99. redis_common.redis_ads().set(plan_key, all_count, 60*24*60)
  100. w_value, rate = get_now_min_value(ads_item, all_count, show_kpi, a)
  101. if w_value < 1:
  102. w_value = 1
  103. plan_key = "plan_kpi_%s_%d%d%d_%d_show_kpi" % (ads_item['order_id'], a.year, a.month, a.day, a.hour*60 + a.minute)
  104. redis_common.redis_ads().set(plan_key, w_value, 60*24*60)
  105. over_key = "order_kpi_%s_%d%d%d_%d_show_kpi" % (ads_item['order_id'], a.year, a.month, a.day, a.hour*60 + a.minute)
  106. o_value = int(redis_tools.get_key_int_value(over_key))
  107. js_order_id = int(ads_item['js_order_id'])
  108. if o_value < w_value:
  109. order_name = ads_item['title']
  110. data =
  111. {
  112. "js_order_id":js_order_id,
  113. "target":"",
  114. "video_url":"",
  115. "duration":5,
  116. "target_addition":[],
  117. "image_url":"",
  118. "result":0,
  119. "msg":0,
  120. "user_agent":ua,
  121. "order_name":order_name
  122. }
  123. #放量
  124. redis_tools.incr_key_value(over_key)
  125. redis_tools.incr_key_value(show_key)
  126. show_url = ads_item['show_url']
  127. click_url = ads_item['click_url']
  128. target = ads_item['target_url']
  129. if order_name.find("_ios") > 0:
  130. ios_imei, ios_ua = get_ios_ua_imei(dsp)
  131. if ios_ua:
  132. data['user_agent'] = ios_ua
  133. if ads_item.get('imei_replace_flag', 0) == 1 and
  134. ios_imei:
  135. show_url = show_url.replace('__IDFA__', ios_imei)
  136. click_url = click_url.replace('__IDFA__', ios_imei)
  137. target = target.replace('__IDFA__', ios_imei)
  138. if order_name.find("__OS__") > 0:
  139. show_url = show_url.replace('__OS__', '1')
  140. click_url = click_url.replace('__OS__', '1')
  141. target = target.replace('__OS__', '1')
  142. elif
  143. order_name.find("_android") > 0 :
  144. ### 判断是否需要替换imei
  145. if ads_item.get('imei_replace_flag', 0) == 1:
  146. show_url = show_url.replace('__IMEI__', dsp.real_md5_imei)
  147. click_url = click_url.replace('__IMEI__', dsp.real_md5_imei)
  148. target = target.replace('__IMEI__', dsp.real_md5_imei)
  149. if order_name.find("__OS__") > 0:
  150. show_url = show_url.replace('__OS__', '0')
  151. click_url = click_url.replace('__OS__', '0')
  152. target = target.replace('__OS__', '0')
  153. else:
  154. if r < 40:
  155. ios_imei, ios_ua = get_ios_ua_imei(dsp)
  156. if ios_ua:
  157. data['user_agent'] = ios_ua
  158. if ads_item.get('imei_replace_flag', 0) == 1 and
  159. ios_imei:
  160. show_url = show_url.replace('__IDFA__', ios_imei)
  161. click_url = click_url.replace('__IDFA__', ios_imei)
  162. target = target.replace('__IDFA__', ios_imei)
  163. if order_name.find("__OS__") > 0:
  164. show_url = show_url.replace('__OS__', '1')
  165. click_url = click_url.replace('__OS__', '1')
  166. target = target.replace('__OS__', '1')
  167. else:
  168. if ads_item.get('imei_replace_flag', 0) == 1:
  169. show_url = show_url.replace('__IMEI__', dsp.real_md5_imei)
  170. click_url = click_url.replace('__IMEI__', dsp.real_md5_imei)
  171. target = target.replace('__IMEI__', dsp.real_md5_imei)
  172. if order_name.find("__OS__") > 0:
  173. show_url = show_url.replace('__OS__', '0')
  174. click_url = click_url.replace('__OS__', '0')
  175. target = target.replace('__OS__', '0')
  176. if order_name.find("__IP__") > 0:
  177. show_url = show_url.replace('__IP__', dsp.ip)
  178. click_url = click_url.replace('__IP__', dsp.ip)
  179. target = target.replace('__IP__', dsp.ip)
  180. if order_type == 0:
  181. addi = get_monitor_url('VIEW', 5, order_name, req_source, show_url)
  182. else:
  183. addi = get_monitor_url('VIEW', 5, order_name, 'follow', show_url)
  184. #addi['urls'].append(show_url)
  185. data['target_addition'].append(addi)
  186. r = random.randint(0, 1000)
  187. c_rate = click_kpi * 1.0 / (ads_item['show_kpi']) * 1000
  188. if r < c_rate:
  189. #下发点击
  190. addi = get_monitor_url('CLICK', 1, order_name, req_source, click_url)
  191. #addi['urls'].append(click_url)
  192. data['target_addition'].append(addi)
  193. md5_skip = hashlib.md5(target).hexdigest()
  194. redis_tools.incr_key_value(click_key)
  195. real_target = ads_config.Host + "?action=LOADING&req_source={0}&advertiser={2}&skip={1}&skip_other={3}".format(
  196. req_source, '', order_name, md5_skip)
  197. ### 塞入缓存中
  198. redis_tools.set_skip_info(md5_skip, target)
  199. data['target'] = real_target
  200. raise
  201. gen.Return((None, data))
  202. #获取当前已经放出去的次数
  203. raise gen.Return((None, None))
  204. }~