NCIST校园网自动连接

发布于 2021-10-24  1,686 次阅读


前言

最近实验室装修,实验室的Wi-Fi不能用了,所以只能用校园网了. 之前搞到过几个教师网的账户,现在还能使用来着. 但是每次连接校园网的Wi-Fi都要重新输入帐号密码,搞得有点烦躁,刚好最近在业余时间也学了Python,那就搞一个自动登录吧!

  • 虽然我已经完成了大量的工作,但是由于每个人机器环境不一样和之后校园网可能的更新 ps. 其实主要是懒的去用`QT`写界面(呜呜 ,工作量依然很大,如果你不想折腾的话就右上角退出叭.
  • 学校: NCIST
  • Wi-Fi: ncist-teacher
  • 支持的平台: Linux
  • 如果想要快速使用的话,请直接跳转到 GitHub

实现过程

实现思路

  1. 检测连接到校园网
  2. 执行登录脚本

登录原理

我们学校是 Web 登录,通过发送一个 GET 请求来进行登录/注销. 当然,这里我们只需要登录就行了. ps. 当然更多的学校是使用 POST 请求,更加安全

在浏览器中输入登录校园网的网址,我们学校是http://10.200.0.2/,按下F12,选择NetWork(网络),勾选Preserve log(保存日志). 然后输入帐号密码,我们可以看到一个get请求. 类似下面这种.

http://10.200.0.2:801/eportal/?c=Portal&a=login&
callback=dr1635076144926&login_method=1&user_account=yimiao&
user_password=111111&wlan_user_ip=10.200.156.234&
wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&
wlan_ac_name=&jsVersion=3.3.1&_=1635076104291

找到后划到最下边,可以显示格式化参数,点击view URL encoded(查看来源)选项,可以解码 URL,可以正确显示标点符号。比如,%2C@%40

参数分析

  • a: 请求命令,有login,logout
  • user_account: 帐号
  • user_password: 密码
  • wlan_user_ip: 设备IP

Linux 实现自动登录

均使用Python来实现自动登录校园网,你需要在电脑上安装Python环境.
我们使用requests库来发送GET请求,用socket库来获取设备IP,用os库来测试最终网络是否可用.

Python脚本

根据之前F12获取的信息,修改相关参数.

# -*- coding = UTF-8 -*-
# @Time : 2021/10/24 上午10:46
# @Author : XIADENGMA
# @File : auto_2.py
# @Software : PyCharm
# @achieve : get请求
# @version : 1.0.0

import socket
import requests
import os

#获取局域网ip
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('8.8.8.8', 80))
    ip = s.getsockname()[0]
    s.close()
    print("本机ip:"+ip)
except:
    print("获取局域网ip失败:请检查Wi-Fi是否连接正确")
    exit()

#校园网请求地址&帐号&密码
url = "http://10.200.0.2:801/eportal/"
account = "yimiao"
password = "111111"

#请求标头
headers = {
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.81',
    'DNT': '1',
    'Accept': '*/*',
    'Referer': 'http://10.200.0.2/',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}

#参数
params = (
    ('c', 'Portal'),
    ('a', 'login'),
    ('callback', 'dr1003'),
    ('login_method', '1'),
    ('user_account', account),
    ('user_password', password),
    ('wlan_user_ip', ip),
    ('wlan_user_ipv6', ''),
    ('wlan_user_mac', '000000000000'),
    ('wlan_ac_ip', ''),
    ('wlan_ac_name', ''),
    ('jsVersion', '3.3.1'),
    ('_', '000000000000'),
)

#连接校园网
try:
    response = requests.get(url, headers=headers, params=params, verify=False, timeout=1)

    # 校园网登录状态判断
    if '"msg":""' in response.text:
        print("当前设备已登录")
    elif r'\u8ba4\u8bc1\u6210\u529f' in response.text:
        print("登录成功")
    elif 'bGRhcCBhdXRoIGVycm9y' in response.text:
        print("密码错误")
    else:
        print("未知错误")
        print("返回状态码: ", response.status_code)
except:
    print("连接校园网失败")

#测试是否可以正常上网
exit_code = os.system('ping www.baidu.com -n -q -c 1 -W 1 >/dev/null 2>&1')

#正常上网状态判断
if exit_code == 0:
    print("连接网络成功")
else:
    print("连接网络失败")

Linux实现连接Wi-Fi自动登录

我使用了NetworkManager作为网络管理工具,它提供了一个钩子,用于在网络发生变化时执行脚本。 在/etc/NetworkManager/dispatcher.d中创建脚本,命名为auto_ncist_teacher.sh,脚本表示当连接到包含ncist-teacher的 WiFi 时执行 Python 脚本,注意要使用完整地址。

#!/bin/sh
if   [[  $(nmcli -t -f NAME connection show --active) == "ncist-teacher"  ]];#ncist-teacher对应替换成你需要Wi-Fi的SSID
then 
  #下面的路径对应替换:python路径 python文件路径
  /home/xiadengma/miniconda3/envs/auto-ncist-teacher/bin/python /home/xiadengma/code/个人项目/python/auto-ncist-teacher/auto_2.py
fi

然后再赋予脚本可执行权限

sudo chmod a+x auto_ncist_teacher.sh

最后启用NetworkManager-dispatcher.service服务,就大功告成了~

sudo systemctl enable --now NetworkManager-dispatcher.service

参考资料

  1. 校园网自动登录全平台解决方案
  2. 实现校园网自动化登录

隔在一层层纱后的你,在我心中。