导航
说在前面
重邮多年来一直使用NetKeeper这个死妈软件进行“宽带”(指不超过14M)拨号。广告多不说还限制热点分享。天下苦其久矣。
不过重邮是什么地儿?南山计院可是人才辈出的地方。miao大神通过反向工程NK手机客户端,破解了的NK的密码算法,使路由器自动拨号联网成为可能。这个拨号脚本曾经的风头一时无两。直到后来利信不得已更换了密码算法,并下架了手机客户端。虽然脚本不能再继续自动拨号了,但是拦截法依旧可以正常使用,因此还是可绕开NK的热点分享限制,实现一号共享。
↓前往膜拜miao大神↓
今年年中,重邮终于放弃了NetKeeper,转用DRcom进行网页认证了。网页认证的好处在于不用再下额外的软件进行拨号了,允许一部手机和一台电脑同时登陆,有路由器的话更是可以连接更多设备……反正就是好处多多。
不过换成网页认证的话,之前写过的客户端自动拨号批处理文件就没啥用了,作为一条懒狗,当然是希望路由器每天自动拨号,不用自己打开网页浪费那几秒钟时间了(懒死得了)
需要什么?
说干就干!先讲清楚需要准备的东西:
- 一部Linux内核路由器,OpenWrt,LEDE,老毛子什么的都行
- 一款现代浏览器,Chrome,Firefox,Edge Whatever,手机上的Yandex和IDM浏览器也可
- 一款SSH软件,比如XShell
- 愿意折腾的心
什么?你没有Linux内核的路由器?或者你压根没有路由器?看这里!
OK,万事俱备了,开搞
获取认证信息
1、首先浏览器打开认证网页,以重邮为例:http://192.168.200.2,先别急着进行登录认证
2、按F12打开调试模式,然后选中Network标签栏
3、此时再输入账号信息,点击登录,就可以看到登录信息了,如图所示:
此时会得到一串网址,形如:http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C*******%40telecom&user_password=*********&wlan_user_ip=10.16.0.***&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=6065
而这一串网址就包含了进行网页认证需要的所有信息:认证服务器端口、账号、密码、内网IP地址、设备MAC地址。所以,先找个地方把这串网址记下来。当然了,你脑子好使记到脑子里也行
4、接上一条,现在已经知道了网页认证需要什么信息了,咱们就来分析下这些信息。
很明显,你的账号密码、认证服务器的端口和MAC地址是不会变的。但是因为是DHCP动态分配的内网IP,所以如果断电或者重启之后,内网IP地址大概率会改变。而且在网址的最后有一个v=****,据估计这串数字和时间有关,不同时间生成的v不同。但是经过测试,不传递这个v给认证服务器依然可以通过认证,因此唯一需要解决的就是内网IP问题了。
开始写shell脚本。
1、首先确保你的路由器安装了bash、cron和curl。以OpenWrt为例,路由器通常自带基于BusyBox的ash,由于ash无法在脚本内执行循环指令,所以需要手动安装bash。如果你的路由器已经有bash和curl可以跳过,没有的话依次执行以下代码:
opkg update opkg install curl bash cron -y
其他路由器大同小异,自己安装就行。
2、刚刚说了,内网IP是会变的,尤其是在夜间会断电的学校,IP基本上不可能每天都一样,那么首先第一步就是要让脚本获取到路由器的内网IP。最简单的获取ip地址的方法就是ifconfig
ifconfig -a|grep inet |grep -v 127.0.0.1 |grep -v 192.168.1.1 |grep -v inet6 |awk '{print $2}'|tr -d "addr:"
简单说明下,grep -v 192.168.1.1
是为了排除路由器网关地址,你的路由器地址是多少,就把这个IP地址改成多少就好。
获取到IP地址以后,我们可以定义一个变量$ip将其保存起来,同时定义一个变量$url来定义需要向认证服务器传递的认证信息。代码片段如下:
ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v 192.168.1.1|grep -v inet6|awk '{print $2}'|tr -d "addr:")
url="http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=你的账号&user_password=你的密码&wlan_user_ip=""${ip}""&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3"
认证信息拼接完成了,记得把上面的“你的账号”和“你的密码”改成自己的!此时只要利用curl把这串信息发送给认证服务器,理论上你的路由器就已经可以完成认证联网了,因此最简单的shell脚本就可以写成:
#!/bin/bash ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v 192.168.1.1|grep -v inet6|awk '{print $2}'|tr -d "addr:") url="http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=你的账号&user_password=你的密码&wlan_user_ip=""${ip}""&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3" curl -s -o /dev/null "${url}"
注解:curl -s -o是指静默执行,且不输出任何信息。如果想要debug信息,建议看到最后。
3、把脚本命名为任意名称,放在路由器内任意位置,并赋予权限就可以。以我为例,在/root下新建一个autoportal.sh的文件,写入上面的代码并保存。然后
赋予权限。chmod 755 autoportal.sh
设置定时任务
最后,因为重邮非节假日是早上六点多开启上网认证的,所以我们设定一个cron任务,让路由器每天早上6:05的时候执行一次脚本(也可以提前或者延后,根据实际情况来),这样就可以每天自动联网了
首先输入crontab -e
,会默认以编辑器打开一个文件,输入i或者按下insert键,在新的一行输入:
5 6 * * * bash /root/autoportal.sh
这段代码表示每天的6:05分bash执行放在/root目录下的autoportal.sh文件,根据你文件放置的位置自行修改即可。写入完成后依次esc→shift+;→wq→回车退出编辑器,然后重启cron即可
service crond restart
或:
systemctl restart crond.service
OK,至此,大功告成。
玩点有逼格的
但是作为一个有逼格的人,怎么能轻易满足呢对不对?万一今天夜里没断网,就不用认证了呀;万一脚本执行了,还是没连上网,我得知道是哪里出问题了呀……
所以,我削微地优化了一下脚本,它最终长这个样子:
#!/bin/bash netstat=`curl -I -m 1 -o /dev/null -s -w %{http_code} www.baidu.com` #判断访问百毒的返回码,-m 1表示最多只等一秒就要结果,对于百毒来说一秒足够了 if [ $netstat = 200 ];then echo Network Already Connected, Nothing To Do #判断返回码是否是200,如果是,结束认证,告知用户网络已连接。如果不是进行下一步 else ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v 192.168.1.1|grep -v inet6|awk '{print $2}'|tr -d "addr:") #获取内网IP地址 if [ $ip = "" ];then echo Can Not Get UR IP Address, Process Terminated #如果获取不到IP,说明DHCP服务器或者WAN口网线有问题,结束认证进程,告知原因 else url="http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=你的账号&user_password=你的密码&wlan_user_ip=""${ip}""&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3" #生成认证信息 for ((i=1; i<=3; i++)); do curl -s -o /dev/null "${url}" netstat=`curl -I -m 1 -o /dev/null -s -w %{http_code} www.baidu.com` if [ $netstat = 200 ];then break else continue fi done #进行最多三次认证,每认证一次就判断一下是否成功,如果成功停止认证,失败则继续尝试 if [ $netstat = 200 ];then echo Network Connected Successfully else echo Network Connect Failed After 3 Attempts, Process Terminated fi #认证过程结束后判断是否认证成功,并告知用户结果 fi fi
同样的,cron任务也可以修改为:
5 6 * * * bash /root/autoportal.sh > /tmp/portal.log 2>&1
这样如果当天路由器没有成功联网,就可以在路由器/tmp目录下查询portal.log文件了解失败原因,方便排障。
因为懒得截图,几种输出信息各位有兴趣自己探索去吧。
写到最后
如果你只有普通路由器,也是可以通过电脑执行批处理来完成登录认证的,只不过我没有需求所以没写。如果有人对此有需求,可以留言告诉我,我抽空补一下,没有的话就算了
终于完工了,就酱吧,有用自取,无用别B,Peace
发表回复