Dr.COM校园网多设备解决方案——路由器 Padavan 固件自动网页认证+Telegram Bot 定时发送连接情况

hjthjthjt 4月 06, 2019


仅在我校校园网下测试通过,不代表兼容所有使用 Dr.COM 网页认证的学校,请充分发挥主观能动性,按照实际情况修改相关内容。

说到Dr.COM……如果你是客户端认证,其实 Github 上已经有挺多方案了。但是我校是网页认证(其实也好……网页认证我觉得更容易模拟登录)

Dr.COM 网页认证的原理就是 POST 登录信息而已……原理上,就是用 curl 发一个 POST。

获取 curl

这里直接贴一个我校可用的 curl,你也可以通过抓包来获得(不过我这里自己抓包总是会抓到 10. 开头的内网IP,加上吧,容易因为被别人分配到了我用不了,不加吧,又打不开……)

curl -X POST "http://192.168.254.226:801/eportal/?c=ACSetting&a=Login&protocol=http:&hostname=192.168.254.226&iTermType=1&wlanacip=null&wlanacname=null&mac=00-00-00-00-00-00&enAdvert=0&queryACIP=0&loginMethod=1" -H "Origin: http://192.168.254.226" -H "Connection: keep-alive" -H "Cache-Control: max-age=0" -H "Upgrade-Insecure-Requests: 1" -H "Content-Type: application/x-www-form-urlencoded" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" -H "DNT: 1" -H "Referer: http://192.168.254.226/a70.htm?wlanacip=null&wlanacname=null&vlanid=0&ssid=null&areaID=null&mac=00-00-00-00-00-00" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: zh-CN,zh;q=0.9" -b "vlan=0; ssid=null; areaID=null; program=2018050401-hnkj; save_DDDDD=用户名; save_upass=密码; ISP_select=@telecom; md5_login2=|,0,用户名@运营商|密码;" --data "DDDDD=,0,用户名@telecom&upass=密码&R1=0&R2=0&R3=0&R6=0&para=00&0MKKey=123456&buttonClicked=&redirect_url=&err_flag=&username=&password=&user=&cmd=&Login=" --tlsv1.3 -o Sxinfo.txt

其中,有关内容请自行修改。

请注意,此 curl 并不一定适用于你的学校(按理说挺多地方不行的,需要你自己通过对登陆窗的源码进行分析修改),尤其是 --data的内容,请根据实际情况自行修改。

修改项

获取IP和端口

192.168.254.226 为我校校园网登陆窗页面 IP,801为端口。

如果你不确定自己学校的端口,可以自己使用 Chrome 开发者工具查看。

在登录页面按下 F12,在 Network处找一找应该就能看到。

获取「–data」

对于我校(哪个学校?自己翻翻我旧文章……)学生,curl 中不需要过多变动,这个小节可以跳过。

适用于我校:用户名密码即为上网登录窗的账号密码,运营商中,电信是telecom,移动是cmcc,联通是unicom,纯校园网出口没有测试,你知道的话可以在评论中告诉我。

对于其他学校的学生,--data后的内容可以通过 Chrome 开发者工具查看,同样是在登录界面按下F12,按照图中1和2选中后再登录

在左侧中寻找右侧为 Request Method: POST的项,如果找到了,那就是上图我们需要的,按照上图3,4,5进行操作,获得暂时的 curl。

为什么是暂时的?因为这里得到的 curl 应该是包含我上面说到的 10. 的内网 IP 的,带上它你也许不能正常登录。

将剪贴板的内容取出,找到--data,将其后紧跟着的单引号后面的内容,替换到开头给予的 curl 里。

在此,你应该得到了理论能用且永久的 curl。

包票打不起,情况太多了,如果你成功在你校校园网中试验成功,也许可以在评论区里告诉我。

如果你只是需要在电脑启动的时候自动登录,你可以直接将 curl 拿去用了,下面的内容可以不看。

如果你是个gaowan高玩,希望借助路由器玩儿,往下看吧

Padavan 路由器设置

当然,这并不局限于 Padavan,其他允许自定义 crontab 的固件也可以,笔者使用 Padavan,因此以它为例。

sh 文件内容

首先,找个编辑器(你真要记事本也没问题,不过不推荐,最好是 Sublime Text 3 之类的),在其中粘贴以下内容:

(请注意,此代码不包含「Telegram Bot 定时发送连接情况」的部分,因为并不能确定你的路由器是否已经配置了可以正常访问 Telegram 服务的相关设置,如果你只需要登陆而不需要刻意提醒,你可以直接使用下面的代码。如果你需要 Telegram Bot 的提醒,忽略下面的 sh 内容,往下看还有新的。

#!/bin/bash

logger "【Dr.COM网页认证】开始定时检测"
curl http://192.168.254.226 > drcom.html #①
check_status=`grep "Dr.COMWebLoginID_0.htm" drcom.html` #②
if [[ $check_status != "" ]]
then
    #尚未登录
    logger "【Dr.COM网页认证】上网登录窗尚未登录"


    ##此处为你已修改完毕的curl##③


    logger "【Dr.COM网页认证】上网登录窗未登录,现已登录"
else
    #已经登录
    logger "【Dr.COM网页认证】上网登录窗之前已登录"
fi
logger "【Dr.COM网页认证】结束定时检测"

修改相关内容:

  • ①处:请修改为你上网登陆窗的IP,此处不需要端口
  • ②处:请打开上网登陆窗,查看网页源码,在其中找到特异性内容,即登录状态下上网登陆窗有的,而未登录时却没有的代码。我的代码中,Dr.COMWebLoginID_0.htm是登陆窗未登录时拥有的代码,原理即通过 curl 将登陆窗内容存至drcom.html文件,分析文件文本,如果包含有Dr.COMWebLoginID_0.htm,就代表此时是「未登录」状态,需要执行登录。
  • ③处:你最终修改获得的 curl 文本

不需要保存,我们只是找个地方好好把内容准备好而已。

上传至路由器存储空间

接着,你需要使用 ssh 连接你的路由器以通过 vi 编辑 sh 脚本。如果你已经是 Linux 系统的话,不需要这多余的操作,直接将本地编辑好的 sh 文件传给路由器即可。这里主要说 Windows 下。

为什么 Windows 相对特殊?因为 Win 和 Linux 的空格,回车不同,在某些情况下如果是包含着 Win 空格的 sh 文件,在 Linux 下可能无法执行,但通过 vi 编辑时粘贴进去的内容却没问题。

借助 ssh 工具,例如 Xshell

连接的主机为路由器内网 IP,与你登录后台面板是同个 IP。

端口一般为默认,不需要修改,账号密码与后台登录一样。

如果你是 hiboy 版本的 Padavan,那么主机为 192.168.123.1,账号密码默认均为admin,其他版本请根据作者介绍自行探索。

在 ssh 工具中成功连接上后,执行以下指令:

cd /etc/storage
vi drcom_cron.sh

vi后的内容可以随你定义,毕竟什么名字随你。接着按下i会进入编辑模式。

右键,如果是Xshell的话会有粘贴的选项,如果是putty的话会直接粘贴,无论如何,根据你使用的软件把内容粘贴进去即可。

按下 ESC 退出编辑模式,直接键盘输入:wq后按下回车保存(注意,此处有一个英文冒号)

再执行以下指令用于获得执行权限:

chmod +x drcom_cron.sh

现在,你的路由器数据文件中应该包含我们需要执行的东西了。

你可以试试退出上网登陆窗登录,然后执行指令,看看是否处于登录状态了。

./drcom_cron.sh

如果没有,有可能是哪个步骤出错了,也有可能你的学校校园网不支持此方法。

无论如何,如果你成功登录了,接着看吧。

使用计划任务保证处于登录状态

进入路由器后后台面板,相关后台IP和账号密码请根据 Padavan 作者的介绍填写(如果你是 hiboy 版本的 Padavan,那么后台地址为 192.168.123.1,账号密码默认均为admin

将 sh 文件保存防止重启丢失

进入:高级设置 → 系统管理 → 恢复/导出/上传设置 → 路由器内部存储[脚本文件] (/etc/storage) → 点击「保存 /etc/storage/ 内容到闪存」的「提交」按钮

虽然不知道这步是否必要,但是用了总没错。

路由器重启后执行登录操作

进入:高级设置 → 自定义设置 → 脚本 → (以下两处)

「在路由器启动后执行」「在 WAN 上行/下行启动后执行」在代码末尾添加:

/etc/storage/drcom_cron.sh

保存。

添加计划任务

进入:高级设置 → 系统管理 → 服务 → 其他服务 → 保持「Cron守护程序 (计划任务)」处于开启状态,然后在「计划任务 (Crontab)」中输入:

#每周一到周五的每天6点到24点的每10分钟,执行一次检测登录指令
*/10 6-23 * * 1-5 /etc/storage/drcom_cron.sh 
#每周一到周五的每天6点整,重启路由器
0 6 * * 1-5 reboot & #删除开头的#启动命令

当然,如果你的学校并非有0点断网之类的,你可以直接去除重启的 cron 任务指令。

请根据自己学校的断网来网情况,结合 crontab.guru 这个网站编辑属于你自己的 cron 指令。

保存。

现在,按理说一切都成功了,你可以明天起床后连接此路由器来测试它是否准确在6点重启并自动登录。

(可选)Telegram Bot 定时发送连接情况

嘛,既然标题都说了,那我们就借助 Telegram Bot 来获取连接情况,这个功能主要是用来检测你的校园网登录是否掉了(根据上面计划任务的话,我们就可以知道它在哪个时间段内没有给你发消息,即断网了)(Well……不排除因为某种设施进行日常升级导致你的设备无法正常访问某些 IP 上的某些东西。)

在此之前,确保你的路由器处于可以访问 Telegram API 的情况。(对于 hiboy 版的 Padavan,一般意味着下面打码处的内容你已经配置完毕了。

这里不对你怎么让它能够访问做解释。

创建 Telegram Bot

在 Telegram 中找到 @botfather,向它发送 /newbot

根据提示依次给予Bot名用户名。请注意按照提示以 bot 结尾。

此时,Bot Father 应该会给你一串 token,且内容中「You will find it at t.me/XXXXXXXXXXXXXXXX.」这里的地址可以直接访问到你的 Bot,请向你的 Bot 至少发送一次 /start,它不会回复你,无需理会

这里插播一个内容,hiboy 的 Padavan 是自带 tgbot 功能的(用于检测互联网 IP 变动,给予设备接入提醒,设备上、下线提醒,固件更新提醒),位置在 扩展功能→广告屏蔽功能→tgbot(这个位置可真是……),你可以根据需要顺便把这只 Bot 也用于上面的小功能,此处不再赘述。

获得 curl 内容

这里,我们先整理一下你所需要的用于 Telegram Bot 的 curl 文本,你可以在 XShell 之类的软件中连接 ssh 后执行 curl,然后看看 Telegram 那边你的 Bot 是否给你发了对应内容。如果发了,这里就没问题了~

curl -s "https://api.telegram.org/bot(这里是token)/sendMessage?chat_id=(这里是你的id)" --data-binary "&text=(要发送的消息内容)" &

(不用质疑,文本里的bot是直接和token连在一起的,比如我的是bot774……

你的 id 可以通过向 @getidsbot 发送 /about 来获得。

包含 Telegram Bot 提醒功能的 sh 内容

重新梳理一下你所需要的 sh 文件,这里提供了一个 DEMO:

#!/bin/bash

#(一)检测是否是登录状态
logger "【Dr.COM网页认证】开始定时检测"
curl http://192.168.254.226 > drcom.html
check_status=`grep "Dr.COMWebLoginID_0.htm" drcom.html`
if [[ $check_status != "" ]]
then
    #尚未登录
    logger "【Dr.COM网页认证】上网登录窗尚未登录"

    # 此处为你已修改完毕的curl

    logger "【Dr.COM网页认证】上网登录窗未登录,现已登录"
    curl -s "https://api.telegram.org/bot(这里是token)/sendMessage?chat_id=(这里是你的id)" --data-binary "&text=【Padavan联网状态】当前路由器未联网,已执行登录。当前时间 ""`date`" &

    logger "【Dr.COM网页认证】已通过 Telegram Bot 发送当前时间"
else
    #已经登录
    logger "【Dr.COM网页认证】上网登录窗之前已登录"
    curl -s "https://api.telegram.org/bot(这里是token)/sendMessage?chat_id=(这里是你的id)" --data-binary "&text=【Padavan联网状态】当前路由器之前已登录,无需执行登录。当前时间 ""`date`" &
    logger "【Dr.COM网页认证】已通过 Telegram Bot 发送当前时间"
fi
logger "【Dr.COM网页认证】结束定时检测"

嘛,你自己看看就能知道需要改什么,自己决定吧。

怎么保存……?自己滚回上面看。

预览一下效果:

好了,你现在应该可以享受不受设备限制断网后来网时自动登录认证定时发送连接情况的校园网服务了。

如果对你的学校有用,希望你可以在评论区告诉我,我收集一下23333333

本文采用 CC BY-NC-SA 3.0 协议进行许可,在您遵循此协议的情况下,可以自由共享与演绎本文章。
本文链接:https://jakting.com/archives/drcom-autologin-padavan-tgbot.html

  1. 然而我学校是天翼校园

    1. hjthjthjt说道:

      蜡烛好评

    1. hjthjthjt说道:

      ……

  2. Nigel_NI说道:

    没法从我们学校的校园网认证网页抓到Request Method: POST的包,抓到的所有的包都是GET。那么这个方法是不是不适用于我们学校?

    1. hjthjthjt说道:

      按理说是有POST的,GET太不安全了

      1. Nigel_NI说道:

        curl命令已经修改完了,可以正常登录(路由器暂未测试)。登录指令果然在一个GET包上,都是明文传输,实际配置起来好像还要简单。

        1. hjthjthjt说道:

          绝了……那直接curl地址就行……

发表评论

电子邮件地址不会被公开。 必填项已用*标注