一、引入

学校的校园网每天十二点断网,然后第二天六点恢复,学校允许外接路由器。但是呢,每天早上起来还得打开网页认证一下,尝试使用python脚本进行自动登录,很成功。但是呢,想想又很烦,还得使用python,电脑用的话电脑还得一直开机,手机上弄得话挺麻烦。
       想着能不能让路由器每天六点自动认证,于是就发现了curl这个万能工具。路由器的系统是Linux系统,自带curl,恰好我路由器刷的老毛子固件,可以让它执行定时任务。
       使用pythoncurl实现校园网自动登录的原理很简单,就是利用python或curl去模拟一个POST请求,顺带着把账号密码发过去,就完成了认证。
       Python模拟POST请求的脚本很好写,调用requests库即可,curl就有点费劲了,一大堆参数,尝试过直接写curl脚本,但是不知道哪儿出问题了,没成功。我想能不能将python代码直接转成curl的命令呢?当然是可以的,不过不是转换python代码,而是将request请求转成curl命令,使用的是python的第三方库curlify

二、准备工作

既然要模拟POST请求,那一定得拿到POST请求的各种信息了,如请求的URL,发送的表单数据和标头。接下来,以安徽某工程大学的校园网认证演示一下如何获取相关数据。

我们学校的登陆界面如图所示:

在这个界面按F12(有的笔记本需要按Fn+F12)打开开发人员模式。然后选择网络,勾选保留日志。

输入账号和密码等信息后选择连接,然后就会看到以下界面:

选中箭头所指处,会出现如下界面,这里买包含了请求的URL、响应头、请求头等信息:

我们需要的信息有三处,分别是请求的URL、请求标头和表单数据(此界面往下滚动可以看到),下面将我的这三处信息列出(已做部分删减):

#请求 URL
http://172.208.2.102/eportal/InterFace.do?method=login
#请求标头
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Content-Length: 714
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: EPORTAL_COOKIE_DOMAIN=; EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_COOKIE_USERNAME=XXXXXXX; EPORTAL_COOKIE_PASSWORD=72d788730b004267160ba597f65d49696546e05956eca71eb431267c5ed3d5a867acfe4798ace8e5377166560018a9b7fe03d09e27a5e5ed53e2ec657e9d2d600bb4c6d88862ea4c670c002d4580abefd; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_COOKIE_SERVER=%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1; EPORTAL_COOKIE_SERVER_NAME=%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1; servicesJsonStr=XXXXXXXXX%40%25%25usrname%47%BB%E5%8A%A8%40%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1%40%E4%B8%AD%E5%9B%BD%E8%81%94%E9%80%9A; EPORTAL_USER_GROUP=%E6%9C%AC%E7%A7%91%E7%94%9F; JSESSIONID=6733A7A7B5883E3B32D6D9913EBBCB94
Host: 172.208.2.102
Origin: http://172.208.2.102
Referer: http://172.208.2.102/eportal/index.jsp?wlanuserip=e8e94f0debd13c3de2e5fa23939&wlanacname=95e85ec1ef155b&ssid=f00903742a3147f4&nasip=ef1c48e750081aea5c098614859a8603&mac=c2693cb11284edfec83913ddde2c7b1a&t=wireless-v2&url=ffe0492572b7fdef69c4a29a31d86f6c5c64347fdb355b92
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52
#表单数据
userId: 5140420311
password:5d49696546e05956eca71eb431267c5ed3d5a867acfe4798ace8e53771665e9e26a5c1c3a384652ab3ca3cc8cd85dfb583fd2b2c4a26f89b66704fd05efc6327f63983cdab2967f19d54c9fca21260018a9b7fe03d09e27a5e5edd600bb4c6d88862ea4c670c002d4580abefd
service: %E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1
queryString: wlanuserip%3De8e94f0debd13c3de4fb4e2e5fa23939%26wlanacname%3D95e85b5ec1ef155b%26ssid%3Df00903742a314p%3De098614859a8603%26mac%3Dc2693cb11284edfec83913ddde2c7b1a%26t%3Dwireless-v2%26url%3Dffe0492572b7fdef69c4a29a31d86f6c5c64347fdb355b92
operatorPwd:
operatorUserId:
validcode:
passwordEncrypt: true

获取这三处数据之后,就可以写代码了,写的是python代码,需要将以上获取的请求标头和表单数据转换为python的字典数据(就是加个大括号和一些引号)

观察以上数据,可以看到,有些字段为空,如operatorUserId: ,当进行转换时,可以选择转化为

"operatorUserId": ""

也可以选择删除这一项。不同的网络环境,选择删除还是为空效果未知,有的环境下删除后就无法认证成功,必须将其添加并置空,实际情况需要自己去测试。

三、编写代码

话不多说,先放代码:

import requests
import curlifyurl = "http://172.208.2.102/eportal/InterFace.do?method=login"data={"userId": "user","password":"72d788730b004267160ba597f65d49696546e05956eca71eb431267c5ed3d5a867acfe4798ace8e53771666a53a384652ab3ca3cc8cd85dfb583fd2b2c4a26f89b66704fd05efc6327f63983cdab2967f19d54c9fca21260018a9b7fe03d09e27a5e5ed53e2ec657e9d2d600bb4c6d88862ea4c670c002d4580abefd","service": "%EB8%AD%%E7%94%B5%E4%BF%A1","queryString": "wlanuserip%3e94fe2e5fa23939%26wlanacname%3D95e826ssid%3Df00903742a3147f4%26nasip%3Def1c48e750081aea5c098614859a8603%26mac%3Dc2693cb11284edfec83913ddde2c7b1a%26t%3Dwireless-v2%26url%3Dee50ef31b79649b7628c272d11a9c01cc3874a71ba4cb082d339c9cc1c5ebf6c683","passwordEncrypt": "true"
}header={"Accept": "*/*","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Connection": "keep-alive","Content-Length": "714","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","Cookie": "EPORTAL_COOKIE_DOMAIN=; EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_PASSWORD=72d726716f65d49696546e05956eca71eb431267c5ed3d5a867acfe4798ace8e53771665e9e26a5c1c3a384652ab3ca3cc8cd85dfb583fd2b2c4a26f89b66704fd05efc6327f63983cdab2967f19d54c9fca21260018a9b7fe03d09e27a5e5ed53e2ec657e9d2d600bb4c6d84c670c002d4580abefd; EPORTAL_COOKIE_USERNAME=3190707121; EPORTAL_COOKIE_OPERATORPWD=TYGYUBUHJ; EPORTAL_COOKIE_SERVER=%E4%B8%9B%BD%E7%94%B5%E4%BF%A1; EPORTAL_COOKIE_SERVER_NAME=%E4%B%BD%E7%94%B5%E4%BF%A1; EPORTAL_USER_GROUP=%E6%9C%7%A7%91%E7%94%9F; servicesJsonStr=3190705%25username%40%25%25%E4%B8%AD%E5%9B%BB%E5%8A%A8%40%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1%40%%E8%81%94%E9%80%9A; JSESSIONID=28899BBACBB5578AD08327A","Host": "172.208.2.102","Origin": "http://172.208.2.102","Referer": "http://172.208.2.102/eportal/index.jsp?wlanuserip=e8e94f0debd13c3de4fb4e2e5fa23939&wlanacname=95e85b5ec1ef155b&ssid=f00903742a3147f4&nasip=ef1c48e750081aea5c098614859a8603&mac=c2693cb11284edfec83913ddde2c7b1a&t=wireless-v2&url=ee50ef31b79649b7628c272d11a9c01cc30b9542d98da51874a71ba4cb082d339c9cc1c5ebf6c683","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52"
}response=requests.post(url,data,headers=header)
ret = curlify.to_curl(response.request, compressed=True)
with open("login.sh",'w') as f:f.write(ret)
print(ret)
response.encoding='utf8'
print(response.text)

以上代码中涉及的三个变量,urldataheader,分别对应上一步获取的请求的URL、表单数据和请求标头,只需要用上一步获取的相关信息替换掉以上代码相应部分的内容即可。注意要以json格式填入,字段和值都要使用双引号包裹,每一条数据结束后要加英文逗号。不想再继续折腾的同学可以直接使用python脚本进行认证,到这儿就可以终止了。
       以上python代码可以直接实现校园网的登录认证,同时,该python代码会生成一个login.sh的文件,该文件的内容即是curl要执行的命令,将其粘贴到终端中可以直接运行(Linux终端,Windows不可以),或者直接运行刚才生成的脚本文件(同样需要Linux环境),若不想安装Linux的可以安装使用git,git中带有curl工具。

#login.sh中的内容
curl -X POST -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' -H 'Connection: keep-alive' -H 'Content-Length: 706' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Cookie: EPORTAL_COOKIE_DOMAIN=; EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_PASSWORD=72d77160ba546e05956eca71eb431267c5ed3d5a867acfe4798ace8e53771665e9e26a5c1c3a384652ab3ca3cc8cdfb583fd2b2c4a26f89b66704fd05efc6327f63983cdab2967f19d54c9fca21260018a9b7fe03d09e27a5e5ed53e2ec657e9d2d600bb4c6d88862ea4c670c002d4580abefd; EPORTAL_COOKIE_USERNAME=3190707121; EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_COOKIE_SERVER=%E4%B8%E5%9B%BD%E7%94%BF%A1; EPORTAL_COOKIE_SERVER_NAME=%E9B%BD%E7%94%B5%E4%BF%A1; EPORTAL_USER_GROUP=%E6%9C%AC%E7%A7%91%E7%94%9F; servicesJsonStr=31907sername%40%28%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8%40%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1%40%E4%B8%AD%E5%9B%BD%94%E9%80%9A; JSESSIONID=2889CBF2123DEB5578AD08327A' -H 'Host: 172.208.2.102' -H 'Origin: http://172.208.2.102' -H 'Referer: http://172.208.2.102/eportal/index.jsp?wlanuserip=e8e94f0debd13c3de4fb4e2e5fa23939&wlanacname=95e85b5ec1ef155b&ssid=f00903742a3147f4&nasip=ef1c48e750081aea5c098614859a8603&mac=c2693cb11284edfec83913ddde2c7b1a&t=wireless-v2&url=ee50ef31b79649b7628c272d11a9c01cc30b9542d98da51874a71ba4cb082d339c9cc1c5ebf6c683' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52' -d 'userId=65565631&password=72730b0097f65d456eca71eb431267c5ed3d5a867acfe4798ace8e53771665e9e26a5c1c3a384652ab3ca3cc8cd85dfb583fd2b2c4a26f89b66704fd05efc6327f63983cdab2967f19d54c9fca21260018a9b7fe03d09e27a5e5ed53e2ec657e9d2d600bb4c6d88862ea4c670c002d4580abefd&service=%25E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1&queryString=wlanuserip%253De8e94f0debd13c3de4fb4e2e5fa23939%2526wlanacname%253D95e85b5ec1ef155b%2526ssid%253Df00903742a3147f4%2526nasip%253Def1c48e750081aea5c098614859a8603%2526mac%253Dc2693cb11284edfec83913ddde2c7b1a%2526t%253Dwireless-v2%2526url%253Dee50ef31b79649b7628c272d11a9c01cc30b9542d98da51874a71ba4cb082d339c9cc1c5ebf6c683&passwordEncrypt=true' --compressed 'http://172.208.2.102/eportal/InterFace.do?method=login'

四、一种更为简便的方法

以上介绍的方法需要具有一定的Python基础,比较复杂,最新又发现了一种新的方法,操作起来将会更加简单。在准备工作中,我们在浏览器的开发者选项中,看到了请求,如下图所示。
选择请求,然后点击右键找到复制,选择复制为Curl,需要在Windows下认证的选择cmd,Linux选择bash。

选择复制之后,我们就得到了curl认证命令,通过这方法,我们就不需要通过编写Python代码来转换了,我复制的内容如下:

curl 'http://172.208.1.202/eportal/InterFace.do?method=login' \-H 'Accept: */*' \-H 'Accept-Language: zh-CN,zh;q=0.9' \-H 'Connection: keep-alive' \-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \-H 'Cookie: EPORTAL_COOKIE_USERNAME=u323003433242; EPORTAL_COOKIE_PASSWORD=43123332317; EPORTAL_COOKIE_SERVER=; EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_COOKIE_DOMAIN=QDQSDAA; EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_AUTO_LAND=323EVHVHVJHJHJ; EPORTAL_USER_GROUP=YGYUIISSQDWD; EPORTAL_COOKIE_SERVER_NAME=; JSESSIONID=FBAC8EEEC2C26D144C5EA2BD32BF0044' \-H 'Origin: http://172.208.1.202' \-H 'Referer: http://172.208.1.202/eportal/index.jsp?wlanuserip=78b1ea714960e8a94655d8cf7fea4bec&wlanacname=4338bd8da86e2598d3b3e05ca2b8eb&ssid=&nasip=3b5f2cf6a78d35eb7c8ad7ce4aed65&snmpagentip=&mac=139c077f65e02ddf677244998cf1c0&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30&apmac=&nasid=48bddsd8da86e992598d3b3e05c&vid=05a2b409b03d6&port=65184f32a03e53f9&nasportid=5b9da5b08a53a540f2f5e563db21f2357b2237cf1515ec2e1252b4b988fcb6db' \-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.37' \--data-raw 'userId=a20dssf220042&password=201dsfdsfsfs317&service=&queryString=wlanuserip%253D78b1ea714960e8a94655d8cf7fea4bec%2526wlanacn2eame%253D4338bde2sfsd8da86e9vxcxdvx92598d3b3e05ca2b8eb%2526ssid%253dasaD%2526nasip%xcvx25e23D3b5f2cf6a78d35eb7c8ad7c16e4aed65%2526snmpagentip%253D%2526mac%253D138e9c077f65esada0fvd2ddf677244998cf1c0%2526t%253Dwireless-v2%2526url%253D2c0328164651e2b4f13b933ddf36628bea622dedcc302b30%2526apmac%253D%2526nasid%253D4338bd8da86csd23232ffe992593238d3b3e05ca2b8eb23%2526vid%253D05a2b409b0ef43d6%2526port%253D651vdfv84f3232a03e53f9%252632nsdasportid%253D5b9da5b08a53a540f2f5e563db21f2357b2237cf1515ec2e1252b4b988fcb632342db&oper43atorPwd=&operadvsdtor32UserId=&validcode=&passwordEncrypfvdft=false' \--compressed \--insecure

然后将这串命令写入到脚本文件中,赋予可执行权限后执行即可。
注意:对于较低版本的curl命令,执行以上命令可能存在错误

此时将命令中的--data-raw改为--data即可,再次运行,即可成功。

五、将curl脚本放入路由器,实现路由器自动认证

python和curl脚本都写了,但是好像还是没有实现自动认证啊,自动认证吗,还是得路由器自己来,那才叫自动认证。
如下图所示,登录老毛子后台,选择系统管理->服务,然后将telent和SSH都打开,打开之后就可以登录路由器的终端了。

       登录路由器终端可以有很多种方式,使用putty、Xshell和Termius都行,甚至使用windows命令行也行。登陆上终端后创建文件,文件名、文件路径自定义,能找到就行,我实在/home/root下创建一个名为login.sh的文件,所以该文件的路径为/home/root/login.sh(接下来要用),在路由器中创建并向文件写入内容好像只能用vi了,当然,重定向也行。将运行python脚本生成的login.sh文件内容全部复制粘贴到路由器上创建的文件中去,保存退出,并使用chmod +x 文件给你创建的文件赋予可执行的权限。
       除了创建文件后将内容粘贴到文件中外,还可以直接将python生成的文件上传至路由器中去,记得赋予可执行权限和记得文件的路径。

添加好脚本之后,这要设置让脚本定时执行就可以了。打开路由器后台,系统设置->服务-> 计划任务 (Crontab),然后添加规则就好。

添加的规则如下:

minute hour day month week command

比如,要想让它每天六点执行,就添加如下内容:

0 6 * * * /home/root/login.sh

command为刚创建的脚本文件的路径。像我们学校6点恢复网络,那建议设置6点01分认证,添加完成后记得点击应用。大功告成,以后起来就不用再手动认证了。

说明:在老毛子系统中,文件只有放在/etc/storage目录下重启路由器才不会被清楚,所以建议自定义脚本放在/etc/storage/script目录下。

使用python或curl实现校园网自动登录相关推荐

  1. 基于python+splinter工具模拟校园网自动登录+密码破解

    工具: python + splinter 技术目标: 1.利用python的splinter package,在登录界面中自动完成页面操作,提取elements,      post element ...

  2. python自动登录教程_python实现校园网自动登录的示例讲解

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

  3. python自动登录校园网 密码_python实现校园网自动登录的示例讲解

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

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

    python实现校园网自动登录的示例讲解 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python实现校园网自动登录的示例讲解.txt ] (友情提示:右键点上 ...

  5. 利用Python实现校园网自动登录(部署在树莓派)

    利用Python实现校园网自动登录(部署在树莓派) 项目场景: 在实验室的时候,每天的第一个苦恼就是面对不自动弹窗的校园网登录,且一个账号仅支持两个设备. 实验室使用了路由器,多个设备使用同一个账号上 ...

  6. 【Python】基于Selenium实现上海大学校园网自动登录

    [Python]基于Selenium实现上海大学校园网自动登录 安装selenium Selenium官网 以anaconda环境为例,创建一个Selenium的虚拟环境,若不需要可以不做第一.二步 ...

  7. Ubuntu20.04实现Python基于Selenium实现上海大学校园网自动登录

    Ubuntu20.04实现Python基于Selenium实现上海大学校园网自动登录 以anaconda环境为例,创建一个Selenium的虚拟环境: 一.安装selenium 1. conda cr ...

  8. python—四川大学校园网自动登录

    四川大学校园网自动登录 import requests import redef getLoginMsg():url = 'http://192.168.2.135'r = requests.get( ...

  9. 桂林电子科技大学校园网自动登录

    桂电的校园网自动登录十分十分十分简单 1. 原理: 懒得说原理 2. 步骤: 网上有 3. 结论和方法: 1. 结论 直接访问特定的url就能登录了,这里给出校园网登录的和联通的url: 校园网url ...

最新文章

  1. mysql主从复制监控shell脚本
  2. Profiler 使用说明
  3. linux非root用户搭建docker,Linux CentOS 7 非root用户安装源码版Docker
  4. python定义一个类和子类_Python面向对象class类属性及子类用法分析
  5. 解析可变参数函数的实现原理(printf,scanf)
  6. 使用Python+Tensorflow的CNN技术快速识别验证码
  7. flink中的HybirdmemorySegment
  8. 怎么禁止浏览器自动保存密码?
  9. JUnit编写单元测试代码注意点小结
  10. 网页页面禁止用户复制源代码
  11. php获取本地上传图片地址,php获取CSS文件中图片地址并下载到本地的方法
  12. 万能打印之Delphi 2010实现(一)
  13. vmware fusion8 序列号
  14. cd linux制作u盘启动盘,【cdlinux u盘启动】cdlinux制作U盘启动盘详细教程
  15. RuntimeError: DataLoader worker (pid 4499) is killed by signal: Segmentation fault.检查内存条!
  16. 2908. Annoying painting tool
  17. 慕尼黑大学计算机硕士专业,德国可以申请的英语授课的计算机硕士有哪些学校?...
  18. WordPress缩略图出现A TimThumb error has occured解决办法
  19. 【Vue3】电商网站吸顶功能
  20. Unity Particle System 制作刀光特效

热门文章

  1. PyTorch 使用Torchtext进行语言翻译(德语到英语)
  2. python可以代替php吗_PHP资深开发者谈:缘何放弃PHP改用Python
  3. 全国民航职工田径运动会
  4. php制作网页论文,php动态网页制作—毕业设计论文.doc
  5. 破解ZIP压缩包破解密码
  6. 张敏计算机专业,张敏 - 计算机与信息科学学院 - Powered by 西南大学
  7. C++学习笔记(三)——面向过程编程的C++之内存模型和命名空间
  8. ipa在线签名服务器搭建
  9. Javascript开发之js压缩篇
  10. oracle 存取图片,用ASP.NET 2.0在Oracle中存取图片(文件)的操作