123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- Created on Mon May 18 13:13:00 2020
- @author: chencong
- ## amend1 20200925 11:39:00
- ## amend2
- """
- import requests
- import hashlib
- import time
- import datetime
- from urllib import parse
- import math
- import pymysql
- from apscheduler.schedulers.blocking import BlockingScheduler
- import account_list as al
- def md5value(s):
- md5 = hashlib.md5()
- md5.update(s.encode("utf-8"))
- return md5.hexdigest()
- ##《1》阅文
- def get_yuewen_order(st,et):
- url = 'https://open.yuewen.com/cpapi/wxRecharge/querychargelog'
- version = 1
- secert_list = al.yuewen_account_list
-
- for secert in secert_list:
- start_time = st
- email= secert[0]
- appsecert = secert[1]
- for i in range(int((et-st)/86400)):
- #time.sleep(61)
- t =()
- end_time = min(start_time+86400,et)
- timestamp = int(time.time())
- s=''
- page = 1
- order_status = 2
- data = {
- 'email':email,
- 'version':version,
- 'timestamp':timestamp,
- 'start_time':start_time,
- 'end_time':end_time,
- 'page':page,
- 'order_status':order_status
- #'last_min_id':last_min_id,
- #'last_max_id':last_max_id,
- #'total_count':total_count,
- #'last_page':last_page
- }
- sorted_data = sorted(data.items())
- for k,v in sorted_data:
- s = s+str(k)+str(v)
- sign = md5value(appsecert+s).upper()
-
- data1 = {
- 'email':email,
- 'version':version,
- 'timestamp':timestamp,
- 'start_time':start_time,
- 'end_time':end_time,
- 'page':page,
- 'order_status':order_status,
- 'sign':sign
- }
- list1 = requests.get(url=url,params=data1)
- total_count = list1.json()['data']['total_count']
- last_min_id = list1.json()['data']['min_id']
- last_max_id = list1.json()['data']['max_id']
- last_page = list1.json()['data']['page']
- if total_count>0:
- for x in list1.json()['data']['list']:
- y={}
- dtime = datetime.datetime.strptime(x['order_time'],"%Y-%m-%d %H:%M:%S")
- y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
- y['platform'] = '阅文'
- y['channel'] = x['app_name']
- y['from_novel'] = x['book_name']
- y['user_id'] = x['openid']
- y['stage'] = ''
- y['channel_id']= 0
- y['order_time']=x['order_time']
- y['amount']=x['amount']
- y['reg_time']=x['reg_time']
- y['order_id']=x['order_id']
- """
- del x['app_name']
- del x['order_status']
- del x['order_type']
- del x['openid']
- del x['user_name']
- del x['sex']
- del x['channel_name']
- del x['book_id']
- del x['book_name']
- del x['report_status']
- """
- y = sorted(y.items(), key=lambda item:item[0])
- y = dict(y)
- y = tuple(y.values())
- t = t+((y),)
- if total_count>100:
- for page in range(2,math.ceil(total_count/100)+1):
- data = {
- 'email':email,
- 'version':version,
- 'timestamp':timestamp,
- 'start_time':start_time,
- 'end_time':end_time,
- 'page':page,
- 'last_min_id':last_min_id,
- 'last_max_id':last_max_id,
- 'total_count':total_count,
- 'last_page':last_page,
- 'order_status':order_status
- }
- sorted_data = sorted(data.items())
- s1 = ''
- for k,v in sorted_data:
- s1 = s1 + str(k)+str(v)
- sign = md5value(appsecert+s1).upper()
- data2 = {
- 'email':email,
- 'version':version,
- 'timestamp':timestamp,
- 'start_time':start_time,
- 'end_time':end_time,
- 'page':page,
- 'last_min_id':last_min_id,
- 'last_max_id':last_max_id,
- 'total_count':total_count,
- 'last_page':last_page,
- 'order_status':order_status,
- 'sign':sign
- }
- list2 = requests.get(url=url,params=data2)
- for x in list2.json()['data']['list']:
- y={}
- dtime = datetime.datetime.strptime(x['order_time'],"%Y-%m-%d %H:%M:%S")
- y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
- y['platform'] = '阅文'
- y['channel'] = x['app_name']
- y['from_novel'] = x['book_name']
- y['user_id'] = x['openid']
- y['stage'] = ''
- y['channel_id']= 0
- y['order_time']=x['order_time']
- y['amount']=x['amount']
- y['reg_time']=x['reg_time']
- y['order_id']=x['order_id']
- """
- del x['app_name']
- del x['order_status']
- del x['order_type']
- del x['openid']
- del x['user_name']
- del x['sex']
- del x['channel_name']
- del x['book_id']
- del x['book_name']
- del x['report_status']
- """
- y= sorted(y.items(), key=lambda item:item[0])
- y = dict(y)
- y = tuple(y.values())
- t = t+((y),)
- total_count = list2.json()['data']['total_count']
- last_min_id = list2.json()['data']['min_id']
- last_max_id = list2.json()['data']['max_id']
- last_page = list2.json()['data']['page']
-
- print(email,start_time,len(t))
- start_time=start_time+86400
- if len(t)>0:
- mysql_insert_order(t)
- ##《2》掌读
- def get_zhangdu_order(st,et):
- secert_list = al.zhangdu_account_list
- url = 'https://api.zhangdu520.com/channel/getorder'
-
- for item in secert_list: #分渠道
- t=()
- uid = item[0]
- appsecert = item[1]
- channel = item[2]
- timestamp = int(time.time())
- sign = md5value(str(uid)+'&'+appsecert+'&'+str(timestamp))
- page =1
- starttime = st
- timespace = 90*3600*24
- endtime = min(et,st+timespace)
-
- for x in range((et-st)//timespace+1): #分时段
- Params = {
- 'uid':uid,
- 'timestamp':timestamp,
- 'sign':sign,
- 'starttime':starttime,
- 'endtime':endtime
- }
- list1=requests.get(url=url,params=Params)
- pageCount= list1.json()['data']['pageCount']
- if pageCount>0 :
- for a in range(1,pageCount+1): #分页
- page = a
- Params = {
- 'uid':uid,
- 'timestamp':timestamp,
- 'sign':sign,
- 'starttime':starttime,
- 'endtime':endtime,
- 'page':page
- }
- list2=requests.get(url=url,params=Params).json()
- if 'data' in list2.keys():
- for b in list2['data']['list']:
- c={}
- c['amount']=b['amount']
- c['channel_id']=uid
- c['order_id']=str(b['orderno'])
- c['order_time']=b['ctime']
- c['user_id']=b['openid']
- c['platform'] = '掌读'
- c['channel'] = channel
- c['reg_time']=b['regtime']
- c['from_novel']=''
- c['stage']=''
- c['date']= ((int(b['ctime'])+8*3600)//86400)*86400-8*3600
- """
- del b['openid']
- del b['regtime']
- del b['ip']
- del b['ua']
- del b['id']
- del b['ctime']
- del b['userid']
- del b['orderno']
- del b['source']
- del b['sourceid']
- """
- if b['status']=='1':
- #del b['status']
- del b
- x= sorted(c.items(), key=lambda item:item[0])
- x = dict(x)
- x = tuple(x.values())
- t = t+((x),)
- else:
- print(list2)
- starttime =starttime+timespace
- endtime = min(et,starttime+timespace)
- if len(t)>0:
- mysql_insert_order(t)
- print('掌读',channel,len(t))
- ##《3》花生
- def get_huasheng_order(st,et):
- apikey_list = al.huasheng_account_list
- url = 'https://vip.rlcps.cn/api/getMerchants'
- for key in apikey_list: #获取每个vip账号下的channel_id
- apiKEY=key[0]
- apiSecurity=key[1]
- stage = key[2]
- timestamp = str(int(time.time()))
- sign = md5value(apiKEY+timestamp+apiSecurity).upper()
- data = {
- 'apiKey':apiKEY,
- 'apiSecurity':apiSecurity,
- 'timestamp':timestamp,
- 'sign':sign
- }
- list0 = requests.post(url,data).json()
- t = ()
-
- for merchant in list0['data']:
- merchant_id = merchant['merchant_id']
- merchant_name = merchant['merchant_name']
- url1 = 'https://vip.rlcps.cn/api/orderList'
- start_time = st
- for i in range((et-st)//86400):
- page = 1
- date = time.strftime("%Y-%m-%d",time.localtime(start_time))
- sign = md5value(apiKEY+date+str(merchant_id)+timestamp+apiSecurity).upper()
- data1 = {
- 'apiKey':apiKEY,
- 'apiSecurity':apiSecurity,
- 'timestamp':timestamp,
- 'date':date,
- 'merchant_id':merchant_id,
- 'sign':sign,
- 'page':page
- }
- list1 = requests.post(url1,data1).json()
-
- if 'data' in list1.keys() and len(list1['data'])>0 :
-
- for i in range(int(math.ceil(list1['count']/500))):
- data2= {
- 'apiKey':apiKEY,
- 'apiSecurity':apiSecurity,
- 'timestamp':timestamp,
- 'date':date,
- 'merchant_id':merchant_id,
- 'sign':sign,
- 'page':page
- }
- list2 = requests.post(url1,data2).json()
- for x in list2['data']:
- if x['order_status']==1:
- y={}
- ##dtime = datetime.datetime.strptime(x['pay_at'],"%Y-%m-%d")
- ##y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
- y['user_id'] = x['openid']
- y['order_id']=x['trans_id']
- y['order_time'] = x['pay_at']
- y['reg_time'] = x['join_at']
- y['date'] = (start_time+8*3600)//86400*86400-8*3600
- y['channel'] = merchant_name
- y['channel_id'] = merchant_id
- y['platform'] = '花生'
- y['stage'] = stage
- y['from_novel'] = x['book_name']
- y['amount']=x['amount']
- """
- del x['order_num']
- del x['book_name']
- del x['trans_id']
- del x['pay_at']
- del x['join_at']
- del x['subscribe_at']
- del x['openid']
- del x['charge_count']
- del x['book_id']
- del x['order_status']
- del x['user_name']
- del x['spread_name']
- del x['request_at']
- """
- y= sorted(y.items(), key=lambda item:item[0])
- y = dict(y)
- y = tuple(y.values())
- t = t+((y),)
- page=page+1
- else:
- print(list1)
- start_time = start_time+86400
- if len(t)>0:
- mysql_insert_order(t)
- print(stage,merchant_name,len(t))
- ##《4》掌中云
- def get_zzy_order(st,et):
- API_list = al.zzy_account_list
- url = 'https://openapi.818tu.com/partners/channel/channels/list?'
- for x in API_list:
- my_key = x[0]
- secert = x[1]
- stage = x[2]
- my_sign=md5value(secert+'key='+my_key)
- parameter = 'key='+my_key+'&sign='+my_sign
- channel_list = requests.get(url+parameter) #获取子渠道列表
- if 'data' in channel_list.json().keys():
- items = channel_list.json()['data']['items']
- elif len(x)>3:
- #print(channel_list.json())
- my_key=x[3]
- secert=x[4]
- my_sign=md5value(secert+'key='+my_key)
- parameter = 'key='+my_key+'&sign='+my_sign
- #url = 'https://openapi.818tu.com/partners/channel/channels/list?'
- channel_list = requests.get(url+parameter)
- items = channel_list.json()['data']['items']
- else:
- print(channel_list.json())
- items = []
-
- for item in items : #获取channel_id 后逐个拉取历史orders
- r=()
- channel_id = item['id']
- channel = item['nickname']
- status = str(1)
- per_page = str(1000)
- limit_time = et
- get_time = st
- lt = parse.urlencode({'created_at[lt]':limit_time})
- gt = parse.urlencode({'created_at[gt]':get_time})
- url_1 = 'https://openapi.818tu.com/partners/channel/orders/list?'
- my_sign_1 = md5value(secert+'channel_id='+str(channel_id)+'&created_at[gt]='+get_time+'&created_at[lt]='+limit_time+'&key='+my_key+'&per_page='+per_page+'&status='+status)
- parameter_1 = 'channel_id='+str(channel_id)+'&'+gt+'&'+lt+'&per_page='+per_page+'&status='+status+'&key='+my_key+'&sign='+my_sign_1
- orders = requests.get(url_1+parameter_1)
- t = orders.json()['data']['count']//int(per_page)+1
- for page in range(1,t+1):
- my_sign_2 = md5value(secert+'channel_id='+str(channel_id)+'&created_at[gt]='+get_time+'&created_at[lt]='+limit_time+'&key='+my_key+'&page='+str(page)+'&per_page='+per_page+'&status='+status)
- parameter_2 ='channel_id='+str(channel_id)+'&'+gt+'&'+lt+'&page='+str(page)+'&per_page='+per_page+'&status='+status+'&key='+my_key+'&sign='+my_sign_2
- orders_1 = requests.get(url_1+parameter_2)
- b = orders_1.json()['data']['items']
-
- for a in b:
- c={}
- c['user_id']=str(a['member']['openid'])
- c['channel'] = channel
- c['reg_time']=a['member']['created_at']
- c['channel_id']=channel_id
- c['amount']= round(a['price']/100,2)
- c['order_id']=str(a['id'])
- c['order_time']=a['created_at']
- c['platform']='掌中云'
- c['stage']=stage
- #c['amount']=a['amount']
- dtime = datetime.datetime.strptime(a['created_at'][0:10],"%Y-%m-%d")
- c['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
-
- if str(a['from_novel_id'])!='None':
- c['from_novel']=a['from_novel']['title']
- else :
- c['from_novel']='None'
- """
- del a['member']
- del a['referral_link_id']
- del a['id']
- del a['created_at']
- del a['paid_at']
- del a['border_id']
- del a['from_novel_id']
- del a['status']
- del a['price']
- del a['agent_uid']
- """
- x= sorted(c.items(), key=lambda item:item[0])
- x = dict(x)
- x = tuple(x.values())
- r = r+((x),)
- if len(r)>0:
- mysql_insert_order(r)
-
- print('zzy',channel,len(r))
- ##《5》 悠书阁
- def get_ysg_order(st,et):
- key_list =al.ysg_account_list
- url='https://novel.youshuge.com/v2/open/orders'
- o = ()
- for key in key_list:
- host_name=key[0]
- channel_id = key[1]
- secert_key = key[2]
- channel = key[3]
- stage = key[4]
- timestamp = int(time.time())
- start_date = time.strftime("%Y-%m-%d",time.localtime(st))
- end_date = time.strftime("%Y-%m-%d",time.localtime(et))
- page = 1
- str1 = 'channel_id='+str(channel_id)+'&end_date='+end_date+'&host_name='+host_name+'&page='+str(page)+'&pay_status=1'+'&start_date='+start_date+'&time='+str(timestamp)+'&key='+secert_key
- sign = md5value(str1).upper()
- data = {
- 'sign':sign,
- 'host_name':host_name,
- 'time':timestamp,
- 'channel_id':channel_id,
- 'page':page,
- 'pay_status':1,
- 'start_date':start_date,
- 'end_date':end_date
- }
- r =requests.post(url,data).json()
-
- if 'data' in r.keys():
- if len(r['data'])>0:
- for i in range((r['data'][0]['count']-1)//100+1):
- timestamp = int(time.time())
- str1 = 'channel_id='+str(channel_id)+'&end_date='+end_date+'&host_name='+host_name+'&page='+str(page)+'&pay_status=1'+'&start_date='+start_date+'&time='+str(timestamp)+'&key='+secert_key
- sign = md5value(str1).upper()
- data2= {
- 'sign':sign,
- 'host_name':host_name,
- 'time':timestamp,
- 'channel_id':channel_id,
- 'page':page,
- 'pay_status':1,
- 'start_date':start_date,
- 'end_date':end_date
- }
- r2 = requests.post(url,data2).json()
-
- if 'data' in r2.keys():
- if len(r2['data'])>0:
- for x in r2['data']:
- y={}
- dtime = datetime.datetime.strptime(x['create_time'][0:10],"%Y-%m-%d")
- y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
- y['order_id']=x['order_num']
- y['amount']=round(int(x['price'])/100,2)
- y['order_time']=x['create_time']
- y['channel']=channel
- y['from_novel']=x['book_name']
- y['stage']=stage
- y['user_id']=x['openid']
- y['channel_id']=channel_id
- y['platform']='悠书阁'
- y['reg_time']=x['reg_time']
-
- y= sorted(y.items(), key=lambda item:item[0])
- y = dict(y)
- y = tuple(y.values())
- o = o+((y),)
- page=page+1
- if len(o)>0:
- mysql_insert_order(o)
- ## 数据导入表采用replace替换主键orderid的方法
- def mysql_insert_order(data):
- db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
- cursor = db.cursor()
- #sql = 'insert ignore into quchen_text.order_daily (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);'
- #sql = "update quchen_text.order set amount =%s where platform='掌中云' and order_id =%s"
- sql = 'replace into quchen_text.order_daily (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);'
- try:
- cursor.executemany(sql,data)
- db.commit()
- print('access insert order',len(data))
- except:
- db.rollback()
- print('defeat')
- def start_all_job():
- request_time_stamp = time.time()
- st_unix = int((request_time_stamp+8*3600)//86400*86400-8*3600-86400)
- et_unix = int((request_time_stamp+8*3600)//86400*86400-8*3600)
- st_dt = time.strftime("%Y-%m-%dT%H:%M:%S",time.localtime(st_unix))+'+08:00'
- et_dt = time.strftime("%Y-%m-%dT%H:%M:%S",time.localtime(et_unix))+'+08:00'
- get_yuewen_order(st_unix,et_unix)
- get_ysg_order(st_unix,et_unix)
- get_zhangdu_order(st_unix,et_unix)
- get_zzy_order(st_dt,et_dt)
- get_huasheng_order(st_unix,et_unix)
- start_job_time = '2020-09-26 03:05:00'
- if __name__ == '__main__':
- scheduler = BlockingScheduler()
- scheduler.add_job(start_all_job, 'interval',days=1,start_date=start_job_time)
- scheduler.start()
|