发布于 

一个自动连接重邮校园网的小技巧

登陆原理

学校是web登陆认证,只需发送一个GET请求即可。想要做到自动登陆,难点在于获取ip和判断脚本执行的时机。

实现方案

需要使用ifconfig命令获取ip,以arch系为例,需要安装net-tools
校园网分配的ip都是10.开头的,所以可一用grep 'inet 10.',当然如果主机存在其他以10.开头的ip,可能会产生干扰,后续可考虑加入判断条件。
当然你也可以用其他方式获取ip

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#author tobios

device=1 #奇数为手机端,偶数为pc端口
operator=cmcc #移动为cmcc,电信为telecom,联通为unicom
user_account='这里替换成用户名'
user_password='这里替换成密码'
ip=`ifconfig | grep 'inet 10.' | awk '{print$2}'`

echo "当前ip为:$ip"
echo "开始连接"

flag=`curl -s "http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C$device%2C$user_account%40$operator&user_password=$user_password&wlan_user_ip=$ip&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=9863"`

# echo $flag

flag_ok='dr1003({"result":"1","msg":"\u8ba4\u8bc1\u6210\u529f"})'
flag_reget='dr1003({"result":"0","msg":"","ret_code":2})'
flag_error='dr1003({"result":"0","msg":"bGRhcCBhdXRoIGVycm9y","ret_code":1})'

if [ "$flag" = "$flag_ok" ]
then
echo "认证成功"
elif [ "$flag" = "$flag_error" ]
then
echo "认证失败"
elif [ "$flag" = "$flag_reget" ]
then
echo "已连接,请勿重复操作"
else
echo $flag #还存在其他的返回,懒得罗列了,一般都是这三
fi
如果你使用ifupdown配置网络,可以将脚本添加到`/etc/network/interfaces`中
1
up bash -e 这里写脚本目录
* 这里的 pre-up ,up,down,post-down为网卡启动的钩子 * pre-up 对应的为 网络启动之前执行脚本 * up 对应网络启动之后执行脚本 * down 网络关闭之间 * post-down 网络关闭之后

可以通过systemd来设置开机启动服务,来对每次开机时再网络开启之后执行一次脚本命令,

1
vim /etc/systemd/system/autologin.service
写入以下内容
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=test networking
#Before=network.target
After=NetworkManager.service # 网络启动之后,这里以NetworkManager为例,请替换成你所使用的网络管理服务
[Service]

Type=oneshot # 执行一次
ExecStart=/bin/bash -e 这里替换成脚本路径
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target #多用户模式

亦或者加入crontab中

win10以下需要额外安装curl
当然也可以选择用其他工具发get请求

cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@echo off
::author tobios

rem 请修改config中的信息
rem ConfigStart
set "device=1" ::奇数为手机端,偶数为pc端口
set "operator=cmcc" ::移动为cmcc,电信为telecom,联通为unicom
set "user_account=这里替换成用户名"
set "user_password=这里替换成密码"
rem ConfigEnd

:GetIP
for /f "tokens=2 delims=:(" %%i in ('ipconfig /all ^|findstr "IPv4" ^|findstr "10."') do (
set "IP=%%i"
goto :ShowIP
)

:ShowIP
set "IP=%IP: =%"
if " ="=="%IP%" (
echo 错误,请检查网络连接情况
) else (
echo 当前ip为:%ip%
echo 开始连接
goto :Login
)
goto :Exit

:Login
for /f %%i in ('curl -s "http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%%2C%device%%%2C%user_account%%%40%operator%&user_password=%user_password%&wlan_user_ip=%ip%&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=9863"') do (
set "flag=%%i"
goto :ShowResult
)

:ShowResult
set "flag_ok=dr1003({"result":"1","msg":"\u8ba4\u8bc1\u6210\u529f"})"
set "flag_reget=dr1003({"result":"0","msg":"","ret_code":2})"
set "flag_error=dr1003({"result":"0","msg":"bGRhcCBhdXRoIGVycm9y","ret_code":1})"
if "%flag%"=="%flag_ok%" (
echo 认证成功
goto :Exit
) else if "%flag%"=="%flag_error%" (
echo 认证失败
goto :Exit
) else if "%flag%"=="%flag_reget%" (
echo 已连接,请勿重复操作
goto :Exit
)
echo %flag%

:Exit
pause

接下来实现连接WiFi自动运行脚本

  1. 打开任务计划程序
    image.jpg

  2. 点击右侧‘创建任务’,名称、描述按自己喜好写
    image.jpg

  3. 点击触发器选项并点击新建
    image.jpg

  4. 选择开始任务为发生事件时,并选择自定义、点击新建事件筛选器
    image.jpg

  5. 点击xml并勾选手动编辑查询,替换为以下内容,后点确定
    image.jpg

    1
    2
    3
    4
    5
    <QueryList>
    <Query Id="0" Path="Microsoft-Windows-WLAN-AutoConfig/Operational">
    <Select Path="Microsoft-Windows-WLAN-AutoConfig/Operational">*[System[(EventID=8001)]][EventData[Data[@Name='SSID']='CQUPT'] or EventData[Data[@Name='SSID']='CQUPT-2.4G'] or EventData[Data[@Name='SSID']='CQUPT-5G']]</Select>
    </Query>
    </QueryList>
  6. 然后点击操作选项并点击新建
    image.jpg

  7. 选择操作为‘启动程序’,并选择脚本的位置,然后确定
    image.jpg

  8. 如果你使用笔记本电脑,需要额外关注‘条件’中的‘电源’选项
    image.jpg

  9. 最后点击确定就ok了

未完待续


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @Tobios 创建,使用 Stellar 作为主题。