get_data_hourly.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Thu Jun 4 15:06:05 2020
  5. @author: chencong
  6. updated by ck on 20201127
  7. """
  8. import sys
  9. import requests
  10. import hashlib
  11. import time
  12. import json
  13. import pymysql
  14. import random
  15. import token_list as tl
  16. import smtplib
  17. from email.mime.text import MIMEText
  18. from datetime import datetime,timedelta,date
  19. from concurrent.futures import ThreadPoolExecutor
  20. from datetime import datetime
  21. from util import date_util
  22. def md5value(s):
  23. md5 = hashlib.md5()
  24. md5.update(s.encode("utf-8"))
  25. return md5.hexdigest()
  26. def daily_reports_get(access_token, account_id, level, fields):
  27. interface = 'daily_reports/get'
  28. url = 'https://api.e.qq.com/v1.1/' + interface
  29. common_parameters = {
  30. 'access_token': access_token,
  31. 'timestamp': int(time.time()),
  32. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  33. }
  34. parameters = {
  35. "account_id": account_id,
  36. "level": level,
  37. "date_range":
  38. {
  39. "start_date": my_time,
  40. "end_date": my_time
  41. },
  42. "page": 1,
  43. "page_size": 1000,
  44. "fields": fields
  45. }
  46. parameters.update(common_parameters)
  47. for k in parameters:
  48. if type(parameters[k]) is not str:
  49. parameters[k] = json.dumps(parameters[k])
  50. r = requests.get(url, params=parameters)
  51. return r.json()
  52. def get_q_data(x,li):
  53. a = daily_reports_get(x[2], x[0], "REPORT_LEVEL_ADVERTISER", (
  54. 'date', 'view_count', 'valid_click_count', 'ctr', 'cpc', 'cost', 'web_order_count', 'web_order_rate',
  55. 'web_order_cost', 'follow_count', 'order_amount', 'order_roi', 'platform_page_view_count',
  56. 'web_commodity_page_view_count', 'from_follow_uv'))
  57. for b in a['data']['list']:
  58. b['account_id'] = x[0]
  59. y = tuple(b.values())
  60. li.append(y)
  61. def get_v_data(y,li):
  62. c = daily_reports_get(y[2], y[0], "REPORT_LEVEL_ADVERTISER_WECHAT", (
  63. 'date', 'cost', 'view_count', 'valid_click_count', 'ctr', 'official_account_follow_rate', 'order_amount',
  64. 'order_roi', 'order_count', 'order_rate', 'order_unit_price', 'web_order_cost', 'first_day_order_amount',
  65. 'first_day_order_count'))
  66. if 'data' in c.keys():
  67. for d in c['data']['list']:
  68. d['account_id'] = y[0]
  69. x = tuple(d.values())
  70. li.append(x)
  71. def mysql_select(sql):
  72. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  73. cur=db.cursor()
  74. cur.execute(sql)
  75. data=cur.fetchall()
  76. return data
  77. def get_vx_list():
  78. sql="select account_id,wechat_account_id,access_token,refresh_token,name," \
  79. "ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_vx"
  80. a= mysql_select(sql)
  81. return a
  82. def get_qq_list():
  83. sql = "select account_id,'',access_token,refresh_token,name," \
  84. "ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_qq"
  85. a = mysql_select(sql)
  86. return a
  87. def get_vx_list_new():
  88. sql="select account_id,wechat_account_id,access_token,refresh_token,name," \
  89. "ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_vx " \
  90. " where create_time>='{}'".format(date_util.get_n_day(-1))
  91. a= mysql_select(sql)
  92. return a
  93. def get_qq_list_new():
  94. sql = "select account_id,'',access_token,refresh_token,name," \
  95. "ifnull(stage,''),ifnull(pitcher,''),ifnull(platform,''),ifnull(book,'') from advertiser_qq " \
  96. " where create_time>='{}'".format(date_util.get_n_day(-1))
  97. a = mysql_select(sql)
  98. return a
  99. def get_daily_vx():
  100. token_list_v =get_vx_list_new() if run_new else get_vx_list()
  101. print("获取vx账号:",token_list_v.__len__())
  102. time1 = time.time()
  103. executor = ThreadPoolExecutor(max_workers=max_workers)
  104. li=[]
  105. for y in token_list_v:
  106. executor.submit(get_v_data,y,li)
  107. executor.shutdown()
  108. print('get_daily_vx:', len(li), 'cost:', int(time.time()-time1))
  109. return li
  110. def get_daily_qq():
  111. token_list_q = get_qq_list_new() if run_new else get_qq_list()
  112. print("获取qq账号:",token_list_q.__len__())
  113. time1 = time.time()
  114. li=[]
  115. executor = ThreadPoolExecutor(max_workers=max_workers)
  116. for x in token_list_q:
  117. executor.submit(get_q_data,x,li)
  118. executor.shutdown()
  119. print('get_qq_order:', len(li), 'cost:', int(time.time()-time1))
  120. return tuple(li)
  121. def mysql_insert_daily_vx(data):
  122. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  123. cursor = db.cursor()
  124. time1 = time.time()
  125. sql2 = 'replace into daily_vx (date,cost,view_count,valid_click_count,ctr,official_account_follow_rate,order_amount,order_roi,order_count,order_rate,order_unit_price,web_order_cost,first_day_order_amount,first_day_order_count,account_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
  126. try:
  127. cursor.executemany(sql2, data)
  128. db.commit()
  129. cost_time = round((time.time() - time1) / 60, 1)
  130. print('insert_daily_vx access', len(data), 'cost_minutes:', cost_time)
  131. except:
  132. db.rollback()
  133. print('insert_daily_vx defeat')
  134. def mysql_insert_daily_qq(data):
  135. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  136. cursor = db.cursor()
  137. time1 = time.time()
  138. sql2 = 'replace into daily_qq (date,view_count,valid_click_count,ctr,cpc,cost,web_order_count,web_order_rate,web_order_cost,follow_count,order_amount,order_roi,platform_page_view_count,web_commodity_page_view_count,from_follow_uv,account_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
  139. try:
  140. cursor.executemany(sql2, data)
  141. db.commit()
  142. cost_time = round((time.time() - time1) / 60, 1)
  143. print('insert_daily_qq access', len(data), 'cost_minutes:', cost_time)
  144. except:
  145. db.rollback()
  146. print('insert_daily_qq defeat')
  147. def start_cost_job():
  148. mysql_insert_daily_vx(get_daily_vx())
  149. mysql_insert_daily_qq(get_daily_qq())
  150. if __name__ == '__main__':
  151. print("start_at ===================="+str(datetime.today())+"===================")
  152. run_new=False
  153. max_workers = 5
  154. my_time = datetime.today().strftime('%Y-%m-%d')
  155. # my_time = '2020-11-24'
  156. if sys.argv.__len__() == 2:
  157. if int(sys.argv[1])==2:
  158. my_time=(datetime.today()-timedelta(days=1)).strftime('%Y-%m-%d')
  159. start_cost_job()
  160. if int(sys.argv[1])==3:
  161. run_new = True
  162. i = 1
  163. while True:
  164. my_time=(datetime.today()-timedelta(days=i)).strftime('%Y-%m-%d')
  165. print("run["+my_time+"]data")
  166. start_cost_job()
  167. if i == 15:
  168. break
  169. i+=1
  170. else:
  171. start_cost_job()
  172. """调度逻辑
  173. 1.每小时跑今天的
  174. 2.凌晨跑昨天的
  175. 3.昨天新增的账号跑前15天的
  176. """