get_order_daily.py 22 KB

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