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