RUC WiFi: 鹿大校园网自动认证 / 定时连接
链接
overdose425/RUC_WiFi: 深澜认证协议下自动认证校园网 / 校园网定时重连 (github.com)
起因
跟鹿大在读的女友出门玩时,心疼她为了工作每次都要背个游戏本出门,不便且厚重,遂寄希望于远程连接在校园的电脑。然而鹿大的校园网断线频率实在太高,为了省心地解决该问题,我参考北航校园网下设置自动连接的方案,编写了鹿大校园网连接脚本。在此处感谢原po作者们!
参考
原项目:https://github.com/huxiaofan1223/jxnu_srun
实现主要参考:https://github.com/FuryMartin/BUAA_WIFI
改动
- 修改了相关url以适配RUC校园网
- 编码部分debug
使用
- 修改ruc_wifi.py中username和password值为你的网关账号密码
- 运行ruc_wifi.py 或 运行wifi.bat
自动
【windows下实现】 感谢原作者@FuryMartin
-
按键盘上的
win+S
键,直接打字搜索任务计划程序
并打开 -
点击
任务计划程序
窗口右上角的创建任务 -
勾选
常规
-不管用户是否登录都要运行
-
点击
触发器
-新建
,将开始任务下拉选择工作站解锁时
,并设置重复任务时间为5分钟
,且永不
停止 -
点击
操作
-新建
,点击浏览
,将程序路径设置为wifi.vbe的绝对路径,【特别注意】起始于
选项设置为本项目文件夹的绝对路径
-
取消勾选条件-
只有在计算机使用交流电源时才启动此任务
-
点击
确定
代码
ruc_wifi.py
import requests
import time
import re
from encryption.srun_md5 import *
from encryption.srun_sha1 import *
from encryption.srun_base64 import *
from encryption.srun_xencode import *
username = ""
password = ""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36'
}
init_url = "http://go.ruc.edu.cn"
get_challenge_api = "http://go.ruc.edu.cn/cgi-bin/get_challenge"
srun_portal_api = "http://go.ruc.edu.cn/cgi-bin/srun_portal"
get_info_api = "http://go.ruc.edu.cn/cgi-bin/rad_user_info?callback=jQuery112403076366133070929_1630949443031&_=1630949443033"
n = '200'
type = '1'
ac_id = '1'
enc = "srun_bx1"
def get_chksum():
chkstr = token+username
chkstr += token+hmd5
chkstr += token+ac_id
chkstr += token+ip
chkstr += token+n
chkstr += token+type
chkstr += token+i
return chkstr
def get_info():
info_temp = {
"username": username,
"password": password,
"ip": ip,
"acid": ac_id,
"enc_ver": enc
}
i = re.sub("'", '"', str(info_temp))
i = re.sub(" ", '', i)
return i
def init_getip():
global ip
init_res = requests.get(init_url, headers=header)
print("初始化获取ip")
ip = re.search('ip : "(.*?)"', init_res.text).group(1)
print("ip:"+ip)
def get_token():
# print("获取token")
global token
get_challenge_params = {
"callback": "jQuery112404953340710317169_"+str(int(time.time()*1000)),
"username": username,
"ip": ip,
"_": int(time.time()*1000),
}
get_challenge_res = requests.get(
get_challenge_api, params=get_challenge_params, headers=header)
token = re.search('"challenge":"(.*?)"', get_challenge_res.text).group(1)
print(get_challenge_res.text)
print("token为:"+token)
def do_complex_work():
global i, hmd5, chksum
i = get_info()
i = "{SRBX1}"+get_base64(get_xencode(i, token))
hmd5 = get_md5(password, token)
chksum = get_sha1(get_chksum())
print("所有加密工作已完成")
def login():
srun_portal_params = {
'callback': 'jQuery11240645308969735664_'+str(int(time.time()*1000)),
'action': 'login',
'username': username,
'password': '{MD5}'+hmd5,
'ac_id': ac_id,
'ip': ip,
'chksum': chksum,
'info': i,
'n': n,
'type': type,
'os': 'windows+10',
'name': 'windows',
'double_stack': '0',
'_': int(time.time()*1000)
}
# print(srun_portal_params)
srun_portal_res = requests.get(
srun_portal_api, params=srun_portal_params, headers=header)
print(srun_portal_res.text)
if __name__ == '__main__':
init_getip()
get_token()
do_complex_work()
login()
res = requests.get(get_info_api, headers=header)
print(res.text)