#!/usr/bin/env python # -*- coding: utf-8 -*- # 20201120 ## 20201120新添加 七悦 平台接口 ## 七悦api接口地址 https://vip.zhangwenwenhua.com/uploads/attachments/open-api/open-api.pdf ########################## 七悦订单接口,返回数据格式 ''' {'msg': 'ok', 'code': 0, 'data': { 'current_page': 1, 'data': [ {'id': 167100631495102464, 'money': 30, 'type': 1, 'state': 2, 'user_id': 101280121, 'channel_id': 14880, 'create_time': 1605062783, 'finish_time': 1605062790 , 'trade_no': '20201111104622_101280121_Ykhp', 'transaction_no': '4200000845202011115590974617', 'user_open_id': 'oxw0X6zGsL6dSX-Y8lsXMhPG1_cY' , 'user_is_subscribe': 1, 'user_subscribe_time': 1605045625, 'user_create_time': 1605045625 , 'referral_url': 'https://wxaef9ff2c63776f6f.wenhuazw.com/index/book/chapter?book_id=10076083&sid=1007608300004&referral_id=727741' , 'book_name': '我的超级老婆', 'book_keywords': '', 'wechat_app_id': 'wxaef9ff2c63776f6f', 'wechat_app_name': '炎兵文楼', 'channel_name': '炎兵文楼(趣程)' , 'state_desc': '完成', 'type_desc': '书币充值'} ,{...}] ,'first_page_url': 'https://api.zhangwenwenhua.com/v1/orders?page=1' , 'from': 1 , 'last_page': 1 , 'last_page_url': 'https://api.zhangwenwenhua.com/v1/orders?page=1' , 'next_page_url': None , 'path': 'https://api.zhangwenwenhua.com/v1/orders' , 'per_page': '10' , 'prev_page_url': None , 'to': 5 , 'total': 5 } } ''' ######################### import time import requests from concurrent.futures import ProcessPoolExecutor import requests from util import date_util from util import platform_config_util ## 账号配置 from util import robust_util # from apscheduler.schedulers.blocking import BlockingScheduler from util.MySQLConnection import MySQLConnection def get_qiyue_account_list(): """ des cription: 七悦账号列表 return: [['stage','token']] ->list """ return platform_config_util.get_account_list('七悦', 'qiyue_account_config.csv') def get_qiyue_order_task(st,et,account): order_list = () url_frequency = 1 # 参数 order_url = "https://api.zhangwenwenhua.com" + "/v1/orders" stage = account[0] token = account[1] page = 1 size = 50 order_st_date = date_util.getSelfDateStr(int(st-86400),date_format='%Y-%m-%d') for i in range((et-st)//86400 + 1): statis_unix_time = et - (i+1)*86400 date = date_util.getSelfDateStr(statis_unix_time,date_format='%Y-%m-%d') while True: if st == et: break if url_frequency % 6 == 0 : time.sleep(61) url_frequency += 1 timestamp = int(time.time()) url = order_url + "?" + "token=" + str(token) +"×tamp=" + str(timestamp) +"&page=" + str(page) +"&size=" + str(size) +"&date=" + date response_result_json = requests.get(url=url).json() code = response_result_json['code'] if code != 0: print(stage,'七悦充值接口异常:',response_result_json) break result_data = response_result_json['data'] total = result_data['total'] if total <= 0: break #total = result_data['total'] #last_page2 = int(total//size)+1 last_page = result_data['last_page'] order_item_list = result_data['data'] for x in order_item_list: if int(x['state']) != 2: continue y={} y['date'] = (int(x['finish_time'])+ 8 * 3600) // 86400 * 86400 - 8 * 3600 y['platform'] = '七悦' y['channel'] = x['wechat_app_name'] ## 公众号名称 y['channel_id'] = x['channel_id'] ## 公众号id y['from_novel'] = x['book_name'] ## 小说名称 y['user_id'] = x['user_id'] ## 付费用户uid y['stage'] = stage ## 期数 createTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(x['create_time'])) y['order_time']= createTime ## 订单生成时间 y['amount']=x['money'] ## 原数据单位:元 uid_reg_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(x['user_create_time'])) y['reg_time']= uid_reg_time ## 用户注册时间 y['order_id']= x['id'] ## 订单id y = sorted(y.items(), key=lambda item:item[0]) y = dict(y) y = tuple(y.values()) order_list = order_list+((y),) ''' if page == last_page: break page += 1 ''' next_page_url = result_data['next_page_url'] if next_page_url is None: break page += 1 print(f"数据日期-{order_st_date}到{date}-期数-{stage}-获取数据-{len(order_list)}条,例如: {order_list[0:1]}") return order_list @robust_util.catch_exception def get_qiyue_order(st,et,account_list): total_order_list = () start_exec_seconds = date_util.getCurrentSecondTime() #account_list = get_qiyue_account_list() executor = ProcessPoolExecutor(max_workers=5) futures = [] for account in account_list: future = executor.submit(get_qiyue_order_task, st, et, account) futures.append(future) executor.shutdown(True) for future in futures: order_list = future.result() if len(order_list) > 0: total_order_list = order_list + total_order_list print('七悦订单数量:', len(total_order_list), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds) return total_order_list def batch_save_order(data): if data is None or len(data) == 0: print('数据为空,不执行数据库操作!') else: 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);' connect = MySQLConnection() try: num = connect.batch(sql, data) # 提交 connect.commit() print('订单数据最终入库【{num}】条'.format(num=num)) except Exception as e: print('订单数据入库失败:', e) finally: connect.close() def batch_save_order_new(data): if data is None or len(data) == 0: print('数据为空,不执行数据库操作!') else: 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);' connect = MySQLConnection() try: num = connect.batch(sql, data) # 提交 connect.commit() print('订单数据最终入库【{num}】条'.format(num=num)) except Exception as e: print('订单数据入库失败:', e) finally: connect.close() def start_order_job(): start_exec_seconds = date_util.getCurrentSecondTime() et_unix = date_util.getTodayStartTime() st_unix = et_unix - 60 account_list = get_qiyue_account_list() ''' ## 2个账户测试看看 account_list = [ ['趣程26期','eyJpdiI6IlBjV0Z4aVlWNWFUemczdWt5Y0R1QXc9PSIsInZhbHVlIjoiOHZtZUw1Q2RuVnRYd0p1M01WSWoxZz09IiwibWFjIjoiMDE2Mzk5NDFkMDkwZTBmNzU2ZWNmMWMxMzk5YWYwMWIwZmRmZjYzMTgyZDRjYTVkZGY1ZGI5ZGQxNjYyMGRiMSJ9'] ,['趣程27期','eyJpdiI6IithdDArQ2hhazlxVXJKUXIzK01PQXc9PSIsInZhbHVlIjoiMjAyTEtNOUI2TlkwdklJXC9tNHgwc1E9PSIsIm1hYyI6IjA0YjE0Mjc1MWJjN2VlYmViNWM3YTRiNmI0ZDE5M2QyMDJhMGU3NjRlNTQ4MTliYTgwMzg0ZDNjYmUwY2ZmNWEifQ=='] ] ''' da=get_qiyue_order(st_unix,et_unix,account_list) batch_save_order(da) batch_save_order_new(da) print('订单同步执行时间(秒):', date_util.getCurrentSecondTime() - start_exec_seconds) if __name__ == '__main__': print(date_util.getCurrentFormatTimeStr()) start_order_job()