get_data_hourly.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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
  19. from concurrent.futures import ThreadPoolExecutor
  20. from datetime import datetime
  21. def md5value(s):
  22. md5 = hashlib.md5()
  23. md5.update(s.encode("utf-8"))
  24. return md5.hexdigest()
  25. def daily_reports_get(access_token, account_id, level, fields):
  26. interface = 'daily_reports/get'
  27. url = 'https://api.e.qq.com/v1.1/' + interface
  28. common_parameters = {
  29. 'access_token': access_token,
  30. 'timestamp': int(time.time()),
  31. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  32. }
  33. parameters = {
  34. "account_id": account_id,
  35. "level": level,
  36. "date_range":
  37. {
  38. "start_date": my_time,
  39. "end_date": my_time
  40. },
  41. "page": 1,
  42. "page_size": 1000,
  43. "fields": fields
  44. }
  45. parameters.update(common_parameters)
  46. for k in parameters:
  47. if type(parameters[k]) is not str:
  48. parameters[k] = json.dumps(parameters[k])
  49. r = requests.get(url, params=parameters)
  50. return r.json()
  51. def get_q_data(x,li):
  52. a = daily_reports_get(x[2], x[0], "REPORT_LEVEL_ADVERTISER", (
  53. 'date', 'view_count', 'valid_click_count', 'ctr', 'cpc', 'cost', 'web_order_count', 'web_order_rate',
  54. 'web_order_cost', 'follow_count', 'order_amount', 'order_roi', 'platform_page_view_count',
  55. 'web_commodity_page_view_count', 'from_follow_uv'))
  56. for b in a['data']['list']:
  57. b['account_id'] = x[0]
  58. y = tuple(b.values())
  59. li.append(y)
  60. def get_v_data(y,li):
  61. c = daily_reports_get(y[2], y[0], "REPORT_LEVEL_ADVERTISER_WECHAT", (
  62. 'date', 'cost', 'view_count', 'valid_click_count', 'ctr', 'official_account_follow_rate', 'order_amount',
  63. 'order_roi', 'order_count', 'order_rate', 'order_unit_price', 'web_order_cost', 'first_day_order_amount',
  64. 'first_day_order_count'))
  65. if 'data' in c.keys():
  66. for d in c['data']['list']:
  67. d['account_id'] = y[0]
  68. x = tuple(d.values())
  69. li.append(x)
  70. def get_daily_vx():
  71. token_list_v = tl.token_list_vx
  72. time1 = time.time()
  73. executor = ThreadPoolExecutor(max_workers=max_workers)
  74. li=[]
  75. for y in token_list_v:
  76. executor.submit(get_v_data,y,li)
  77. executor.shutdown()
  78. print('get_daily_vx:', len(li), 'cost:', int(time.time()-time1))
  79. return li
  80. def get_daily_qq():
  81. token_list_q = tl.token_list_qq
  82. time1 = time.time()
  83. li=[]
  84. executor = ThreadPoolExecutor(max_workers=max_workers)
  85. for x in token_list_q:
  86. executor.submit(get_q_data,x,li)
  87. executor.shutdown()
  88. print('get_qq_order:', len(li), 'cost:', int(time.time()-time1))
  89. return tuple(li)
  90. def mysql_insert_daily_vx(data):
  91. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  92. cursor = db.cursor()
  93. time1 = time.time()
  94. 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);'
  95. try:
  96. cursor.executemany(sql2, data)
  97. db.commit()
  98. cost_time = round((time.time() - time1) / 60, 1)
  99. print('insert_daily_vx access', len(data), 'cost_minutes:', cost_time)
  100. except:
  101. db.rollback()
  102. print('insert_daily_vx defeat')
  103. def mysql_insert_daily_qq(data):
  104. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  105. cursor = db.cursor()
  106. time1 = time.time()
  107. 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);'
  108. try:
  109. cursor.executemany(sql2, data)
  110. db.commit()
  111. cost_time = round((time.time() - time1) / 60, 1)
  112. print('insert_daily_qq access', len(data), 'cost_minutes:', cost_time)
  113. except:
  114. db.rollback()
  115. print('insert_daily_qq defeat')
  116. def send_waring_email():
  117. msg_Sender = '2091961210@qq.cm' # 发送方邮箱
  118. msg_code = 'ylltzynbshmufdeh' # 发送方邮箱的授权码
  119. msg_Receiver = '2091961210@qq.cm' # 收件人邮箱
  120. subject = "数据库未按时更新" # 主题
  121. content = "数据库未按时更新" # 正文
  122. msg = MIMEText(content, _charset="utf-8")
  123. msg['Subject'] = subject
  124. msg['From'] = msg_Sender
  125. msg['To'] = msg_Receiver
  126. try:
  127. s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号
  128. s.login(msg_Sender, msg_code)
  129. s.sendmail(msg_Sender, msg_Receiver, msg.as_string())
  130. print("发送成功")
  131. except Exception as e:
  132. print("发送失败", e)
  133. finally:
  134. s.quit()
  135. def start_cost_job():
  136. mysql_insert_daily_vx(get_daily_vx())
  137. mysql_insert_daily_qq(get_daily_qq())
  138. if __name__ == '__main__':
  139. print("start_at ===================="+str(datetime.today())+"===================")
  140. max_workers = 5
  141. my_time = datetime.today().strftime('%Y-%m-%d')
  142. # my_time = '2020-11-24'
  143. if sys.argv.__len__() == 2:
  144. yestoday = (datetime.today() - timedelta(days=1)).strftime('%Y-%m-%d')
  145. my_time = yestoday
  146. print("跑昨天[" + yestoday + "]数据")
  147. start_cost_job()
  148. # run history data
  149. # i=3
  150. # while True:
  151. # my_time=(datetime.today()-timedelta(days=i)).strftime('%Y-%m-%d')
  152. # print("run["+my_time+"]data")
  153. # start_cost_job()
  154. # i+=1
  155. # if my_time=='2020-10-01':
  156. # break