OfpayTokenCheck.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. if response.status_code != 200:
  130. return -2;
  131. # print(response.content);
  132. # cookie_dict = dict(response.cookies);
  133. cookie_dict = {}
  134. for cookie in response.cookies:
  135. if cookie.name:
  136. key = cookie.name;
  137. cookie_dict[key] = cookie.value;
  138. authorization = None;
  139. for key in cookie_dict:
  140. value = cookie_dict[key];
  141. if not value:
  142. continue;
  143. self.cookies[key] = value;
  144. if key == 'unionToken_interactiveIGoChoose':
  145. authorization = self.cookies[key];
  146. if authorization:
  147. self.headers['Authorization'] = authorization;
  148. cookies_str = '; '.join([f'{key}={value}' for key, value in self.cookies.items()]);
  149. self.headers['Cookie'] = cookies_str;
  150. return 1;
  151. return -1;
  152. def start(self):
  153. ret_code = self.check_refresh_token(self.force_refresh);
  154. if ret_code == 1:
  155. self.sync_new_token();
  156. print('刷新token成功');
  157. elif ret_code == 0:
  158. print('无需刷新token');
  159. else:
  160. print('刷新token失败');
  161. def sync_new_token(self):
  162. account = self.accout_id;
  163. if not account:
  164. return;
  165. authorization = self.headers['Authorization'];
  166. cookies = self.cookies;
  167. sign_time = None
  168. expire_time = None;
  169. try:
  170. jwt_data = parse_jwt(authorization);
  171. if not jwt_data:
  172. return;
  173. payload = jwt_data['payload'];
  174. if 'customerInfo' in payload:
  175. info_str = payload['customerInfo'];
  176. customer_info = json.loads(info_str);
  177. payload['customerInfo'] = customer_info;
  178. account = customer_info['phone'];
  179. sign_time = seconds_to_beijing_time(payload['iat']);
  180. expire_time = seconds_to_beijing_time(payload['exp']);
  181. except Exception as e:
  182. print(e);
  183. try:
  184. sql_query = f'''
  185. UPDATE elife_account_data
  186. SET
  187. authorization = %s,
  188. cookies = %s,
  189. update_time = %s,
  190. expire_time = %s
  191. WHERE account = %s;
  192. ''';
  193. sql_params = (authorization, repr(cookies), sign_time, expire_time, account);
  194. # print(sql_params);
  195. self.check_mysql_connect();
  196. cursor = self.db_conn.cursor();
  197. cursor.execute(sql_query, sql_params);
  198. self.db_conn.commit();
  199. cursor.close();
  200. except pymysql.OperationalError as e:
  201. print(e);
  202. def get_request(self, url, params=None):
  203. response = requests.get(url, headers=self.headers, params=params, cookies=self.cookies);
  204. return response;
  205. def post_request(self, url, data):
  206. response = requests.post(url, data=data, headers=self.headers, cookies=self.cookies);
  207. return response;
  208. def main():
  209. accout_data = read_csv('elife_accout_data.csv');
  210. for item in accout_data:
  211. print('########账号[%s]开始检查刷新Token########' % item['account']);
  212. checker = OfpayChecker(item);
  213. checker.start();
  214. print('########################################');
  215. if __name__ == "__main__":
  216. main();