前言

开学了,学校的校园网真的不靠谱,用户验证很容易失效,每天打开电脑基本都要重新登录网页进行验证,繁琐不说,一些开机自启的软件还会因为没网而出问题。

为此特地研究想办法写了个python脚本(为什么用python?因为我不会写cmd和powershell的脚本啊),以及通过任务计划,实现连接校园网时自动运行脚本。

脚本

首先说明我们学校校园网是通过网页端登录认证的,不同学校情况不同,仅供思路参考。

首先打开浏览器进入认证页面,先不登录,按F12打开控制台,选择Network选项卡。

然后再输入用户名密码进行登录,可以看到右侧Network选项卡开始活动。

Name下可能有好几项内容,仔细观察一下还是能比较容易看出跟验证是否相关的。我这里有两项get请求,可能有的校园网一个post请求就可以验证了,要看具体情况。

这样我们就知道我们需要发什么请求才能进行验证,而我们要做的就是利用python帮我们把相应的请求发出去。

为了方便我们可以右键内容,把请求复制成相应的代码。我这里选择Copy as cURL (bash),一方面可以方便转换成python代码,一方面以后用路由器,可以直接写一个在linux下使用curl的bash脚本。

curl 'http://10.9.10.100:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C********&user_password=******&wlan_user_ip=10.11.35.43&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.2&v=3750' \
  -H 'Connection: keep-alive' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36' \
  -H 'DNT: 1' \
  -H 'Accept: */*' \
  -H 'Referer: http://10.9.10.100/' \
  -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
  -H 'Cookie: PHPSESSID=vfd9e4tp9ci4okv4n7el2rmgs2' \
  --compressed \
  --insecure

curl 'http://10.9.10.100:801/eportal/?c=Portal&a=find_mac&callback=dr1004&user_account=********&&login_method=1&find_mac=0&wlan_user_ip=10.11.35.43&jsVersion=3.3.2&v=1472' \
  -H 'Connection: keep-alive' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36' \
  -H 'DNT: 1' \
  -H 'Accept: */*' \
  -H 'Referer: http://10.9.10.100/' \
  -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
  -H 'Cookie: PHPSESSID=vfd9e4tp9ci4okv4n7el2rmgs2' \
  --compressed \
  --insecure

为了图方便我们使用cURL命令转代码工具,把两段分别复制进去,在左边选择Python - Requests,转换为python代码。

import requests

url = "http://10.9.10.100:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C********&user_password=******&wlan_user_ip=10.11.35.43&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.2&v=3750"

payload = {}
headers = {
   'Connection': 'keep-alive',
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
   'DNT': '1',
   'Accept': '*/*',
   'Referer': 'http://10.9.10.100/',
   'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7'
}

response = requests.request("GET", url, headers=headers, data = payload)

print(response.text.encode('utf8'))

url = "http://10.9.10.100:801/eportal/?c=Portal&a=find_mac&callback=dr1004&user_account=********&&login_method=1&find_mac=0&wlan_user_ip=10.11.35.43&jsVersion=3.3.2&v=1472"

payload = {}
headers = {
   'Connection': 'keep-alive',
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
   'DNT': '1',
   'Accept': '*/*',
   'Referer': 'http://10.9.10.100/',
   'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7'
}

response = requests.request("GET", url, headers=headers, data = payload)

print(response.text.encode('utf8'))

但是每次连接校园网时分配到的ip地址可能并不相同,我们需要在每次运行时自动获取当前ip。

这里利用了Operater的博客中的方法二来获取本机ip。另外再把用户名和密码改为参数形式,便于后续修改。

import requests
import socket

# 填自己的用户名和密码
user = "********"
password = "******"

# 获取IP地址
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('8.8.8.8', 80))
    ip = s.getsockname()[0]
finally:
    s.close()

# 发送验证请求
if ip:
    url = "http://10.9.10.100:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C" + user + "&user_password=" + password + "&wlan_user_ip=" + ip + "&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.2&v=5651"
    payload = {}
    headers = {
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
        'DNT': '1',
        'Accept': '*/*',
        'Referer': 'http://10.9.10.100/',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7'
    }
    requests.request("GET", url, headers=headers, data=payload)

    url = "http://10.9.10.100:801/eportal/?c=Portal&a=find_mac&callback=dr1004&user_account=" + user + "&login_method=1&find_mac=0&wlan_user_ip=" + ip + "&jsVersion=3.3.2&v=3131"
    payload = {}
    headers = {
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
        'DNT': '1',
        'Accept': '*/*',
        'Referer': 'http://10.9.10.100/',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7'
    }
    requests.request("GET", url, headers=headers, data=payload)

可以运行脚本测试一下,可行的话就可以下一步了。

任务计划

首先打开任务计划程序,选择创建任务。

名称随意,最好勾选「不管用户是否登录都要运行」和「使用最高权限运行」。

关键在于新建触发器。这里引用了知乎@开源AI回答

想要在连接指定名称wifi时自动执行程序,我们需要在创建任务计划时自定义触发器。

Step1. 开始任务-发生事件时 -> 自定义 -> 新建事件筛选器

Step2. 按日志 -> 事件日志-(应用程序和服务日志)-Microsoft-Windows-WLAN-AutoConfig/Operational -> 事件来源-WLAN-AutoConfig -> 事件ID-8001 -> XML

Step3. 勾选“手动编辑查询” -> 在</Select>前增加代码[EventData[Data[@Name='SSID']='Your WiFi Network']]

然后在操作选项卡中新建操作。选择「启动程序」,程序选择pythonw.exe,「添加参数」中输入python脚本的名称,「起始于」中输入脚本所在路径。

最后保存即可。这样每次电脑开机自动连接到校园网时,就会运行验证脚本。

使用路由器的话原理类似,首先需要一台openwrt或者padavan系统的路由器,然后写一个bash脚本,获取分配的ip地址,再通过curl发送验证请求。

如果觉得我的文章对你有用,请随意赞赏