一、引入
学校的校园网每天十二点断网,然后第二天六点恢复,学校允许外接路由器。但是呢,每天早上起来还得打开网页认证一下,尝试使用python脚本进行自动登录,很成功。但是呢,想想又很烦,还得使用python,电脑用的话电脑还得一直开机,手机上弄得话挺麻烦。
想着能不能让路由器每天六点自动认证,于是就发现了curl
这个万能工具。路由器的系统是Linux系统,自带curl
,恰好我路由器刷的老毛子固件,可以让它执行定时任务。
使用python
或cur
l实现校园网自动登录的原理很简单,就是利用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 curlify
url = "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)
以上代码中涉及的三个变量,url
、data
和header
,分别对应上一步获取的请求的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
目录下。