get_order_dairly_qiyue.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # 20201120
  4. ## 20201120新添加 七悦 平台接口
  5. ## 七悦api接口地址 https://vip.zhangwenwenhua.com/uploads/attachments/open-api/open-api.pdf
  6. ########################## 七悦订单接口,返回数据格式
  7. '''
  8. {'msg': 'ok', 'code': 0,
  9. 'data': {
  10. 'current_page': 1,
  11. 'data': [
  12. {'id': 167100631495102464, 'money': 30, 'type': 1, 'state': 2, 'user_id': 101280121, 'channel_id': 14880, 'create_time': 1605062783, 'finish_time': 1605062790
  13. , 'trade_no': '20201111104622_101280121_Ykhp', 'transaction_no': '4200000845202011115590974617', 'user_open_id': 'oxw0X6zGsL6dSX-Y8lsXMhPG1_cY'
  14. , 'user_is_subscribe': 1, 'user_subscribe_time': 1605045625, 'user_create_time': 1605045625
  15. , 'referral_url': 'https://wxaef9ff2c63776f6f.wenhuazw.com/index/book/chapter?book_id=10076083&sid=1007608300004&referral_id=727741'
  16. , 'book_name': '我的超级老婆', 'book_keywords': '', 'wechat_app_id': 'wxaef9ff2c63776f6f', 'wechat_app_name': '炎兵文楼', 'channel_name': '炎兵文楼(趣程)'
  17. , 'state_desc': '完成', 'type_desc': '书币充值'}
  18. ,{...}]
  19. ,'first_page_url': 'https://api.zhangwenwenhua.com/v1/orders?page=1'
  20. , 'from': 1
  21. , 'last_page': 1
  22. , 'last_page_url': 'https://api.zhangwenwenhua.com/v1/orders?page=1'
  23. , 'next_page_url': None
  24. , 'path': 'https://api.zhangwenwenhua.com/v1/orders'
  25. , 'per_page': '10'
  26. , 'prev_page_url': None
  27. , 'to': 5
  28. , 'total': 5
  29. }
  30. }
  31. '''
  32. #########################
  33. import time
  34. import requests
  35. from concurrent.futures import ProcessPoolExecutor
  36. import requests
  37. from util import date_util
  38. from util import platform_config_util ## 账号配置
  39. from util import robust_util
  40. # from apscheduler.schedulers.blocking import BlockingScheduler
  41. from util.MySQLConnection import MySQLConnection
  42. from util import db_order_util
  43. def get_qiyue_account_list():
  44. """
  45. des cription: 七悦账号列表
  46. return: [['stage','token']] ->list
  47. """
  48. return db_order_util.get_account_info_list("七悦")
  49. def get_qiyue_order_task(st,et,account):
  50. order_list = ()
  51. url_frequency = 1
  52. # 参数
  53. order_url = "https://api.zhangwenwenhua.com" + "/v1/orders"
  54. stage = account[0]
  55. token = account[1]
  56. page = 1
  57. size = 50
  58. order_st_date = date_util.getSelfDateStr(int(st-86400),date_format='%Y-%m-%d')
  59. for i in range((et-st)//86400 + 1):
  60. statis_unix_time = et - (i+1)*86400
  61. date = date_util.getSelfDateStr(statis_unix_time,date_format='%Y-%m-%d')
  62. while True:
  63. if st == et:
  64. break
  65. if url_frequency % 6 == 0 :
  66. time.sleep(61)
  67. url_frequency += 1
  68. timestamp = int(time.time())
  69. url = order_url + "?" + "token=" + str(token) +"&timestamp=" + str(timestamp) +"&page=" + str(page) +"&size=" + str(size) +"&date=" + date
  70. response_result_json = requests.get(url=url).json()
  71. code = response_result_json['code']
  72. if code != 0:
  73. print(stage,'七悦充值接口异常:',response_result_json)
  74. break
  75. result_data = response_result_json['data']
  76. total = result_data['total']
  77. if total <= 0:
  78. break
  79. #total = result_data['total']
  80. #last_page2 = int(total//size)+1
  81. last_page = result_data['last_page']
  82. order_item_list = result_data['data']
  83. for x in order_item_list:
  84. if int(x['state']) != 2:
  85. continue
  86. y={}
  87. y['date'] = (int(x['finish_time'])+ 8 * 3600) // 86400 * 86400 - 8 * 3600
  88. y['platform'] = '七悦'
  89. y['channel'] = x['wechat_app_name'] ## 公众号名称
  90. y['channel_id'] = x['channel_id'] ## 公众号id
  91. y['from_novel'] = x['book_name'] ## 小说名称
  92. y['user_id'] = x['user_id'] ## 付费用户uid
  93. y['stage'] = stage ## 期数
  94. createTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(x['create_time']))
  95. y['order_time']= createTime ## 订单生成时间
  96. y['amount']=x['money'] ## 原数据单位:元
  97. uid_reg_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(x['user_create_time']))
  98. y['reg_time']= uid_reg_time ## 用户注册时间
  99. y['order_id']= x['id'] ## 订单id
  100. y = sorted(y.items(), key=lambda item:item[0])
  101. y = dict(y)
  102. y = tuple(y.values())
  103. order_list = order_list+((y),)
  104. '''
  105. if page == last_page:
  106. break
  107. page += 1
  108. '''
  109. next_page_url = result_data['next_page_url']
  110. if next_page_url is None:
  111. break
  112. page += 1
  113. print(f"数据日期-{order_st_date}到{date}-期数-{stage}-获取数据-{len(order_list)}条,例如: {order_list[0:1]}")
  114. return order_list
  115. @robust_util.catch_exception
  116. def get_qiyue_order(st,et,account_list):
  117. total_order_list = ()
  118. start_exec_seconds = date_util.getCurrentSecondTime()
  119. #account_list = get_qiyue_account_list()
  120. executor = ProcessPoolExecutor(max_workers=5)
  121. futures = []
  122. for account in account_list:
  123. future = executor.submit(get_qiyue_order_task, st, et, account)
  124. futures.append(future)
  125. executor.shutdown(True)
  126. for future in futures:
  127. order_list = future.result()
  128. if len(order_list) > 0:
  129. total_order_list = order_list + total_order_list
  130. print('七悦订单数量:', len(total_order_list), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  131. return total_order_list
  132. def batch_save_order(data):
  133. if data is None or len(data) == 0:
  134. print('数据为空,不执行数据库操作!')
  135. else:
  136. 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);'
  137. connect = MySQLConnection()
  138. try:
  139. num = connect.batch(sql, data)
  140. # 提交
  141. connect.commit()
  142. print('订单数据最终入库【{num}】条'.format(num=num))
  143. except Exception as e:
  144. print('订单数据入库失败:', e)
  145. finally:
  146. connect.close()
  147. def batch_save_order_new(data):
  148. if data is None or len(data) == 0:
  149. print('数据为空,不执行数据库操作!')
  150. else:
  151. sql = 'INSERT IGNORE INTO quchen_text.ods_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);'
  152. connect = MySQLConnection()
  153. try:
  154. num = connect.batch(sql, data)
  155. # 提交
  156. connect.commit()
  157. print('订单数据最终入库【{num}】条'.format(num=num))
  158. except Exception as e:
  159. print('订单数据入库失败:', e)
  160. finally:
  161. connect.close()
  162. def start_order_job():
  163. start_exec_seconds = date_util.getCurrentSecondTime()
  164. et_unix = date_util.getTodayStartTime()
  165. st_unix = et_unix - 60
  166. account_list = get_qiyue_account_list()
  167. '''
  168. ## 2个账户测试看看
  169. account_list = [
  170. ['趣程26期','eyJpdiI6IlBjV0Z4aVlWNWFUemczdWt5Y0R1QXc9PSIsInZhbHVlIjoiOHZtZUw1Q2RuVnRYd0p1M01WSWoxZz09IiwibWFjIjoiMDE2Mzk5NDFkMDkwZTBmNzU2ZWNmMWMxMzk5YWYwMWIwZmRmZjYzMTgyZDRjYTVkZGY1ZGI5ZGQxNjYyMGRiMSJ9']
  171. ,['趣程27期','eyJpdiI6IithdDArQ2hhazlxVXJKUXIzK01PQXc9PSIsInZhbHVlIjoiMjAyTEtNOUI2TlkwdklJXC9tNHgwc1E9PSIsIm1hYyI6IjA0YjE0Mjc1MWJjN2VlYmViNWM3YTRiNmI0ZDE5M2QyMDJhMGU3NjRlNTQ4MTliYTgwMzg0ZDNjYmUwY2ZmNWEifQ==']
  172. ]
  173. '''
  174. da=get_qiyue_order(st_unix,et_unix,account_list)
  175. batch_save_order(da)
  176. batch_save_order_new(da)
  177. print('订单同步执行时间(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  178. if __name__ == '__main__':
  179. print(date_util.getCurrentFormatTimeStr())
  180. start_order_job()