check_order.py 25 KB

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