-
Notifications
You must be signed in to change notification settings - Fork 13
/
proxy.py
107 lines (96 loc) · 4.07 KB
/
proxy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#自动获取token等信息,点进跑步信息自动保存跑步记录tasklist
#安装mitmproxy 运行mitmproxy -s proxy.py
#手机代理设置为电脑ip:8080
import os
import mitmproxy
import json
import subprocess
import configparser
def decode(key_enc,data,use_gzip):
use_gzip_str = str(use_gzip).lower()
result = subprocess.run(
['java', '-jar', 'decrypt.jar', key_enc, data, use_gzip_str],
capture_output=True,
text=True
)
print(result.args)
print(result.stdout)
print(result.stderr)
output = result.stdout.split("\n")
decrypted_key = output[0].split(": ")[1]
decrypted_text = output[1].split(": ")[1]
return decrypted_key, decrypted_text
def match_str(str,patterns):
for pattern in patterns:
if pattern in str:
return True
return False
fields_to_keep = [
"recordMileage",
"recodePace",
"recodeCadence",
"recodeDislikes",
"duration",
"pointsList",
"schoolId",
"manageList"
]
class Yun:
saved = False
count = 0
def __init__(self):
self.count = self.get_tasks_else_file_count()
def get_tasks_else_file_count(self):
tasks_else_path = "./tasks_else"
try:
file_count = len([name for name in os.listdir(tasks_else_path) if os.path.isfile(os.path.join(tasks_else_path, name))])
except FileNotFoundError:
os.mkdir(tasks_else_path)
file_count = 0
return file_count
def request(flow: mitmproxy.http.HTTPFlow) -> None:
if "210.45.246.53:8080" not in flow.request.pretty_url:
flow.live = False
def response(self, flow: mitmproxy.http.HTTPFlow):
req_url = flow.request.url
if "210.45.246.53:8080" in req_url :
if(self.saved == False and match_str(req_url,["getStudentInfo","AppSysMsgApi","homePageApi","crsReocordInfo"])):
config = configparser.ConfigParser()
config.read('config.ini')
config.set('User', 'token', flow.request.headers.get("token",""))
config.set('User', 'device_Id', flow.request.headers.get("deviceId",""))
config.set('User', 'device_Name', flow.request.headers.get("deviceName",""))
config.set('User', 'uuid', flow.request.headers.get("uuid",""))
config.set('User', 'utc', flow.request.headers.get("utc",""))
config.set('User', 'sign', flow.request.headers.get("sign",""))
with open('config.ini', 'w') as configfile:
config.write(configfile)
print("token: "+flow.request.headers.get("token",""))
print("deviceId: "+flow.request.headers.get("deviceId",""))
print("deviceName: "+flow.request.headers.get("deviceName",""))
print("uuid: "+flow.request.headers.get("uuid",""))
print("utc: "+flow.request.headers.get("utc",""))
print("sign: "+flow.request.headers.get("sign",""))
self.saved = True
if("crsReocordInfo" in req_url) :
request_body = json.loads(flow.request.text)
cipher_key = request_body.get('cipherKey', '')
response_text = flow.response.text.strip('"')
print(cipher_key)
_,tasklist_raw = decode(cipher_key,response_text,True)
tasklist_json = json.loads(tasklist_raw)
data = tasklist_json['data']
if 'pointsList' in data:
for point in data['pointsList']:
if 'ts' in point:
del point['ts']
filtered_data = {key: value for key, value in data.items() if key in fields_to_keep}
tasklist_json['data'] = filtered_data
with open(f"./tasks_else/tasklist_{self.count}.json", 'w', encoding='utf-8') as file:
json.dump(tasklist_json, file, ensure_ascii=False, indent=4)
self.count = self.count + 1
else:
flow.live = False
addons = [
Yun()
]