get_data_hourly.py 6.7 KB

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