OfpayHelper.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import re
  4. import sys
  5. import time
  6. import pymysql
  7. import logging
  8. import jwt
  9. import json
  10. from datetime import datetime
  11. from mitmproxy import flowfilter
  12. from mitmproxy import http
  13. from mitmproxy import ctx
  14. sys.path.append('../')
  15. import utils.Utils as Utils
  16. sys.path.pop()
  17. """
  18. #http.HTTPFlow 实例 flow
  19. flow.request.http_version #HTTP 版本
  20. flow.request.headers #获取所有头信息,包含Host、User-Agent、Content-type等字段
  21. flow.request.cookies #cookie头
  22. flow.request.url #完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数
  23. flow.request.pretty_url #同flow.request.url目前没看出什么差别
  24. flow.request.host #域名
  25. flow.request.port #请求的目标端口
  26. flow.request.method #请求方式。POST、GET等
  27. flow.request.scheme #什么请求 ,如https
  28. flow.request.path # 请求的路径,url除域名之外的内容
  29. flow.request.get_text() #请求中body内容,有一些http会把请求参数放在body里面,那么可通过此方法获取,返回字典类型
  30. flow.request.replace() # 使用正则替换content中的内容
  31. flow.request.query #返回MultiDictView类型的数据,url直接带的键值参数
  32. flow.request.get_content()#bytes,结果如flow.request.get_text()
  33. flow.request.raw_content #bytes,结果如flow.request.get_content()
  34. flow.request.urlencoded_form #MultiDictView,content-type:application/x-www-form-urlencoded时的请求参数,不包含url直接带的键值参数
  35. flow.request.multipart_form #MultiDictView,content-type:multipart/form-data
  36. flow.request.timestamp_start #请求开始的时间戳
  37. flow.request.timestamp_end #请求结束的时间戳
  38. 时的请求参数,不包含url直接带的键值参数
  39. #以上均为获取request信息的一些常用方法,对于response,同理
  40. flow.response.status_code #状态码
  41. flow.response.headers #获取所有头信息
  42. flow.response.cookies #cookie头
  43. flow.response.text#返回内容,已解码
  44. flow.response.content #返回内容,二进制
  45. flow.response.set_text() #修改返回内容,不需要转码
  46. flow.response.replace() # 使用正则替换content中的内容
  47. flow.response.timestamp_start #响应开始的时间戳
  48. flow.response.timestamp_end #响应结束的时间戳
  49. """
  50. class OfpayHelper:
  51. order_simple_data = {
  52. "awardId": "W1155090378949787660",
  53. "activityId": "A923605206137307136",
  54. "activityName": "采集",
  55. "activityState": "2",
  56. "activityStartTime": "2024-01-01 00:00",
  57. "activityEndTime": "2888-12-31 23:59",
  58. "businessType": "4005",
  59. "outActivityCode": "eCoffee",
  60. "mobile": "",
  61. "prizeId": "sku14117",
  62. "prizeName": "数据采集成功",
  63. "prizeAlias": "",
  64. "prizeDesc": None,
  65. "prizeDescUrl": "https://mstatic.ofpay.com/marketing/upload/ca2ed3a05b2846b7909debf2df8e3495.png",
  66. "prizeBannerUrl": "https://mstatic.ofpay.com/marketing/upload/c4d1a0b94b50462eb0f040306a9badf4.png",
  67. "categoryId": "1",
  68. "rechargeType": "09",
  69. "goodsScene": "0",
  70. "goodsList": [],
  71. "orderNum": 1,
  72. "createTime": None,
  73. "imgUrl": "https://mstatic.ofpay.com/marketing/upload/7e21faea6ba94379bf16968c246cb044.png",
  74. "orderStatus": "3",
  75. "detailId": "T123456789",
  76. "clientAccount": "13430389115",
  77. "redeemCode": "",
  78. "redeemCodeStatus": "",
  79. "dynamicCodeSign": "1",
  80. "startEffectTime": "",
  81. "endEffectTime": None,
  82. "toExpireFlag": "0",
  83. "faceVal": "",
  84. "orderId": "T240226090160697",
  85. "tenantId": "0000000191",
  86. "price": "",
  87. "awardPrice": "0.0",
  88. "salePrice": "0.0",
  89. "rechargeId": "R1211608194317672448",
  90. "rechargeTime": "2024-01-01 00:00:00",
  91. "payStatus": "2",
  92. "discountPrice": "",
  93. "activityPrice": "",
  94. "customerInfo": "{\"device_id\":\"D29ED082-549A-4882-98FC-8BB881D1552B\",\"loginType\":\"interactiveIGoChoose\",\"gameAccount\":\"13430389115\",\"city_code\":\"440100\",\"cisno\":\"ZbHv0CEM2cGjx0DB9DXVJg==\",\"isNewUser\":\"0\",\"marketId\":\"M923156289016692736\",\"city_name\":\"广州市\",\"phone\":\"13430389115\",\"fromEntry\":\"APP\",\"currentTimeMillis\":\"1709515975349\",\"userUuid\":\"Pfd6kjTSmjCfQ8boswe1PpAmfgZW0acz\",\"cust_id\":\"Pfd6kjTSmjCfQ8boswe1PpAmfgZW0acz\",\"invitationCode\":\"BGCKWC\"}",
  95. "callbackOrder": "",
  96. "activityRechargeEffectStartTime": "",
  97. "activityRechargeEffectEndTime": "",
  98. "accountType": "",
  99. "payFlag": "1",
  100. "activityPayFlag": True,
  101. "thirdInfo": "{\"faceValue\":\"20.00\",\"customGatewayId\":\"ZDY_ICBC_NJFH\",\"showSign\":\"1\",\"xcxShowSign\":\"2\",\"order\":\"24\",\"toBPrice\":\"19.20\",\"appId\":\"gh_58e6ebeaa1ea\",\"showFlag\":\"eCoffee-Tims\",\"showPhone\":\"1\",\"pointActivity\":\"HD046012y3VGiMMHzP\",\"stockShowSign\":\"2\"}",
  102. "vendorVoucher": "",
  103. "productUseMsg": "",
  104. "proof": "",
  105. "amount": 1,
  106. "parentActivityNo": "",
  107. "parentDetailId": "",
  108. "subOrderExt": "{\"orderStatus\":\"\",\"payStatus\":\"\"}",
  109. "logisticsNo": "",
  110. "company": "",
  111. "promoteId": "",
  112. "version": 1,
  113. "gateWayId": "",
  114. "payType": "",
  115. "needRechargeNum": "0"
  116. }
  117. def __init__(self):
  118. self.domain_name = 'market-web.ofpay.com';
  119. self.host_ip = None;
  120. ip_address = Utils.get_ip_address(self.domain_name);
  121. if ip_address:
  122. self.host_ip = ip_address;
  123. self.db_conn = None;
  124. self.connect_mysql();
  125. def connect_mysql(self):
  126. config = {
  127. 'host':'47.106.225.136',
  128. 'port':3306,
  129. 'user':'root',
  130. 'passwd':'sjojo123456',
  131. 'database':'mitmproxy',
  132. 'charset':'utf8'
  133. };
  134. db_conn = None;
  135. while True:
  136. try:
  137. db_conn = pymysql.connect(**config);
  138. db_conn.ping(reconnect=True);
  139. except pymysql.OperationalError as e:
  140. print(e);
  141. print('连接断开,正在尝试重新连接...');
  142. if db_conn:
  143. db_conn.close();
  144. db_conn = pymysql.connect(**config);
  145. time.sleep(1);
  146. else:
  147. break;
  148. self.db_conn = db_conn;
  149. def check_host_pass(self, host):
  150. if self.host_ip:
  151. if host != self.host_ip and host != self.domain_name:
  152. return False;
  153. else:
  154. if host != self.domain_name:
  155. return False;
  156. return True;
  157. def request(self, flow: http.HTTPFlow):
  158. if not self.check_host_pass(flow.request.host):
  159. return;
  160. url = flow.request.url;
  161. path = flow.request.path;
  162. request = flow.request;
  163. def response(self, flow: http.HTTPFlow):
  164. if not self.check_host_pass(flow.request.host):
  165. return;
  166. url = flow.request.url;
  167. path = flow.request.path;
  168. print("###[OfpayHelper]path=%s"%path);
  169. if path.startswith('/h5/union/api/interactiveIGoChoose/orderList'):
  170. self.handle_orderlist(flow);
  171. def handle_orderlist(self, flow: http.HTTPFlow):
  172. ctx.log.info('###handle_orderlist###');
  173. request = flow.request;
  174. response = flow.response;
  175. cookies = dict(request.cookies) # 转换cookies格式为dict
  176. if 'unionToken_interactiveIGoChoose' not in cookies:
  177. return;
  178. account = None;
  179. try:
  180. jwt_str = cookies['unionToken_interactiveIGoChoose'];
  181. # payload = jwt.decode(jwt_str, '', algorithms=['HS256'], verify=False, options={'verify_signature':False});
  182. # info_str = payload.get('customerInfo');
  183. # 不依赖库,简单方法解析
  184. jwt_data = Utils.parse_jwt(jwt_str);
  185. info_str = None;
  186. if jwt_data:
  187. payload = jwt_data['payload'];
  188. info_str = payload['customerInfo'];
  189. if info_str:
  190. customer_info = json.loads(info_str);
  191. account = customer_info['phone'];
  192. except jwt.PyJWTError as e:
  193. print('jwt token解析失败');
  194. else:
  195. pass
  196. finally:
  197. pass
  198. if not account:
  199. return;
  200. headers = dict(request.headers);
  201. uuid = headers['UUID'];
  202. authorization = headers['Authorization'];
  203. user_agent = headers['User-Agent'];
  204. market_id = request.query.get('marketId');
  205. event_visitor_id = request.query.get('eventVisitorId');
  206. clientAccount = account if account else '13400000000';
  207. create_time = '2024-01-01 00:00:00';
  208. capture_code = Utils.generate_random_code(6);
  209. simple_data = OfpayHelper.order_simple_data;
  210. simple_data['prizeDesc'] = capture_code;
  211. simple_data['createTime'] = create_time;
  212. simple_data['endEffectTime'] = create_time;
  213. simple_data['clientAccount'] = clientAccount;
  214. simple_data['activityStartTime'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S');
  215. rsp_params = json.loads(response.get_text());
  216. if rsp_params['code'] == 'success':
  217. rsp_data = rsp_params['data'];
  218. rsp_data['list'].insert(0, simple_data);
  219. response.set_text(json.dumps(rsp_params));
  220. update_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S');
  221. sql_query = f'''
  222. CALL UpdateElifeAccountData(%s, %s, %s, %s, %s, %s, %s, %s, %s);
  223. ''';
  224. sql_params = (account, uuid, authorization, repr(cookies), user_agent, market_id, event_visitor_id, capture_code , update_time);
  225. cursor = self.db_conn.cursor();
  226. cursor.execute(sql_query, sql_params);
  227. self.db_conn.commit();
  228. cursor.close();