get_order_daily.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Mon May 18 13:13:00 2020
  5. @author: chencong
  6. ## amend1 20200927 11:39:00
  7. ## amend2
  8. """
  9. import requests
  10. import hashlib
  11. import time
  12. import datetime
  13. from urllib import parse
  14. import math
  15. import pymysql
  16. from apscheduler.schedulers.blocking import BlockingScheduler
  17. import account_list as al
  18. def md5value(s):
  19. md5 = hashlib.md5()
  20. md5.update(s.encode("utf-8"))
  21. return md5.hexdigest()
  22. ##《1》阅文
  23. def get_yuewen_order(st,et):
  24. url = 'https://open.yuewen.com/cpapi/wxRecharge/querychargelog'
  25. version = 1
  26. secert_list = al.yuewen_account_list
  27. for secert in secert_list:
  28. start_time = st
  29. email= secert[0]
  30. appsecert = secert[1]
  31. for i in range(int((et-st)/86400)):
  32. #time.sleep(61)
  33. t =()
  34. end_time = min(start_time+86400,et)
  35. timestamp = int(time.time())
  36. s=''
  37. page = 1
  38. order_status = 2
  39. data = {
  40. 'email':email,
  41. 'version':version,
  42. 'timestamp':timestamp,
  43. 'start_time':start_time,
  44. 'end_time':end_time,
  45. 'page':page,
  46. 'order_status':order_status
  47. #'last_min_id':last_min_id,
  48. #'last_max_id':last_max_id,
  49. #'total_count':total_count,
  50. #'last_page':last_page
  51. }
  52. sorted_data = sorted(data.items())
  53. for k,v in sorted_data:
  54. s = s+str(k)+str(v)
  55. sign = md5value(appsecert+s).upper()
  56. data1 = {
  57. 'email':email,
  58. 'version':version,
  59. 'timestamp':timestamp,
  60. 'start_time':start_time,
  61. 'end_time':end_time,
  62. 'page':page,
  63. 'order_status':order_status,
  64. 'sign':sign
  65. }
  66. list1 = requests.get(url=url,params=data1)
  67. total_count = list1.json()['data']['total_count']
  68. last_min_id = list1.json()['data']['min_id']
  69. last_max_id = list1.json()['data']['max_id']
  70. last_page = list1.json()['data']['page']
  71. if total_count>0:
  72. for x in list1.json()['data']['list']:
  73. y={}
  74. dtime = datetime.datetime.strptime(x['order_time'],"%Y-%m-%d %H:%M:%S")
  75. y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
  76. y['platform'] = '阅文'
  77. y['channel'] = x['app_name']
  78. y['from_novel'] = x['book_name']
  79. y['user_id'] = x['openid']
  80. y['stage'] = ''
  81. y['channel_id']= 0
  82. y['order_time']=x['order_time']
  83. y['amount']=x['amount']
  84. y['reg_time']=x['reg_time']
  85. y['order_id']=x['order_id']
  86. """
  87. del x['app_name']
  88. del x['order_status']
  89. del x['order_type']
  90. del x['openid']
  91. del x['user_name']
  92. del x['sex']
  93. del x['channel_name']
  94. del x['book_id']
  95. del x['book_name']
  96. del x['report_status']
  97. """
  98. y = sorted(y.items(), key=lambda item:item[0])
  99. y = dict(y)
  100. y = tuple(y.values())
  101. t = t+((y),)
  102. if total_count>100:
  103. for page in range(2,math.ceil(total_count/100)+1):
  104. data = {
  105. 'email':email,
  106. 'version':version,
  107. 'timestamp':timestamp,
  108. 'start_time':start_time,
  109. 'end_time':end_time,
  110. 'page':page,
  111. 'last_min_id':last_min_id,
  112. 'last_max_id':last_max_id,
  113. 'total_count':total_count,
  114. 'last_page':last_page,
  115. 'order_status':order_status
  116. }
  117. sorted_data = sorted(data.items())
  118. s1 = ''
  119. for k,v in sorted_data:
  120. s1 = s1 + str(k)+str(v)
  121. sign = md5value(appsecert+s1).upper()
  122. data2 = {
  123. 'email':email,
  124. 'version':version,
  125. 'timestamp':timestamp,
  126. 'start_time':start_time,
  127. 'end_time':end_time,
  128. 'page':page,
  129. 'last_min_id':last_min_id,
  130. 'last_max_id':last_max_id,
  131. 'total_count':total_count,
  132. 'last_page':last_page,
  133. 'order_status':order_status,
  134. 'sign':sign
  135. }
  136. list2 = requests.get(url=url,params=data2)
  137. for x in list2.json()['data']['list']:
  138. y={}
  139. dtime = datetime.datetime.strptime(x['order_time'],"%Y-%m-%d %H:%M:%S")
  140. y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
  141. y['platform'] = '阅文'
  142. y['channel'] = x['app_name']
  143. y['from_novel'] = x['book_name']
  144. y['user_id'] = x['openid']
  145. y['stage'] = ''
  146. y['channel_id']= 0
  147. y['order_time']=x['order_time']
  148. y['amount']=x['amount']
  149. y['reg_time']=x['reg_time']
  150. y['order_id']=x['order_id']
  151. """
  152. del x['app_name']
  153. del x['order_status']
  154. del x['order_type']
  155. del x['openid']
  156. del x['user_name']
  157. del x['sex']
  158. del x['channel_name']
  159. del x['book_id']
  160. del x['book_name']
  161. del x['report_status']
  162. """
  163. y= sorted(y.items(), key=lambda item:item[0])
  164. y = dict(y)
  165. y = tuple(y.values())
  166. t = t+((y),)
  167. total_count = list2.json()['data']['total_count']
  168. last_min_id = list2.json()['data']['min_id']
  169. last_max_id = list2.json()['data']['max_id']
  170. last_page = list2.json()['data']['page']
  171. print(email,start_time,len(t))
  172. start_time=start_time+86400
  173. if len(t)>0:
  174. mysql_insert_order(t)
  175. ##《2》掌读
  176. def get_zhangdu_order(st,et):
  177. secert_list = al.zhangdu_account_list
  178. url = 'https://api.zhangdu520.com/channel/getorder'
  179. for item in secert_list: #分渠道
  180. t=()
  181. uid = item[0]
  182. appsecert = item[1]
  183. channel = item[2]
  184. timestamp = int(time.time())
  185. sign = md5value(str(uid)+'&'+appsecert+'&'+str(timestamp))
  186. page =1
  187. starttime = st
  188. timespace = 90*3600*24
  189. endtime = min(et,st+timespace)
  190. for x in range((et-st)//timespace+1): #分时段
  191. Params = {
  192. 'uid':uid,
  193. 'timestamp':timestamp,
  194. 'sign':sign,
  195. 'starttime':starttime,
  196. 'endtime':endtime
  197. }
  198. list1=requests.get(url=url,params=Params)
  199. pageCount= list1.json()['data']['pageCount']
  200. if pageCount>0 :
  201. for a in range(1,pageCount+1): #分页
  202. page = a
  203. Params = {
  204. 'uid':uid,
  205. 'timestamp':timestamp,
  206. 'sign':sign,
  207. 'starttime':starttime,
  208. 'endtime':endtime,
  209. 'page':page
  210. }
  211. list2=requests.get(url=url,params=Params).json()
  212. if 'data' in list2.keys():
  213. for b in list2['data']['list']:
  214. c={}
  215. c['amount']=b['amount']
  216. c['channel_id']=uid
  217. c['order_id']=str(b['orderno'])
  218. c['order_time']=b['ctime']
  219. c['user_id']=b['openid']
  220. c['platform'] = '掌读'
  221. c['channel'] = channel
  222. c['reg_time']=b['regtime']
  223. c['from_novel']=''
  224. c['stage']=''
  225. c['date']= ((int(b['ctime'])+8*3600)//86400)*86400-8*3600
  226. """
  227. del b['openid']
  228. del b['regtime']
  229. del b['ip']
  230. del b['ua']
  231. del b['id']
  232. del b['ctime']
  233. del b['userid']
  234. del b['orderno']
  235. del b['source']
  236. del b['sourceid']
  237. """
  238. if b['status']=='1':
  239. #del b['status']
  240. del b
  241. x= sorted(c.items(), key=lambda item:item[0])
  242. x = dict(x)
  243. x = tuple(x.values())
  244. t = t+((x),)
  245. else:
  246. print(list2)
  247. starttime =starttime+timespace
  248. endtime = min(et,starttime+timespace)
  249. if len(t)>0:
  250. mysql_insert_order(t)
  251. #print('掌读',channel,len(t))
  252. ##《3》花生
  253. def get_huasheng_order(st,et):
  254. apikey_list = al.huasheng_account_list
  255. url = 'https://vip.rlcps.cn/api/getMerchants'
  256. for key in apikey_list: #获取每个vip账号下的channel_id
  257. apiKEY=key[0]
  258. apiSecurity=key[1]
  259. stage = key[2]
  260. timestamp = str(int(time.time()))
  261. sign = md5value(apiKEY+timestamp+apiSecurity).upper()
  262. data = {
  263. 'apiKey':apiKEY,
  264. 'apiSecurity':apiSecurity,
  265. 'timestamp':timestamp,
  266. 'sign':sign
  267. }
  268. list0 = requests.post(url,data).json()
  269. t = ()
  270. for merchant in list0['data']:
  271. merchant_id = merchant['merchant_id']
  272. merchant_name = merchant['merchant_name']
  273. url1 = 'https://vip.rlcps.cn/api/orderList'
  274. start_time = st
  275. for i in range((et-st)//86400):
  276. page = 1
  277. date = time.strftime("%Y-%m-%d",time.localtime(start_time))
  278. sign = md5value(apiKEY+date+str(merchant_id)+timestamp+apiSecurity).upper()
  279. data1 = {
  280. 'apiKey':apiKEY,
  281. 'apiSecurity':apiSecurity,
  282. 'timestamp':timestamp,
  283. 'date':date,
  284. 'merchant_id':merchant_id,
  285. 'sign':sign,
  286. 'page':page
  287. }
  288. list1 = requests.post(url1,data1).json()
  289. if 'data' in list1.keys() and len(list1['data'])>0 :
  290. for i in range(int(math.ceil(list1['count']/500))):
  291. data2= {
  292. 'apiKey':apiKEY,
  293. 'apiSecurity':apiSecurity,
  294. 'timestamp':timestamp,
  295. 'date':date,
  296. 'merchant_id':merchant_id,
  297. 'sign':sign,
  298. 'page':page
  299. }
  300. list2 = requests.post(url1,data2).json()
  301. for x in list2['data']:
  302. if x['order_status']==1:
  303. y={}
  304. ##dtime = datetime.datetime.strptime(x['pay_at'],"%Y-%m-%d")
  305. ##y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
  306. y['user_id'] = x['openid']
  307. y['order_id']=x['trans_id']
  308. y['order_time'] = x['pay_at']
  309. y['reg_time'] = x['join_at']
  310. y['date'] = (start_time+8*3600)//86400*86400-8*3600
  311. y['channel'] = merchant_name
  312. y['channel_id'] = merchant_id
  313. y['platform'] = '花生'
  314. y['stage'] = stage
  315. y['from_novel'] = x['book_name']
  316. y['amount']=x['amount']
  317. """
  318. del x['order_num']
  319. del x['book_name']
  320. del x['trans_id']
  321. del x['pay_at']
  322. del x['join_at']
  323. del x['subscribe_at']
  324. del x['openid']
  325. del x['charge_count']
  326. del x['book_id']
  327. del x['order_status']
  328. del x['user_name']
  329. del x['spread_name']
  330. del x['request_at']
  331. """
  332. y= sorted(y.items(), key=lambda item:item[0])
  333. y = dict(y)
  334. y = tuple(y.values())
  335. t = t+((y),)
  336. page=page+1
  337. else:
  338. print(list1)
  339. start_time = start_time+86400
  340. if len(t)>0:
  341. mysql_insert_order(t)
  342. print("huasheng",stage,merchant_name,len(t))
  343. ##《4》掌中云
  344. def get_zzy_order(st,et):
  345. API_list = al.zzy_account_list
  346. url = 'https://openapi.818tu.com/partners/channel/channels/list?'
  347. for x in API_list:
  348. my_key = x[0]
  349. secert = x[1]
  350. stage = x[2]
  351. my_sign=md5value(secert+'key='+my_key)
  352. parameter = 'key='+my_key+'&sign='+my_sign
  353. channel_list = requests.get(url+parameter) #获取子渠道列表
  354. if 'data' in channel_list.json().keys():
  355. items = channel_list.json()['data']['items']
  356. elif len(x)>3:
  357. #print(channel_list.json())
  358. my_key=x[3]
  359. secert=x[4]
  360. my_sign=md5value(secert+'key='+my_key)
  361. parameter = 'key='+my_key+'&sign='+my_sign
  362. #url = 'https://openapi.818tu.com/partners/channel/channels/list?'
  363. channel_list = requests.get(url+parameter)
  364. if 'data' in channel_list.json().keys():
  365. items = channel_list.json()['data']['items']
  366. else:
  367. print(channel_list.json())
  368. items = []
  369. else:
  370. print(channel_list.json())
  371. items = []
  372. for item in items : #获取channel_id 后逐个拉取历史orders
  373. r=()
  374. channel_id = item['id']
  375. channel = item['nickname']
  376. status = str(1)
  377. per_page = str(1000)
  378. limit_time = et
  379. get_time = st
  380. lt = parse.urlencode({'created_at[lt]':limit_time})
  381. gt = parse.urlencode({'created_at[gt]':get_time})
  382. url_1 = 'https://openapi.818tu.com/partners/channel/orders/list?'
  383. 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)
  384. parameter_1 = 'channel_id='+str(channel_id)+'&'+gt+'&'+lt+'&per_page='+per_page+'&status='+status+'&key='+my_key+'&sign='+my_sign_1
  385. orders = requests.get(url_1+parameter_1)
  386. t = int(orders.json()['data']['count'])
  387. if t > 0:
  388. t = orders.json()['data']['count']//int(per_page)+1
  389. for page in range(1,t+1):
  390. 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)
  391. 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
  392. orders_1 = requests.get(url_1+parameter_2)
  393. b = orders_1.json()['data']['items']
  394. for a in b:
  395. c={}
  396. c['user_id']=str(a['member']['openid'])
  397. c['channel'] = channel
  398. c['reg_time']=a['member']['created_at']
  399. c['channel_id']=channel_id
  400. c['amount']= round(a['price']/100,2)
  401. c['order_id']=str(a['id'])
  402. c['order_time']=a['created_at']
  403. c['platform']='掌中云'
  404. c['stage']=stage
  405. #c['amount']=a['amount']
  406. dtime = datetime.datetime.strptime(a['created_at'][0:10],"%Y-%m-%d")
  407. c['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
  408. if str(a['from_novel_id'])!='None':
  409. c['from_novel']=a['from_novel']['title']
  410. else :
  411. c['from_novel']='None'
  412. """
  413. del a['member']
  414. del a['referral_link_id']
  415. del a['id']
  416. del a['created_at']
  417. del a['paid_at']
  418. del a['border_id']
  419. del a['from_novel_id']
  420. del a['status']
  421. del a['price']
  422. del a['agent_uid']
  423. """
  424. x= sorted(c.items(), key=lambda item:item[0])
  425. x = dict(x)
  426. x = tuple(x.values())
  427. r = r+((x),)
  428. if len(r)>0:
  429. mysql_insert_order(r)
  430. print('zzy',channel,len(r))
  431. ##《5》 悠书阁
  432. def get_ysg_order(st,et):
  433. key_list =al.ysg_account_list
  434. url='https://novel.youshuge.com/v2/open/orders'
  435. o = ()
  436. for key in key_list:
  437. host_name=key[0]
  438. channel_id = key[1]
  439. secert_key = key[2]
  440. channel = key[3]
  441. stage = key[4]
  442. timestamp = int(time.time())
  443. start_date = time.strftime("%Y-%m-%d",time.localtime(st))
  444. end_date = time.strftime("%Y-%m-%d",time.localtime(et))
  445. page = 1
  446. 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
  447. sign = md5value(str1).upper()
  448. data = {
  449. 'sign':sign,
  450. 'host_name':host_name,
  451. 'time':timestamp,
  452. 'channel_id':channel_id,
  453. 'page':page,
  454. 'pay_status':1,
  455. 'start_date':start_date,
  456. 'end_date':end_date
  457. }
  458. r =requests.post(url,data).json()
  459. if 'data' in r.keys():
  460. if len(r['data'])>0:
  461. for i in range((r['data'][0]['count']-1)//100+1):
  462. timestamp = int(time.time())
  463. 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
  464. sign = md5value(str1).upper()
  465. data2= {
  466. 'sign':sign,
  467. 'host_name':host_name,
  468. 'time':timestamp,
  469. 'channel_id':channel_id,
  470. 'page':page,
  471. 'pay_status':1,
  472. 'start_date':start_date,
  473. 'end_date':end_date
  474. }
  475. r2 = requests.post(url,data2).json()
  476. if 'data' in r2.keys():
  477. if len(r2['data'])>0:
  478. for x in r2['data']:
  479. y={}
  480. dtime = datetime.datetime.strptime(x['create_time'][0:10],"%Y-%m-%d")
  481. y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
  482. y['order_id']=x['order_num']
  483. y['amount']=round(int(x['price'])/100,2)
  484. y['order_time']=x['create_time']
  485. y['channel']=channel
  486. y['from_novel']=x['book_name']
  487. y['stage']=stage
  488. y['user_id']=x['openid']
  489. y['channel_id']=channel_id
  490. y['platform']='悠书阁'
  491. y['reg_time']=x['reg_time']
  492. y= sorted(y.items(), key=lambda item:item[0])
  493. y = dict(y)
  494. y = tuple(y.values())
  495. o = o+((y),)
  496. page=page+1
  497. if len(o)>0:
  498. mysql_insert_order(o)
  499. ## 数据导入表采用replace替换主键orderid的方法
  500. def mysql_insert_order(data):
  501. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
  502. cursor = db.cursor()
  503. #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);'
  504. #sql = "update quchen_text.order set amount =%s where platform='掌中云' and order_id =%s"
  505. sql1 = '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);'
  506. sql2 = '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);'
  507. try:
  508. cursor.executemany(sql1,data)
  509. db.commit()
  510. print('access insert order_daily',len(data))
  511. except:
  512. db.rollback()
  513. print('defeat order_daily')
  514. try:
  515. cursor.executemany(sql2,data)
  516. db.commit()
  517. print('access insert order',len(data))
  518. except:
  519. db.rollback()
  520. print('defeat order')
  521. def start_all_job():
  522. request_time_stamp = time.time()
  523. st_unix = int((request_time_stamp+8*3600)//86400*86400-8*3600-86400)
  524. et_unix = int((request_time_stamp+8*3600)//86400*86400-8*3600)
  525. st_dt = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime(st_unix)) + '+08:00'
  526. et_dt = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime(et_unix)) + '+08:00'
  527. get_yuewen_order(st_unix,et_unix)
  528. get_ysg_order(st_unix,et_unix)
  529. get_zhangdu_order(st_unix,et_unix)
  530. get_zzy_order(st_dt,et_dt)
  531. get_huasheng_order(st_unix,et_unix)
  532. start_job_time = '2020-09-30 00:20:00'
  533. if __name__ == '__main__':
  534. scheduler = BlockingScheduler()
  535. scheduler.add_job(start_all_job, 'interval',days=1,start_date=start_job_time)
  536. scheduler.start()