order_util.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. import time
  2. from model import ComUtils
  3. import requests
  4. import json
  5. from model.DataBaseUtils import MysqlUtils
  6. from model.DateUtils import DateUtils
  7. from model.ComUtils import *
  8. import math
  9. from model.DateUtils import DateUtils
  10. import logging
  11. from urllib import parse
  12. logging.getLogger().setLevel(logging.WARNING)
  13. db=MysqlUtils()
  14. du=DateUtils()
  15. def get_yg_vip_channel(stage, vip_id, client_id, token):
  16. url = "https://data.yifengaf.cn:443/channeldata/data/account/list"
  17. nonce = ComUtils.get_random_str()
  18. timestamp = int(time.time())
  19. signaure = ComUtils.sha1(str(token) + str(timestamp) + str(client_id) + str(nonce))
  20. params = {
  21. "client_id": client_id,
  22. "token": token,
  23. "nonce": nonce,
  24. "timestamp": timestamp,
  25. "signaure": signaure,
  26. "vip_id": vip_id,
  27. }
  28. headers = {"Content-Type": "application/json"}
  29. r = requests.post(url=url, data=json.dumps(params), headers=headers)
  30. print(r.text)
  31. task_id = json.loads(r.text).get("data").get("task_id")
  32. db.quchen_text.execute(
  33. f"replace into yangguang_path(vip_id,task_id,stage,type) values ('{vip_id}','{task_id}','{stage}','channel')")
  34. def get_yg_data(stage,vip_id,client_id,token,start,end):
  35. url = "https://data.yifengaf.cn:443/channeldata/data/orders/list"
  36. nonce=ComUtils.get_random_str()
  37. timestamp=int(time.time())
  38. signaure =ComUtils.sha1(str(token) + str(timestamp) + str(client_id) + str(nonce))
  39. params = {
  40. "client_id": client_id,
  41. "token": token,
  42. "nonce": nonce,
  43. "timestamp": timestamp,
  44. "signaure": signaure,
  45. "vip_id": vip_id,
  46. "start_time":start, # %Y-%m-%d %H:%i:%s:
  47. "end_time":end
  48. }
  49. headers={"Content-Type":"application/json"}
  50. r=requests.post(url=url,data=json.dumps(params),headers=headers)
  51. print(r.text)
  52. task_id = json.loads(r.text).get("data").get("task_id")
  53. db.quchen_text.execute(f"replace into yangguang_path(vip_id,task_id,stage,type) values ('{vip_id}','{task_id}','{stage}','order')")
  54. def parse_yg_data(vip_id,stage):
  55. url = db.quchen_text.getOne(f"select path from yangguang_path where type='channel' and vip_id={vip_id} ")
  56. r = requests.get(url).text
  57. channel_di={}
  58. a = r.split('}')
  59. for i in a[:-1]:
  60. if i[-1] != '}':
  61. b=json.loads(i + "}", strict=False)
  62. else:
  63. b=json.loads(i, strict=False)
  64. channel_di[b["channel_id"]]=b["wx_nickname"]
  65. # print(channel_di)
  66. print(f'{stage} 有channel数:{len(channel_di)}')
  67. info=db.quchen_text.getData(f"select stage,path from yangguang_path where type='order' and vip_id={vip_id}")
  68. stage=info[0][0]
  69. path=info[0][1]
  70. text=requests.get(path).text.replace('"referral_url":,','')
  71. insert_data=[]
  72. for j in text.split("}")[:-1]:
  73. if j[-1] != '}':
  74. j=j+'}'
  75. try:
  76. di=json.loads(j, strict=False)
  77. except Exception as e:
  78. print(j)
  79. print(e)
  80. if di["state"] == "未完成":
  81. continue
  82. platform = "阳光"
  83. channel_id = di["channel_id"]
  84. channel=channel_di[channel_id]
  85. user_id = di["openid"]
  86. order_time = di["create_time"]
  87. reg_time = di["user_createtime"]
  88. from_novel = di["book_name"]
  89. amount = di["money"]
  90. order_id = di["transaction_id"]
  91. date = DateUtils.str_to_stamp(order_time[:10])
  92. insert_data.append((date,stage,platform,channel,channel_id,user_id,order_time,reg_time,amount,from_novel,order_id))
  93. # print(insert_data)
  94. print("订单数:"+ str(insert_data.__len__()))
  95. db.quchen_text.executeMany("replace into `order`(date,stage,platform,channel,channel_id,"
  96. "user_id,order_time,reg_time,amount,from_novel,order_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",tuple(insert_data))
  97. def get_hs_order_task(start, end, account):
  98. url = 'https://vip.rlcps.cn/api/getMerchants'
  99. apiKey = str(account[0])
  100. apiSecurity = account[1]
  101. timestamp = str(int(time.time()))
  102. sign = md5(apiKey + timestamp + apiSecurity).upper()
  103. params = {
  104. 'apiKey': apiKey,
  105. 'apiSecurity': apiSecurity,
  106. 'timestamp': timestamp,
  107. 'sign': sign
  108. }
  109. response_result_json = requests.post(url, params).json()
  110. if 'data' not in response_result_json.keys():
  111. print('花生账号【{apiKey}】本次请求数据异常,响应报文【{result}】'.format(apiKey=apiKey, result=response_result_json))
  112. channel_data = response_result_json['data']
  113. print(f"花生账号:{account[2]} 有channel{len(channel_data)}个:{str([i['merchant_name'] for i in channel_data])}")
  114. li = []
  115. for merchant in channel_data:
  116. get_huasheng_order(start, end, account, merchant, li)
  117. if len(li) > 0:
  118. print(f"花生账号:{account[2]} 有order{len(li)}个")
  119. # print(li)
  120. db.quchen_text.executeMany("replace into ods_order values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",li)
  121. def get_huasheng_order(start,end, account, merchant,li):
  122. apiKey = str(account[0])
  123. apiSecurity = account[1]
  124. stage = account[2]
  125. timestamp = str(int(time.time()))
  126. order_url = 'https://vip.rlcps.cn/api/orderList'
  127. merchant_id = merchant['merchant_id']
  128. merchant_name = merchant['merchant_name']
  129. limit = 500
  130. for date in du.getDateLists(start,end):
  131. page = 1
  132. while True:
  133. sign = md5(apiKey + date + str(merchant_id) + timestamp + apiSecurity).upper()
  134. order_params = {
  135. 'apiKey': apiKey,
  136. 'apiSecurity': apiSecurity,
  137. 'timestamp': timestamp,
  138. 'date': date,
  139. 'merchant_id': merchant_id,
  140. 'sign': sign,
  141. 'page': page,
  142. 'limit': limit
  143. }
  144. r = requests.post(order_url, order_params)
  145. # print(r.text)
  146. response_result_json = r.json()
  147. if 'data' not in response_result_json.keys():
  148. print('花生账号【{key}】, 查询时间【{date}】, 渠道【{merchant_id}:{merchant_name}】本次请求数据异常,响应报文【{result}】'
  149. .format(key=apiKey, date=date, merchant_id=merchant_id, merchant_name=merchant_name,
  150. result=response_result_json))
  151. break
  152. if len(response_result_json['data']) == 0:
  153. break
  154. order_item_list = response_result_json['data']
  155. if len(order_item_list) == 0:
  156. break
  157. for i in order_item_list:
  158. li.append(
  159. (i['request_at'][:10],
  160. stage,
  161. '花生',
  162. merchant_name,
  163. merchant_id,
  164. i['openid'],
  165. i['request_at'],
  166. i['join_at'],
  167. i['amount'],
  168. i['book_name'],
  169. i['trans_id'] if i['trans_id'] != '' else i['order_num'],
  170. 2 if i['order_status'] == 1 else 1
  171. )
  172. )
  173. if len(order_item_list) < limit:
  174. break
  175. else:
  176. page = page + 1
  177. def save_hs_data(data):
  178. sql = 'replace INTO quchen_text.ods_order ' \
  179. ' VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
  180. db.quchen_text.executeMany(sql,data)
  181. def get_qiyue_order_task(start, end, account):
  182. """一分钟请求60次的限制"""
  183. order_list = []
  184. # 参数
  185. order_url = "https://api.zhangwenwenhua.com" + "/v1/orders"
  186. stage = account[0]
  187. token = account[1]
  188. size = 50
  189. freq=0
  190. for date in du.getDateLists(start, end):
  191. page = 1
  192. while True:
  193. timestamp = int(time.time())
  194. url = order_url + "?" + "token=" + str(token) + "&timestamp=" + str(timestamp) + "&page=" + str(
  195. page) + "&size=" + str(size) + "&date=" + date
  196. rsp=requests.get(url=url)
  197. response_result_json = rsp.json()
  198. # print(response_result_json)
  199. freq += 1
  200. if freq == 59:
  201. print("一分钟请求60次的限制 等待中")
  202. time.sleep(61)
  203. freq = 0
  204. code = response_result_json['code']
  205. if code != 0:
  206. print(stage, '七悦充值接口异常:', response_result_json)
  207. break
  208. result_data = response_result_json['data']
  209. total = result_data['total']
  210. if total <= 0:
  211. break
  212. order_item_list = result_data['data']
  213. for x in order_item_list:
  214. create_time = DateUtils.stamp_to_str(x['create_time'],'%Y-%m-%d %H:%M:%S')
  215. reg_time = DateUtils.stamp_to_str(x['user_create_time'],'%Y-%m-%d %H:%M:%S')
  216. order_list.append((
  217. create_time[:10],
  218. stage,
  219. '七悦',
  220. x['wechat_app_name'], # 公众号名称
  221. x['channel_id'],
  222. x['user_open_id'],
  223. create_time,
  224. reg_time, # 用户注册时间
  225. x['money'],
  226. x['book_name'],
  227. x['transaction_no'] if x['transaction_no'] != 0 else x['trade_no'], # 订单id
  228. x['state'])
  229. )
  230. next_page_url = result_data['next_page_url']
  231. if next_page_url is None:
  232. break
  233. page += 1
  234. # print(len(order_list))
  235. print(f'{stage} [{start}~{end}] 有订单{order_list.__len__()}')
  236. if order_list.__len__()>0:
  237. save_order(order_list)
  238. # print(order_list)
  239. def save_order(order_list):
  240. db.quchen_text.executeMany('replace into ods_order values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',order_list)
  241. print("入库成功")
  242. def get_wd_account_siteid_list(account):
  243. url = 'https://bi.reading.163.com/dist-api/siteList'
  244. consumerkey = account[0]
  245. secretkey = account[1]
  246. stage = account[3]
  247. timestamp = int(time.time() * 1000)
  248. siteid_params = {
  249. "consumerkey": consumerkey,
  250. 'secretkey': secretkey,
  251. 'timestamp': timestamp,
  252. }
  253. sorted_data = sorted(siteid_params.items(), reverse=False)
  254. s = ""
  255. for k, v in sorted_data:
  256. s = s + str(k) + "=" + str(v)
  257. sign = md5(s).lower()
  258. siteid_params['sign'] = sign
  259. consumerkey = siteid_params['consumerkey']
  260. timestamp = siteid_params['timestamp']
  261. parameter = 'consumerkey=' + str(consumerkey) + '&timestamp=' + str(timestamp) + '&sign=' + str(sign)
  262. get_url = url + "?" + parameter
  263. while True:
  264. r = requests.get(url=get_url)
  265. if r.status_code == 200:
  266. break
  267. try:
  268. id_key_list = r.json()['data']
  269. except:
  270. return []
  271. mpid_list = []
  272. try:
  273. for id_key_val in id_key_list:
  274. mpid = dict(id_key_val)["mpId"]
  275. mpid_list.append(mpid)
  276. except Exception as e:
  277. print(stage, '站点查询返回结果:', r.json())
  278. return mpid_list
  279. def get_wending_json_object(url,params):
  280. params['timestamp'] = int(time.time()*1000)
  281. sorted_data = sorted(params.items(),reverse = False)
  282. s=""
  283. for k,v in sorted_data:
  284. s = s+str(k)+"="+str(v)
  285. sign = md5(s).lower()
  286. params['sign'] = sign
  287. consumerkey = params['consumerkey']
  288. secretkey = params['secretkey']
  289. timestamp = params['timestamp']
  290. siteid = params['siteid']
  291. pageSize = params['pageSize']
  292. starttime = params['starttime']
  293. endtime = params['endtime']
  294. page = params['page']
  295. ## +'&secretkey='+str(secretkey)
  296. parameter = 'consumerkey='+str(consumerkey)+'&timestamp='+str(timestamp)+'&siteid='+str(siteid)+'&pageSize='+str(pageSize)\
  297. +'&starttime='+str(starttime)+'&endtime='+str(endtime)+'&page='+str(page)+'&sign='+str(sign)
  298. global get_url
  299. get_url = url+"?"+parameter
  300. while True:
  301. r= requests.get(url=get_url)
  302. if r.status_code==200:
  303. break
  304. else:
  305. time.sleep(1)
  306. print("请求连接出错,等待1s...")
  307. response_result_json=r.json()
  308. del params['sign']
  309. return response_result_json
  310. def get_wd_order_task(start,end,account):
  311. order_list = []
  312. url = 'https://bi.reading.163.com/dist-api/rechargeList'
  313. consumerkey = account[0]
  314. secretkey = account[1]
  315. siteid = account[2]
  316. stage = account[3]
  317. siteid_list = get_wd_account_siteid_list(account)
  318. # print(siteid_list)
  319. if len(siteid_list) == 0:
  320. siteid_list.append(siteid)
  321. starttime = du.date_str_to_str(start)+'0000'
  322. endtime = du.date_str_to_str(end)+'2359'
  323. for siteid in siteid_list:
  324. page = 1
  325. while True:
  326. params = {
  327. 'consumerkey': consumerkey,
  328. 'secretkey': secretkey,
  329. 'timestamp': int(1601481600),
  330. 'siteid': siteid,
  331. 'pageSize': 1000,
  332. 'starttime': starttime,
  333. 'endtime': endtime,
  334. 'page': page}
  335. response_result_json = get_wending_json_object(url, params)
  336. # print(response_result_json)
  337. order_item_list = response_result_json['data']['rechargeList']
  338. for x in order_item_list:
  339. order_time = DateUtils.stamp_to_str(x['createTime'])
  340. reg_time = DateUtils.stamp_to_str(x['userRegisterTime'])
  341. order_list.append(
  342. (order_time[:10],
  343. stage,
  344. '文鼎',
  345. x['wx_mpName'],
  346. x['wx_originalId'],
  347. x['wx_user_openId'],
  348. order_time,
  349. reg_time,
  350. x['money'] / 100,
  351. x['bookTitle'] if x['bookTitle'] else '',
  352. x['ewTradeId'] if x.get('ewTradeId') else x['rechargeUuid'],
  353. 2 if x['payStatus'] == 1 else 1
  354. )
  355. )
  356. if len(order_item_list) < 1000:
  357. break
  358. else:
  359. page += 1
  360. print(f"{stage} [{start}~{end}] 有订单 {order_list.__len__()}")
  361. if order_list.__len__()>0:
  362. # print(order_list)
  363. save_order(order_list)
  364. def get_zd_order_task(start,end,account):
  365. """开始到结束最多90天"""
  366. order_list = []
  367. url = 'https://api.zhangdu520.com/channel/getorder'
  368. uid = account[0]
  369. appsecert = account[1]
  370. channel = account[2]
  371. stage = account[3]
  372. timestamp = int(time.time())
  373. sign = md5(str(uid) + '&' + appsecert + '&' + str(timestamp))
  374. for i in du.split_date2(start, end, 90):
  375. starttime = DateUtils.str_to_stamp(i[0]+' 00:00:00','%Y-%m-%d %H:%M:%S')
  376. endtime = DateUtils.str_to_stamp(i[1]+' 23:59:59','%Y-%m-%d %H:%M:%S')
  377. page = 1
  378. while True:
  379. params = {
  380. 'uid': uid,
  381. 'timestamp': timestamp,
  382. 'sign': sign,
  383. 'starttime': starttime,
  384. 'endtime': endtime,
  385. 'page': page
  386. }
  387. response_result_json = requests.get(url=url, params=params).json()
  388. # print(response_result_json)
  389. if 'data' not in response_result_json.keys():
  390. print(f'掌读账号【{uid}】, 查询时间【{i[0]} - {i[1]}】,本次请求数据异常,响应报文【{response_result_json}】')
  391. break
  392. result_data = response_result_json['data']
  393. page_count = result_data['pageCount']
  394. if page_count == 0:
  395. break
  396. order_item_list = result_data['list']
  397. for i in order_item_list:
  398. order_time = DateUtils.stamp_to_str(i['ctime'])
  399. reg_time = DateUtils.stamp_to_str(i['regtime'])
  400. order_list.append((
  401. order_time[:10],
  402. stage,
  403. '掌读',
  404. channel,
  405. uid,
  406. i['openid'],
  407. order_time,
  408. reg_time,
  409. i['amount'],
  410. i['book_entry'],
  411. i['orderno'],
  412. 2 if i['status'] == '1' else 1
  413. ))
  414. if page == page_count: # 是最后一页
  415. break
  416. page = page + 1
  417. print(f"{channel} [{start}]~[{end}] 有订单 {order_list.__len__()}")
  418. if len(order_list) > 0:
  419. # print(order_list)
  420. save_order(order_list)
  421. def get_zzy_order_task(start, end, account):
  422. url = 'https://inovel.818tu.com/partners/channel/channels/list?'
  423. key = account[0]
  424. secert = account[1]
  425. stage = account[2]
  426. sign = md5(secert + 'key=' + key)
  427. params = 'key=' + key + '&sign=' + sign
  428. response_result_json = requests.get(url + params).json() # 获取子渠道列表
  429. if 'data' not in response_result_json.keys():
  430. print('掌中云账号【{key}】本次请求数据异常,响应报文【{result}】'.format(key=key, result=response_result_json))
  431. return
  432. items = response_result_json['data']['items']
  433. print(f'VIP{account[0]} 有公众号{len(items)} ')
  434. total_order_list = []
  435. for channel in items:
  436. # 获取channel_id 后逐个拉取历史orders
  437. order_list = get_zzy_channel_order(start, end, account, channel)
  438. total_order_list.extend(order_list)
  439. print(f"{stage} [{start}]~[{end}] 有订单{total_order_list.__len__()}")
  440. if len(total_order_list) > 0:
  441. save_order(total_order_list)
  442. def get_zzy_channel_order(start, end, account, channel):
  443. get_time=DateUtils.str_to_date_str(start, f2="%Y-%m-%dT%H:%M:%S+08:00")
  444. limit_time=DateUtils.str_to_date_str(end, f2="%Y-%m-%dT%H:%M:%S+08:00")
  445. order_list = []
  446. key = account[0]
  447. secert = account[1]
  448. stage = account[2]
  449. order_url = 'https://openapi.818tu.com/partners/channel/orders/list?'
  450. channel_id = channel['id']
  451. channel_name = channel['nickname']
  452. status = str(1)
  453. page = str(1)
  454. per_page = str(1000)
  455. gte = parse.urlencode({'created_at[gte]': get_time}) # gte就是ge 大于等于开始时间
  456. lt = parse.urlencode({'created_at[lt]': limit_time}) # 小于 结束时间
  457. while True:
  458. sign = md5(secert + 'channel_id=' + str(
  459. channel_id) + '&created_at[gte]=' + get_time + '&created_at[lt]=' + limit_time + '&key=' + key + '&page=' + str(
  460. page) + '&per_page=' + per_page + '&status=' + status)
  461. params = 'channel_id=' + str(channel_id) + '&' + gte + '&' + lt + '&page=' + str(
  462. page) + '&per_page=' + per_page + '&status=' + status + '&key=' + key + '&sign=' + sign
  463. while True:
  464. r = requests.get(order_url + params)
  465. if r.status_code == 200:
  466. response_result_json = r.json()
  467. break
  468. else:
  469. time.sleep(61)
  470. print("掌中云接口调用sleep 61s...")
  471. # print(response_result_json)
  472. if 'data' not in response_result_json.keys():
  473. print(f'掌中云账号【{key}】,查询时间【{start} - {end}】,渠道【{channel_name}】本次请求数据异常,响应报文【{r.text}】')
  474. break
  475. total_count = response_result_json['data']['count'] # 总数量
  476. order_item_list = response_result_json['data']['items'] # 订单列表
  477. for i in order_item_list:
  478. order_time = DateUtils.str_to_date_str(i['created_at'], "%Y-%m-%dT%H:%M:%S+08:00", "%Y-%m-%d %H:%M:%S")
  479. reg_time = DateUtils.str_to_date_str(i['member']['created_at'], "%Y-%m-%dT%H:%M:%S+08:00", "%Y-%m-%d %H:%M:%S")
  480. order_list.append((
  481. order_time[:10],
  482. stage,
  483. '掌中云',
  484. channel_name,
  485. channel_id,
  486. i['member']['openid'],
  487. order_time,
  488. reg_time,
  489. round(i['price'] / 100, 2),
  490. i['from_novel']['title'] if str(i['from_novel_id']) != 'None' else '',
  491. str(i['id']),
  492. 2 if i['status'] == 1 else 1
  493. ))
  494. if int(page) >= math.ceil(total_count / int(per_page)):
  495. break
  496. page = int(page) + 1
  497. # print(f"{channel_name}获取订单:{order_list.__len__()}")
  498. # print(order_list)
  499. return order_list
  500. if __name__ == '__main__':
  501. # account = "347347942,e0c361b54a35a55c2b6296b5a80867ce,趣程小程序"
  502. # get_hs_order_task('2021-05-01','2021-05-07',account.split(","))
  503. # print(DateUtils.stamp_to_str(1612155476,'%Y-%m-%d %H:%M:%S')[:10])
  504. # exit(0)
  505. st= et = '2021-05-07'
  506. account = "62140324,KUUxPIokqtIrtvHQ,1025010,趣程19期,qucheng19qi@163.com"
  507. get_wd_order_task(st,et,account.split(','))