get_data_hourly.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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 get_daily_vx():
  72. token_list_v = tl.token_list_vx
  73. time1 = time.time()
  74. executor = ThreadPoolExecutor(max_workers=max_workers)
  75. li=[]
  76. for y in token_list_v:
  77. executor.submit(get_v_data,y,li)
  78. executor.shutdown()
  79. print('get_daily_vx:', len(li), 'cost:', int(time.time()-time1))
  80. return li
  81. def get_daily_qq():
  82. token_list_q = tl.token_list_qq
  83. time1 = time.time()
  84. li=[]
  85. executor = ThreadPoolExecutor(max_workers=max_workers)
  86. for x in token_list_q:
  87. executor.submit(get_q_data,x,li)
  88. executor.shutdown()
  89. print('get_qq_order:', len(li), 'cost:', int(time.time()-time1))
  90. return tuple(li)
  91. def mysql_insert_daily_vx(data):
  92. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  93. cursor = db.cursor()
  94. time1 = time.time()
  95. 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);'
  96. try:
  97. cursor.executemany(sql2, data)
  98. db.commit()
  99. cost_time = round((time.time() - time1) / 60, 1)
  100. print('insert_daily_vx access', len(data), 'cost_minutes:', cost_time)
  101. except:
  102. db.rollback()
  103. print('insert_daily_vx defeat')
  104. def mysql_insert_daily_qq(data):
  105. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  106. cursor = db.cursor()
  107. time1 = time.time()
  108. 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);'
  109. try:
  110. cursor.executemany(sql2, data)
  111. db.commit()
  112. cost_time = round((time.time() - time1) / 60, 1)
  113. print('insert_daily_qq access', len(data), 'cost_minutes:', cost_time)
  114. except:
  115. db.rollback()
  116. print('insert_daily_qq defeat')
  117. def send_waring_email():
  118. msg_Sender = '2091961210@qq.cm' # 发送方邮箱
  119. msg_code = 'ylltzynbshmufdeh' # 发送方邮箱的授权码
  120. msg_Receiver = '2091961210@qq.cm' # 收件人邮箱
  121. subject = "数据库未按时更新" # 主题
  122. content = "数据库未按时更新" # 正文
  123. msg = MIMEText(content, _charset="utf-8")
  124. msg['Subject'] = subject
  125. msg['From'] = msg_Sender
  126. msg['To'] = msg_Receiver
  127. try:
  128. s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号
  129. s.login(msg_Sender, msg_code)
  130. s.sendmail(msg_Sender, msg_Receiver, msg.as_string())
  131. print("发送成功")
  132. except Exception as e:
  133. print("发送失败", e)
  134. finally:
  135. s.quit()
  136. def start_cost_job():
  137. mysql_insert_daily_vx(get_daily_vx())
  138. mysql_insert_daily_qq(get_daily_qq())
  139. if __name__ == '__main__':
  140. print("start_at ===================="+str(datetime.today())+"===================")
  141. max_workers = 5
  142. my_time = datetime.today().strftime('%Y-%m-%d')
  143. # my_time = '2020-11-24'
  144. if sys.argv.__len__() == 2:
  145. if sys.argv[1]=='month':
  146. fday,lday=date_util.getLastMonthDay()
  147. i=0
  148. my_time = fday.strftime("'%Y-%m-%d'")
  149. while True:
  150. my_time=(fday+timedelta(days=i)).strftime("%Y-%m-%d")
  151. print(my_time)
  152. start_cost_job()
  153. if my_time==lday.strftime("%Y-%m-%d"):
  154. exit(0)
  155. else:
  156. i+=1
  157. else:
  158. yestoday = (datetime.today() - timedelta(days=1)).strftime('%Y-%m-%d')
  159. my_time = yestoday
  160. print("跑昨天[" + yestoday + "]数据")
  161. start_cost_job()
  162. # run history data
  163. # i=3
  164. # while True:
  165. # my_time=(datetime.today()-timedelta(days=i)).strftime('%Y-%m-%d')
  166. # print("run["+my_time+"]data")
  167. # start_cost_job()
  168. # i+=1
  169. # if my_time=='2020-10-01':
  170. # break