get_cost_older.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import requests
  2. import hashlib
  3. import time
  4. import json
  5. import logging
  6. import random
  7. from concurrent.futures import ThreadPoolExecutor
  8. from model.DateUtils import DateUtils
  9. from model.DataBaseUtils import MysqlUtils
  10. from model.DingTalkUtils import DingTalkUtils
  11. from app.api_data.tx_ad_cost.get_cost_game import get_data
  12. from six import string_types
  13. from six.moves.urllib.parse import urlencode, urlunparse
  14. db = MysqlUtils()
  15. du = DateUtils()
  16. def md5value(s):
  17. md5 = hashlib.md5()
  18. md5.update(s.encode("utf-8"))
  19. return md5.hexdigest()
  20. def daily_reports_get(access_token, account_id, st, et, level, fields, err_num=0):
  21. logging.info(f'开始获取消耗数据,token:{access_token}, id:{account_id}, st:{str(st)}, et:{str(et)}')
  22. interface = 'daily_reports/get'
  23. url = 'https://api.e.qq.com/v1.3/' + interface
  24. common_parameters = {
  25. 'access_token': access_token,
  26. 'timestamp': int(time.time()),
  27. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  28. }
  29. parameters = {
  30. "account_id": account_id,
  31. "level": level,
  32. "date_range":
  33. {
  34. "start_date": st,
  35. "end_date": et
  36. },
  37. "page": 1,
  38. "page_size": 1000,
  39. "fields": fields
  40. }
  41. parameters.update(common_parameters)
  42. for k in parameters:
  43. if type(parameters[k]) is not str:
  44. parameters[k] = json.dumps(parameters[k])
  45. r = requests.get(url, params=parameters, timeout=5).json()
  46. logging.info('account_id: {} 开始获取消耗数据'.format(account_id))
  47. if r['code'] != 0:
  48. logging.warning(
  49. 'access_token:{} code:{} message:{}'.format(str(access_token), str(r['code']), str(r['message'])))
  50. if err_num < 5:
  51. time.sleep(0.1)
  52. return daily_reports_get(access_token, account_id, st, et, level, fields, err_num=err_num + 1)
  53. DingTalkUtils().send(
  54. '消耗日报请求出现问题\naccess_token:{} code:{} message:{}'.format(str(access_token), str(r['code']),
  55. str(r['message'])))
  56. return r
  57. def get_q_data(y, li, st, et):
  58. try:
  59. c = daily_reports_get(y[2], y[0], st, et, "REPORT_LEVEL_ADVERTISER", (
  60. 'date', 'view_count', 'valid_click_count', 'ctr', 'cpc', 'cost', 'web_order_count', 'web_order_rate',
  61. 'web_order_cost', 'follow_count', 'order_amount', 'order_roi', 'platform_page_view_count',
  62. 'web_commodity_page_view_count', 'from_follow_uv'))
  63. if 'data' in c.keys() and len(c["data"]["list"]) > 0:
  64. for d in c['data']['list']:
  65. d['account_id'] = y[0]
  66. logging.info('qq: ' + str(d['account_id']) + str(d["cost"]))
  67. x = d
  68. res_data = [x['date'], x['view_count'], x['valid_click_count'], x['ctr'], x['cpc'], x['cost'],
  69. x['web_order_count'], x['web_order_rate'],
  70. x['web_order_cost'], x['follow_count'], x['order_amount'], x['order_roi'],
  71. x['platform_page_view_count'], x['web_commodity_page_view_count'],
  72. x['from_follow_uv'], x['account_id']]
  73. li.append(tuple(res_data))
  74. except Exception as e:
  75. logging.error('qq account:{} error :{}'.format(str(y), str(e)))
  76. def get_v_data(y, li, st, et):
  77. try:
  78. c = daily_reports_get(y[2], y[0], st, et, "REPORT_LEVEL_ADVERTISER_WECHAT", (
  79. 'date', 'cost', 'view_count', 'valid_click_count', 'ctr', 'official_account_follow_rate', 'order_amount',
  80. 'order_roi', 'order_count', 'order_rate', 'order_unit_price', 'web_order_cost', 'first_day_order_amount',
  81. 'first_day_order_count'))
  82. if 'data' in c.keys() and len(c["data"]["list"]) > 0:
  83. for d in c['data']['list']:
  84. d['account_id'] = y[0]
  85. logging.info('vx:' + str(d['account_id']) + ' ' + str(d["cost"]))
  86. x = d
  87. res_data = [x['date'], x['cost'], x['view_count'], x['valid_click_count'], x['ctr'],
  88. x['official_account_follow_rate'],
  89. x['order_amount'], x['order_roi'], x['order_count'], x['order_rate'],
  90. x['order_unit_price'], x['web_order_cost'], x['first_day_order_amount'],
  91. x['first_day_order_count'], x['account_id']]
  92. li.append(tuple(res_data))
  93. except Exception as e:
  94. logging.error('vx account:{} error :{}'.format(str(y), str(e)))
  95. def get_vx_game_list():
  96. sql = '''select account_id,wechat_account_id,access_token,refresh_token,name,
  97. ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_vx
  98. where access_token is not null and is_game=1
  99. '''
  100. a = db.quchen_text.getData(sql)
  101. return a
  102. def get_vx_list():
  103. sql = '''select account_id,wechat_account_id,access_token,refresh_token,name,
  104. ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_vx
  105. where access_token is not null and is_game=0
  106. '''
  107. a = db.quchen_text.getData(sql)
  108. return a
  109. def get_qq_list():
  110. sql = "select account_id,'',access_token,refresh_token,name," \
  111. "ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_qq"
  112. a = db.quchen_text.getData(sql)
  113. return a
  114. def mysql_insert_daily_vx(data):
  115. logging.info('start save daily_vx info')
  116. b = """replace into daily_vx (date,cost,view_count,valid_click_count,ctr,official_account_follow_rate,order_amount,
  117. order_roi,order_count,order_rate,order_unit_price,web_order_cost,first_day_order_amount,first_day_order_count,account_id)
  118. values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
  119. db.quchen_text.executeMany(b, data)
  120. logging.info('start save daily_vx info')
  121. def mysql_insert_daily_qq(data):
  122. a = """replace into daily_qq (date,view_count,valid_click_count,ctr,cpc,cost,web_order_count,web_order_rate,
  123. web_order_cost,follow_count,order_amount,order_roi,platform_page_view_count,web_commodity_page_view_count,
  124. from_follow_uv,account_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
  125. db.quchen_text.executeMany(a, data)
  126. def get_daily_vx(st, et):
  127. token_list_v = get_vx_list()
  128. logging.info("获取vx账号:" + str(token_list_v.__len__()))
  129. time1 = time.time()
  130. executor = ThreadPoolExecutor(max_workers=10)
  131. li = []
  132. for y in token_list_v:
  133. executor.submit(get_v_data, y, li, st, et)
  134. executor.shutdown()
  135. logging.info('get_daily_vx:' + str(len(li)) + 'cost:' + str(int(time.time() - time1)))
  136. mysql_insert_daily_vx(li)
  137. def get_daily_vx_game(st, et):
  138. token_list_v = get_vx_game_list()
  139. logging.info("获取vx_game账号:" + str(token_list_v.__len__()))
  140. time1 = time.time()
  141. executor = ThreadPoolExecutor(max_workers=10)
  142. li = []
  143. for y in token_list_v:
  144. executor.submit(get_data, y, li, st, et)
  145. executor.shutdown()
  146. logging.info('get_daily_vx:' + str(len(li)) + 'cost:' + str(int(time.time() - time1)))
  147. mysql_insert_daily_vx(li)
  148. def get_daily_qq(st, et):
  149. token_list_q = get_qq_list()
  150. logging.info("获取qq账号:" + str(token_list_q.__len__()))
  151. time1 = time.time()
  152. li = []
  153. executor = ThreadPoolExecutor(max_workers=10)
  154. for x in token_list_q:
  155. executor.submit(get_q_data, x, li, st, et)
  156. executor.shutdown()
  157. logging.info('get_qq_order:' + str(len(li)) + 'cost:' + str(int(time.time() - time1)))
  158. mysql_insert_daily_qq(li)
  159. def run(st, et):
  160. logging.info('微信消耗数据拉取,开始')
  161. get_daily_vx(st, et)
  162. logging.info('微信消耗数据拉取,结束')
  163. logging.info('微信游戏消耗数据拉取,结束')
  164. get_daily_vx_game(st, et)
  165. logging.info('微信游戏消耗数据拉取,结束')
  166. # logging.info('qq消耗数据拉取,开始')
  167. # get_daily_qq(st, et)
  168. # logging.info('qq消耗数据拉取,结束')
  169. def old_cost_hourly():
  170. st = et = du.getNow()
  171. logging.info('消耗数据拉取,开始')
  172. run(st, et)
  173. logging.info('消耗数据拉取,结束')
  174. def old_cost_daily():
  175. st = du.get_n_days(-10)
  176. et = du.get_n_days(-1)
  177. run(st, et)
  178. if __name__ == '__main__':
  179. # run()
  180. # old_cost_daily()
  181. st = du.get_n_days(-10)
  182. et = du.get_n_days(0)
  183. run(st, et)