学校校园网的登录认证的主要方式是连接有线或者无线,之后等系统弹出登录网页,或者你自己上一个网站,会自动跳转到登录界面,在大多数情况下,这没有什么问题,但是在人比较多的时候,比如图书馆,或者信号覆盖不是很好的时候,就不会弹出这个页面,网络状态直接显示感叹号,网页打不开,更有甚者,即便是手动输入认证服务器网址,也有一定几率打不开登录页面。
这个程序本来是写给自己用来自动登录有线网的,在NAS里做自动开机登录使用,这个脚本写的很简单,就十几行代码。后来想要自己的笔记本也可以自动登录无线网,就扩充了下脚本,但是,当真正开始用的时候,发现了很多的问题,这些问题都是脚本难以解决的,就干脆把脚本扩展成了GUI程序,并且同时支持了无线网络和有线网络的登录,以及旧认证服务器和新认证服务器的自动切换登录。
这是2018年1月份写的程序,在这个时候,学校的校园网主要包含有线和无线两种连接方式,其中有线,包括校园网有线、三家运营商的有线,这四种登录方式使用的是新的服务器,也就是2017年底部署的新的认证服务器,登录网址为login.ccnu.edu.cn,或者l.ccnu.edu.cn,或者是10.220.250.50,认证地址为:
http://10.220.250.50/0.htm
无线的话,比较复杂,在不同地方的无线服务器不同,有些地方,比如图书馆,使用的是新的认证服务器(登陆界面包含输入用户名、密码、运营商选择三个部分),认证地址和上面的一样。但是,在大部分学校的其它地方,比如田家炳楼、宿舍无线使用的是旧的服务器,其打开界面后没有选择运营商的RadioButton,只有输入用户名和密码的地方,其认证地址为:
http://securelogin.arubanetworks.com/auth/index.html/uauth/index.html/u
但是,有些时候,在本该属于新服务器认证的地方,偶尔会跳转到旧服务器认证,所以,如果想要正确登录,就需要尝试不同的服务器,但是,新的问题是,在旧服务器认证的时候,新服务器地址是可以POST通的,并且可以正常返回200并打开正常登录页面的,但是,其它正常外网网页是登不上的,因此,设计自动登录程序的时候当POST返回200和正确网页之后还需要测试是否可以打开外网,更有甚者,很多时候,就算是正确的服务器,POST返回200和正确网页后还是打不开外网,这极大增加了登录脚本的复杂度。
直接上程序吧,具体项目参见我的Github仓库。唯一感叹一点的就是,区区四五行的POST登陆,真正实现成一个功能,竟然写了个500行的程序,其中接近400行处理相关逻辑,100行左右处理UI。一个遗憾是,没有使用多线程,因为Qt的多线程还没有开始学习,Python的多线程和PyQt兼容性不太好,并且也不安全,所以就没有用。
这个是脚本,postit.py,可以直接使用,不过要实现自动登录、自动判断登录状态并且在多次登录失败的情况下切换新旧服务器,以及GUI的话,就需要另一个main.py文件。
#!/usr/bn/env python3
import requests,json
import traceback
def loginCCNU(username="",passwd="",suffix=""):
errmessage = None
try:
url = "http://10.220.250.50/0.htm"
payload = {"DDDDD":"%s"%username,
"upass":"%s"%passwd,
"suffix":"%s"%suffix,
"0MKKey":"123"}
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",}
r = requests.post(url, data=payload ,headers = headers)
# print(r.text)
if "您已登录成功,欢迎使用!请不要关闭本页。" in r.text:
return str(r.status_code),"1",errmessage
else:
return str(r.status_code),"0",errmessage
except:
errmessage = str(traceback.format_exc())
return None,"0",errmessage
def loginoutCCNU(username="",passwd="",suffix=""):
errmessage = None
try:
url = "http://10.220.250.50/F.htm"
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",}
r = requests.get(url ,headers = headers)
# print(r.text)
if "华中师范大学无线校园网登录" in r.text:
return str(r.status_code),"0","已注销"
else:
return str(r.status_code),"0","返回未知网页"
except:
errmessage = str(traceback.format_exc())
return None,"0",errmessage
def loginoutCCNUWLAN(username="",passwd="",suffix=""):
errmessage = None
try:
url = "http://securelogin.arubanetworks.com/cgi-bin/login?cmd=logout"
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",}
r = requests.get(url ,headers = headers)
# print(r.text)
if "Logout Successful" in r.text:
return str(r.status_code),"0","已注销"
else:
return str(r.status_code),"0","返回未知网页"
except:
errmessage = str(traceback.format_exc())
return None,"0",errmessage
def loginCCNUWLAN(username="",passwd=""):
errmessage = None
try:
url = "http://securelogin.arubanetworks.com/auth/index.html/uauth/index.html/u"
payload = {"user":"%s"%username,
"password":"%s"%passwd}
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",}
r = requests.post(url, data=payload ,headers = headers)
# print(r.text)
if "External Welcome Page" in r.text:
return str(r.status_code),"1",errmessage
elif """Internal Server Error""" in r.text:
# return str(r.status_code),"1",errmessage
return str(200),"1",errmessage
else:
return str(r.status_code),"0",errmessage
except:
errmessage = str(traceback.format_exc())
return None,"0",errmessage
# 502 0 电缆未连通
# 403 0 用户错误
# 200 0 账户错误
def testNet(number = 1):
initnumber = number
errmessage = None
code = 0
headers = { "User-Agent":"Mozilla