OfpayTokenCheck.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import requests
  4. import json
  5. import csv
  6. import base64
  7. from datetime import datetime, timezone, timedelta
  8. import pymysql
  9. def base64url_decode(base64_str):
  10. size = len(base64_str) % 4
  11. if size == 2:
  12. base64_str += '=='
  13. elif size == 3:
  14. base64_str += '='
  15. elif size != 0:
  16. raise ValueError('Invalid base64 string')
  17. return base64.urlsafe_b64decode(base64_str.encode('utf-8'))
  18. def parse_jwt(jwt_token):
  19. jwt_token_list = jwt_token.split('.')
  20. header = base64url_decode(jwt_token_list[0]).decode()
  21. payload = base64url_decode(jwt_token_list[1]).decode()
  22. return {
  23. 'header': json.loads(header),
  24. 'payload': json.loads(payload),
  25. 'signature': jwt_token_list[-1]
  26. }
  27. def read_csv(filename='results.csv'):
  28. data = []
  29. try:
  30. with open(filename, mode='r', encoding='utf-8') as csvfile:
  31. reader = csv.DictReader(csvfile);
  32. for row in reader:
  33. data.append(row);
  34. except IOError as e:
  35. print(f"read_csv error occurred: {e}");
  36. # print(data);
  37. return data;
  38. def read_json(filename='results.json'):
  39. data = None;
  40. try:
  41. with open(filename, 'r', encoding='utf-8') as file:
  42. data = json.load(file);
  43. except IOError as e:
  44. print(f"read_json error occurred: {e}");
  45. # print(data);
  46. return data;
  47. def seconds_to_beijing_time(seconds):
  48. utc_time = datetime.fromtimestamp(seconds, tz=timezone.utc);
  49. beijing_time = utc_time.astimezone(timezone(timedelta(hours=8)));
  50. formatted_time = beijing_time.strftime('%Y-%m-%d %H:%M:%S');
  51. return formatted_time;
  52. class OfpayChecker:
  53. def __init__(self, accout_data):
  54. self.force_refresh = True;
  55. self.accout_data = accout_data;
  56. self.host = 'market-web.ofpay.com';
  57. self.market_id = accout_data['market_id'];
  58. self.event_visitor_id = accout_data['event_visitor_id'];
  59. self.accout_id = accout_data['account'];
  60. uuid = accout_data['uuid'];
  61. user_agent = accout_data['user_agent'];
  62. authorization = accout_data['authorization'];
  63. self.cookies = eval(accout_data['cookies']);
  64. cookies_str = '; '.join([f'{key}={value}' for key, value in self.cookies.items()]);
  65. self.headers = {
  66. 'Host': self.host,
  67. 'UUID': uuid,
  68. 'Accept': '*/*',
  69. 'Sec-Fetch-Site': 'same-origin',
  70. 'Origin': 'https://market-web.ofpay.com',
  71. 'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
  72. 'Accept-Encoding': 'gzip, deflate, br',
  73. 'Sec-Fetch-Mode': 'cors',
  74. 'Content-Type': 'application/json; charset=utf-8',
  75. 'Connection': 'keep-alive',
  76. 'User-Agent': user_agent,
  77. 'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
  78. 'Authorization': authorization,
  79. 'Sec-Fetch-Dest': 'empty',
  80. 'Referer': 'https://market-web.ofpay.com/h5/union/standard/interactiveIGoChoose/index',
  81. 'Cookie': cookies_str,
  82. };
  83. self.connect_mysql();
  84. def connect_mysql(self):
  85. config = {
  86. 'host':'47.106.225.136',
  87. 'port':3306,
  88. 'user':'root',
  89. 'passwd':'sjojo123456',
  90. 'database':'mitmproxy',
  91. 'charset':'utf8'
  92. };
  93. db_conn = None;
  94. while True:
  95. try:
  96. db_conn = pymysql.connect(**config);
  97. db_conn.ping(reconnect=True);
  98. except pymysql.OperationalError as e:
  99. print(e);
  100. print('连接断开,正在尝试重新连接...');
  101. if db_conn:
  102. db_conn.close();
  103. db_conn = pymysql.connect(**config);
  104. time.sleep(1);
  105. else:
  106. break;
  107. self.db_conn = db_conn;
  108. def check_mysql_connect(self):
  109. try:
  110. with self.db_conn.cursor() as cursor:
  111. cursor.execute('SELECT 1');
  112. except pymysql.MySQLError as e:
  113. print(e);
  114. self.db_conn.close();
  115. print('mysql重连...');
  116. self.connect_mysql();
  117. def check_refresh_token(self, force_refresh=False):
  118. expire_time_str = self.accout_data['expire_time'];
  119. expire_dt = datetime.strptime(expire_time_str, "%Y-%m-%d %H:%M:%S")
  120. now_dt = datetime.now();
  121. is_valid = False;
  122. if now_dt < expire_dt:
  123. is_valid = True;
  124. if not force_refresh and is_valid:
  125. return 0;
  126. login_params = self.accout_data['login_params'];
  127. url = f'https://{self.host}/h5/union/interactiveIGoChoose/index?loginParams={login_params}';
  128. response = self.get_request(url);
  129. # print(response.content);
  130. cookie_dict = dict(response.cookies);
  131. authorization = None;
  132. for key in cookie_dict:
  133. self.cookies[key] = cookie_dict[key];
  134. if key == 'unionToken_interactiveIGoChoose':
  135. authorization = self.cookies[key];
  136. if authorization:
  137. self.headers['Authorization'] = authorization;
  138. cookies_str = '; '.join([f'{key}={value}' for key, value in self.cookies.items()]);
  139. self.headers['Cookie'] = cookies_str;
  140. return 1;
  141. return -1;
  142. def start(self):
  143. ret_code = self.check_refresh_token(self.force_refresh);
  144. if ret_code == 1:
  145. self.sync_new_token();
  146. print('刷新token成功');
  147. elif ret_code == 0:
  148. print('无需刷新token');
  149. else:
  150. print('刷新token失败');
  151. def sync_new_token(self):
  152. account = self.accout_id;
  153. if not account:
  154. return;
  155. authorization = self.headers['Authorization'];
  156. cookies = self.cookies;
  157. sign_time = None
  158. expire_time = None;
  159. try:
  160. jwt_data = parse_jwt(authorization);
  161. if not jwt_data:
  162. return;
  163. payload = jwt_data['payload'];
  164. if 'customerInfo' in payload:
  165. info_str = payload['customerInfo'];
  166. customer_info = json.loads(info_str);
  167. payload['customerInfo'] = customer_info;
  168. account = customer_info['phone'];
  169. sign_time = seconds_to_beijing_time(payload['iat']);
  170. expire_time = seconds_to_beijing_time(payload['exp']);
  171. except Exception as e:
  172. print(e);
  173. try:
  174. sql_query = f'''
  175. UPDATE elife_account_data
  176. SET
  177. authorization = %s,
  178. cookies = %s,
  179. update_time = %s,
  180. expire_time = %s
  181. WHERE account = %s;
  182. ''';
  183. sql_params = (authorization, repr(cookies), sign_time, expire_time, account);
  184. # print(sql_params);
  185. self.check_mysql_connect();
  186. cursor = self.db_conn.cursor();
  187. cursor.execute(sql_query, sql_params);
  188. self.db_conn.commit();
  189. cursor.close();
  190. except pymysql.OperationalError as e:
  191. print(e);
  192. def get_request(self, url, params=None):
  193. response = requests.get(url, headers=self.headers, params=params, cookies=self.cookies);
  194. return response;
  195. def post_request(self, url, data):
  196. response = requests.post(url, data=data, headers=self.headers, cookies=self.cookies);
  197. return response;
  198. def main():
  199. accout_data = read_csv('elife_accout_data.csv');
  200. for item in accout_data:
  201. print('########账号[%s]开始检查刷新Token########' % item['account']);
  202. checker = OfpayChecker(item);
  203. checker.start();
  204. print('########################################');
  205. if __name__ == "__main__":
  206. main();