欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现校园网自动登录的示例讲解

程序员文章站 2023-11-04 10:21:28
因为最近想用树莓派搞个远程监控系统,又因为学校的网需要从网页登录而树莓派又不方便搞个显示器带着,所以寻思着搞个能够自动登录校园网的脚本程序,省去了每次都要打开浏览器输入账号...

因为最近想用树莓派搞个远程监控系统,又因为学校的网需要从网页登录而树莓派又不方便搞个显示器带着,所以寻思着搞个能够自动登录校园网的脚本程序,省去了每次都要打开浏览器输入账号密码的烦恼.

1.工具

火狐浏览器+firedebug插件,debug插件可才浏览器中附加组件中添加,其他浏览器也可以只要可以监控浏览器的网络行为即可.

python+requests包

2.步骤

1)  先打开到登录界面,然后在按f12打开firedebug插件,此时debug无任何记录行为,然后点击刷新按钮,再点击登录按钮,再次调出debug点击控制台选项卡,这时会发现很多get方法加上最后由登录产生的post方法,如图所示

python实现校园网自动登录的示例讲解

2) 点击post方法的小箭头会发现,浏览器的请求头header信息,这个需要我们保存下来(不是响应头),

python实现校园网自动登录的示例讲解

3) 查看post选项卡中的内容,其中的变量和参数都需要保存下来,这里面可以看到其中的password是被加过密的.如果只是登录自己的账号密码,那么程序到此可以结束.把其中的数据用自己抓到的数据替换使用下面代码即可登录校园网.

python实现校园网自动登录的示例讲解

import requests
#登录地址
post_addr="http://a.nuist.edu.cn/index.php/index/login"
#构造头部信息
post_header={
 'host': 'a.nuist.edu.cn',
 'user-agent':'mozilla/5.0 (x11; linux x86_64; rv:55.0) gecko/20100101 firefox/55.0',
 'accept': 'application/json, text/javascript, */*; q=0.01',
 'accept-language':'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3',
 'accept-encoding': 'gzip, deflate',
 'content-type': 'application/x-www-form-urlencoded',
 'x-requested-with':'xmlhttprequest',
 'referer':'http://a.nuist.edu.cn/index.php?url=ahr0cdovl2rldgvjdhbvcnrhbc5maxjlzm94lmnvbs9zdwnjzxnzlnr4da==',
 'content-length': '67',
 'cookie':'_gscu_1147341576=059821653286gq10; sunriseusername=123441534;\
 sunrisedomain=nuist;sunriserememberpassword=true; sunrisepassword=123456;\
 phpsessid=hb0o9bkct2f6ge164oj3vj0me5;think_language=zh-cn',
 'connection':'keep-alive',
}
#构造登录数据
post_data={'domain':'nuist',
   'enablemacauth':'0',
   'password':'mtgzmzew',
   'username':'xxxxxxx'
   } 
#发送post请求登录网页
z=requests.post(post_addr,data=post_data,headers=post_header)

4)  但是发现一个问题就是上面的程序只能自己使用,如果换一个账号密码登录那么又要使用浏览器抓数据包,烦…仔细查看上面的步骤发现想要写一个其它账号不用抓包也可以登录的程序的难点在于构造post_data程序中password被加密过,如果能够知道它的加密方式,写一个通用的(在本校内)程序还是非常容易的.

其实这一步如果对常用的加密方法比较了解,那么去查看网页的源代码(js)还是比较容易得出它的加密方式,可惜我不懂,只知道一个md5加密,因此我就尝试用python中的hashlib包对密码进行加密然后查看是否和抓到的数据相同,遗憾的是连一个字符都木有相同的…,然后我想既然数据是从本地想服务器发的那么加密的过程必然在客户端完成很有可能是通过js脚本(对网页编程不太了解,只知道js可在客户端执行,所以猜测是js脚本完成对passward编码),然后通过debug查看抓到的js代码.

打开debug的调试器可以看到左边有一排js代码,通过js文件名可以大概猜测到js的作用.

python实现校园网自动登录的示例讲解

5) 查看左侧文件名能够直接猜测到作用有login.js,md5.js,client.js,usercss.js.既然md5不是password加密方式那么查看其它js代码.幸运的是点开第一个base64代码敏感的发现这篇代码就是一种编码方式,赶紧百度之,发现base64果然是一种编码方式,趁热打铁百度python的base64编码实现,发现python早已集成base64的包,利用此包再次对密码进行编码….发现结果和抓到的postdata一毛一样,至此写一个通用的程序指日可待!!

完整代码如下(粗犷版):

#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
 filename:connet.py
 author:shenhuixiang
 copyright(c)2017,shenhuixiang
'''
import base64
import requests
'''
输入账号密码和登录的网络
网络参数为如果是移动的则填写cmcc
如果是学号则填nuist
'''
user_account='110'
domain_selection='cmcc'
user_passwatd='123456'
#登录地址
post_addr="http://a.nuist.edu.cn/index.php/index/login"
#构造头部信息
post_header={
 'host': 'a.nuist.edu.cn',
 'user-agent':'mozilla/5.0 (x11; linux x86_64; rv:55.0) gecko/20100101 firefox/55.0',
 'accept': 'application/json, text/javascript, */*; q=0.01',
 'accept-language':'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3',
 'accept-encoding': 'gzip, deflate',
 'content-type': 'application/x-www-form-urlencoded',
 'x-requested-with':'xmlhttprequest',
 'referer':'http://a.nuist.edu.cn/index.php?url=ahr0cdovl2rldgvjdhbvcnrhbc5maxjlzm94lmnvbs9zdwnjzxnzlnr4da==',
 'content-length': '67',
 'cookie':'_gscu_1147341576=059821653286gq10; sunriseusername='+user_account+';\
 sunrisedomain='+domain_selection+';sunriserememberpassword=true; sunrisepassword='+user_passwatd+';\
 phpsessid=hb0o9bkct2f6ge164oj3vj0me5;think_language=zh-cn',
 'connection':'keep-alive',
}
'''
password在post的参数中经过base64编码,
为了查找password加密方式...吐血三升.
'''
post_data={'domain':domain_selection,
   'enablemacauth':'0',
   'password':base64.b64encode(user_passwatd.encode()),
   'username':user_account
   }
#发送post请求登录网页
z=requests.post(post_addr,data=post_data,headers=post_header)
#z.text为str类型的json数据因此先编码成byte类型在解码成unicode型这样就可以正常输出中文
s=z.text.encode('utf-8').decode('unicode-escape')
print(s)

以上这篇python实现校园网自动登录的示例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。