南信大 校园网 登陆 注销 python实现

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

工具:

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

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

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

既然是post的包,当然要看它传的data了。。
南信大 校园网 登陆 注销 python实现_第2张图片

发送的数据:

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

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

接下来怎么办呢。。。。

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

打开F12里面的search,寻找关键字password
南信大 校园网 登陆 注销 python实现_第3张图片

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

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

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

查看它的 请求头
南信大 校园网 登陆 注销 python实现_第5张图片

其他都好构造,好像需要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()

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

打开注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet 中enableactiveprobing 调成0就行了

你可能感兴趣的:(爬虫,南信大,python)