华中师范大学CCNU校园网(有线/无线)自动登录程序


















写作缘由

学校校园网的登录认证的主要方式是连接有线或者无线,之后等系统弹出登录网页,或者你自己上一个网站,会自动跳转到登录界面,在大多数情况下,这没有什么问题,但是在人比较多的时候,比如图书馆,或者信号覆盖不是很好的时候,就不会弹出这个页面,网络状态直接显示感叹号,网页打不开,更有甚者,即便是手动输入认证服务器网址,也有一定几率打不开登录页面。

这个程序本来是写给自己用来自动登录有线网的,在NAS里做自动开机登录使用,这个脚本写的很简单,就十几行代码。后来想要自己的笔记本也可以自动登录无线网,就扩充了下脚本,但是,当真正开始用的时候,发现了很多的问题,这些问题都是脚本难以解决的,就干脆把脚本扩展成了GUI程序,并且同时支持了无线网络和有线网络的登录,以及旧认证服务器和新认证服务器的自动切换登录。

语言和依赖

Python 3.X,需要安装requests包(脚本)以及pyqt5包(GUI)。

测试平台为Windows 10 X64,macOS HS。

网络概况

这是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文件。

postit.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
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值