打开电脑,无线网每次连接校园网(i-NUIST)的时候都会跳出一个认证界面,认证完才能上网,我的电脑有时候还抽风跳不出来这个网页,于是我就想做个登陆的脚本,连接上无线网直接自动登陆就好了。

工具:

1.python3.6
2.requests模块 和 base64模块
3.Google Chrome浏览器

过程:
我试了几下登陆,发现那就是个post过程。

打开谷歌浏览器
输入网址:http://a.nuist.edu.cn
输入校园网账号密码,按下F12开始抓包咯。。
南信大 校园网 自动登陆 python实现
就抓到了一条post包,还是jquery的。。。。

既然是post的包,当然要看它传的data了。。
南信大 校园网 自动登陆 python实现

发送的数据:

  • username:就是账号的明文
  • domain:运营商(移动CMCC 联通Unicom 电信ChinaNet)
  • password:应该是密码,而且是加密的
  • enablemacauth不知道这条是做什么的,登陆了好多次都是不变的,那就把它固定住,不改变。

post最关键的就是data包了,这个包也就password是加密的,其他还好,接下来就搞一下这个加密吧。。
先看一下它的长度,8位的,猜了一个md5加密,试了一下,发现不是。。

接下来怎么办呢。。。。

只能从他的js里面找它的加密方法,当然不是一行一行的分析它的源码,这样会累死的

打开F12里面的search,寻找关键字password
南信大 校园网 自动登陆 python实现

很明显是在login.js里面
于是,打开这个文件,找啊找啊(此处省略过程),发现了点头绪。
南信大 校园网 自动登陆 python实现

还好我暑假看过一点jQuery的基础,看得懂他的ajax 跨域请求
看他的data项,找到了base64的加密,然后后面测试了一下也是正确的。

post请求的data应该可以构造了。
接下来看看,它要不要加什么协议头 ,cookie什么的。。。

查看它的 请求头
南信大 校园网 自动登陆 python实现

其他都好构造,好像需要cookie

看了一下这两个cookie,应该是进入网页的时候生成的。

所以这个模拟登陆的正确流程应该是

  1. 打开网页 a.nuist.edu.cn 获得cookie
  2. a.nuist.edu.cn/index.php/index/login 携带cookie发送post请求

我试了试,好像直接post 是可以的,不需要获取cookie,我想多了。

发送post后 他会返回一个json格式的信息,来告知你是否登陆成功

接下来是python代码

登陆函数:
需要requests 模块 和 base64模块

def login(username='账号',password='密码',domain='Unicom'):     #要输入账号密码啊。。。
    password = base64.b64encode(password.encode()).decode()   #base64加密。。
    url="http://a.nuist.edu.cn/index.php/index/login"    
    dv={   #构造data
        'username':username,
        'domain':domain,
        'password':password,
        'enablemacauth':0
        }
    try:      #用try来防止未知错误。
        r = requests.post(url,data=dv)   #发送post
        r.raise_for_status()    #错误抛出异常
        return r.json()      返回json格式的数据
    except:
        print('error')

完整代码:

import requests   #导入库
import base64

def login(username='账号',password='密码',domain='Unicom'):     #要输入账号密码啊。。。
    password = base64.b64encode(password.encode()).decode()   #base64加密。。
    url="http://a.nuist.edu.cn/index.php/index/login"    
    dv={   #构造data
        'username':username,
        'domain':domain,
        'password':password,
        'enablemacauth':0
        }
    try:      #用try来防止未知错误。
        r = requests.post(url,data=dv)   #发送post
        r.raise_for_status()    #错误抛出异常
        return r.json()      返回json格式的数据
    except:
        print('error')

#下面输入你的账号密码,运营商:移动CMCC 联通Unicom 电信ChinaNet
dic=login('你的账号','密码','运营商') 
for i in list(dic.keys()):             
    if dic[i]:
        print(i+":"+str(dic[i]))   #输出登陆信息,成功与否
    input()

注销的代码也放上来:
比较简单

import requests
def logout():
    url = 'http://a.nuist.edu.cn/index.php/index/logout'
    try:
        r = requests.post(url,timeout=30)
        r.raise_for_status()

        return r.json()['info']
    except:
        print('error')

#def main():
print(logout())
input()

此外,如果你不想连接上无线网就弹出登陆网页的话,那就要手动修改一**册表了。

打开注册表的方法,百度(https://jingyan.baidu.com/article/3aed632ed714d6701080912e.html)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet 中enableactiveprobing 调成0就行了

最后皮一下
南信大 校园网 自动登陆 python实现

相关文章: