-
Notifications
You must be signed in to change notification settings - Fork 0
/
iNUIST.py
159 lines (131 loc) · 5.87 KB
/
iNUIST.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# 南京信息工程大学 i-NUIST 校园网一键登录
# 作者: Switernal
import json
import os
import platform
import sys
import requests
import configparser
def iNUIST_login():
# 指定当前目录
filename = os.path.basename(sys.argv[0])
# 当前路径要去掉文件名和最后一个'/'
current_path = sys.argv[0][0: -(len(filename) + 1)]
# print(current_path)
# print(platform.system())
# 如果是Mac或Linux, 将当前执行文件权限设为755
if platform.system() == 'Darwin' or platform.system() == 'Linux':
os.system('chmod 755 %s' % (sys.argv[0]))
# url
url = 'http://a.nuist.edu.cn/api/v1'
ipUrl = url + '/ip'
loginUrl = url + '/login'
logoutUrl = url + '/logout'
# 用户信息
user_name = ''
password = ''
channel = ''
is_auto_login = ''
# 先检查用户信息是否存在
if not os.path.isfile(current_path + '/user.ini'):
print('欢迎使用新版南京信息工程大学 i-NUIST 校园网一键登录程序')
print('作者: Switernal')
print('联系方式: [email protected]')
print('请在遵守法律和相关规定的前提下使用本程序')
# 如果是Mac或Linux, 需要授予读写权限
if platform.system() == 'Darwin' or platform.system() == 'Linux':
print('\n一键运行脚本不会盗取您的开机密码, 仅用作获取目录读写权限来保存配置文件user.ini, 如果不输入将无法保存配置信息')
sudoPassword = input("请输入电脑开机密码: ")
command = 'mount -uw /'
os.system('echo %s | sudo -S %s' % (sudoPassword, command))
print('\n以下设置仅首次运行显示, 后续需修改用户信息请直接修改同目录下的user.ini文件')
print('为了快速登录, 不要删除目录下的user.ini, 否则每次运行需要重新输入配置信息')
user_name = input("请输入用户名(手机号): ")
password = input("请输入登录密码: ")
channel = input("运营商代码: \n 1: 校园网\n 2: 中国移动 \n 3: 中国电信 \n 4: 中国联通 \n请输入运营商代码: ")
is_auto_login = input("是否允许自动登录(1: 是, 0: 否): ")
# 写入配置文件
configure_file = configparser.ConfigParser()
configure_file.add_section('User-Info')
configure_file.set('User-Info', 'username', user_name)
configure_file.set('User-Info', 'password', password)
configure_file.set('User-Info', 'channel', channel)
configure_file.set('User-Info', 'isAutoLogin', is_auto_login)
with open(os.path.join(current_path, 'user.ini'), 'w+') as f:
configure_file.write(f)
else:
# 直接读取配置文件
config_file = configparser.ConfigParser()
config_file.read(os.path.join(current_path, 'user.ini'))
user_name = str(config_file.get('User-Info', 'username'))
password = str(config_file.get('User-Info', 'password'))
channel = str(config_file.get('User-Info', 'channel'))
is_auto_login = str(config_file.get('User-Info', 'isAutoLogin'))
# 获取ip
ipRes = requests.get(ipUrl)
ip = (json.loads(ipRes.text))["data"]
# 设置login的请求头
headers = {
"Host": "a.nuist.edu.cn",
"Accept": "application/json, text/plain, */*",
"User-Agent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
"Content-Type": "application/json;charset=UTF-8",
"Origin": "http://a.nuist.edu.cn",
"Referer": "http://a.nuist.edu.cn/authentication/login",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
# "Content-Length": "128",
"Connection": "keep-alive",
}
# login的请求体内容
if channel is not 1:
body = {
"username": user_name,
"password": password,
"channel": channel,
"ifautologin": is_auto_login,
"pagesign": "secondauth",
"usripadd": ip,
}
else:
body = {
"username": user_name,
"password": password,
"channel": channel,
"ifautologin": is_auto_login,
"pagesign": "firstauth",
"usripadd": ip,
}
# 把 user_info 写成二进制文件 user_binary
user_json_binary_file = open('user_binary', 'w+')
user_json_binary_file.write(json.dumps(body).replace(' ', '')) # 转成json文本后还得把空格全去掉, 他二进制文件数据里不能有空格
user_json_binary_file.close()
# 读入二进制文件, 发送登录请求
user_json_binary_file = open('user_binary', 'rb')
response = requests.post(url=url, headers=headers, data=user_json_binary_file)
user_json_binary_file.close()
os.remove('user_binary') # 删除登录用的二进制文件
# 解析请求结果
responseJson = json.loads(response.text)
if responseJson["code"] == 200 and responseJson["message"] == 'ok':
print("\n登录成功!")
print('用户名: ' + responseJson["data"]["username"])
print('运营商: ' + responseJson["data"]["outport"])
print('登录IP: ' + responseJson["data"]["usripadd"])
else:
print('\n登录失败!')
print('返回代码: ' + str(responseJson["code"]))
error_msg = responseJson['message']
if error_msg == 'Passwd_Err':
print('错误信息: 密码错误')
elif error_msg == 'UserName_Err':
print('错误信息: 用户名错误')
else:
print('错误信息: ' + responseJson["message"])
# print(response.text)
# 如果是Windows平台, 执行完会自动退出, 需要pause一下显示结果
if platform.system() == "Windows":
print('\n')
os.system("pause")
if __name__ == '__main__':
iNUIST_login()