实现校园网自动化登录——Python/cURL脚本+任务计划/Tasker&Termux(Windows/Android)/Selenium

2021.03.16更新:针对新的认证系统抓包,重写了autologin.py,与原代码原理相似,附于文末

2021.01.20更新:学校上网认证系统更新,临时使用selenium,代码附于文末。

0.前言

每次使用校园网都需要网页登录,十分麻烦。
以脚本代替操作,并使其在特定条件下自动运行。

参考:
python实现校园网自动登录-shenhuaifeng
校园网开机自动登录-RodeWide
如何设置计划任务或者脚本才能使电脑在连接指定wifi后自动运行某程序? - 蒋晟的回答 - 知乎
如何设置计划任务或者脚本才能使电脑在连接指定wifi后自动运行某程序? - 笨笨侠的回答 - 知乎
安卓termux折腾手记:安装python库+tasker调用 - 红色番茄酱 - 简书
curl命令实现上网认证登录 - chinagod - 博客园

1.Windows

操作环境:Windows 10

构建脚本

登录脚本可以用Python或cURL写,后者可能更简单。

第一种:Python

需要python及requests库

构造两个个文件,分别为

  1. autologin.py
  2. auto-login.bat

每次运行第二个文件。可将文件二添加至计划任务,实现登录自动化。

1. autologin.py

这儿使用Chrome的开发者工具抓包。主要参考了shenhuaifeng 的文章。

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
python
import requests

#登录地址
post_addr="http://xxx.xxx"
#构造头部信息
post_header={
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '73',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': 'xxxxxx',
'Host': 'xxxxxx',
'Origin': 'http://xxxxxx',
'Referer': 'http://xxxxxx/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
#构造登录数据
post_data={ 'username': 'xxxxxx',
'domain': 'xxxxxx',
'password': 'xxxxxxx',
'enablemacauth': '0'
}
#发送post请求登录网页
requests.post(post_addr,data=post_data,headers=post_header)

2. auto-login.bat

1
2
@echo off
python autologin.py

第二种:cURL

需要安装cURL。
构建一个文件:

1. auto-login.bat

抓包,在Chrome开发者工具中,右击登录相关的字段,选择Copy->Copy all as cURL(cmd),粘贴进文件,就能作为脚本运行了。(如图)

自动运行

接着添加计划任务,思路是在指定WIFI连接时运行脚本。在此使用Windows任务计划程序实现。具体操作 笨笨侠的回答 讲的已经很详细了,当然下文我会重复一下。

现成的xml文件

如果你懒得看具体实现过程,可以直接把以下内容存成xml文件导入。

注意先把‘Your WiFi Network’改成对应的WIFI的ssid,把"C:\Users\xxx\Desktop\code\auto-login.bat"改成正确的脚本路径。

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
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2020-05-10T18:27:20.9384374</Date>
<Author>YIHANG</Author>
<URI>\校园网自动登录</URI>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-WLAN-AutoConfig/Operational"&gt;&lt;Select Path="Microsoft-Windows-WLAN-AutoConfig/Operational"&gt;*[System[Provider[@Name='Microsoft-Windows-WLAN-AutoConfig'] and (EventID=8001)]][EventData[Data[@Name='SSID']='Your WiFi Network']]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<GroupId>S-1-5-32-545</GroupId>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>false</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Users\xxx\Desktop\code\auto-login.bat</Command>
</Exec>
</Actions>
</Task>

具体步骤

  1. 创建一个任务,命名一个名称,如:“校园网自动登录”。接着为这个任务添加一个自定义的触发器:新建->触发器->开始任务->发生事件时->自定义->新建事件筛选器
  2. 按日志 -> 事件日志-(应用程序和服务日志)-Microsoft-Windows-WLAN-AutoConfig/Operational -> 事件来源-WLAN-AutoConfig -> 事件ID-8001 -> XML
  3. 勾选“手动编辑查询” -> 在</Select>前增加代码[EventData[Data[@Name='SSID']='Your WiFi Network']]
  4. 确定以后,在选择触发时运行的脚本:操作->新建->启动程序-程序或脚本,填入程序路径
  5. 你还可能需要在条件选项卡里面去除勾选“只有在计算机使用交流电源时才启动此任务”,以避免未接通电源时脚本停止工作。

2020.8.9更新

如果是Python脚本,任务计划还可以这样设置:

  • 第一栏填写Python安装目录下的pythonw.exe的完整路径
  • 第二栏填写Python脚本目录
  • 第三栏填写运行目录,如Python脚本目录

2.Android

光实现电脑的校园网自动登录也许远远不够,以下是手机端(Android)实现方法。
操作环境:MIUI11 (Android Q)
需要手机软件:

软件介绍

先简单介绍一下这三个软件:

Tasker是一个让安卓系统根据用户定制的”配置文件”(Profiles),在特定的”背景”下(Contexts),执行指定”任务”(Tasks)的软件 (Tasker)

哈哈哈,听上去是不是和任务计划很像? Tasker真可谓一大神器,可以做到很多自动化的功能(比如验证码自动粘贴/自动给指定微信好友定时发送消息/定时打卡),感兴趣可以去搜一下!

Termux combines powerful terminal emulation with an extensive Linux package collection.(Termux)

Termux是Android平台上一个强大的终端模拟器,支持 Python、 PHP、 MySQL等的安装,有一篇文章: Termux 高级终端安装使用配置教程|国光,有关Termux的使用写的很详细,推荐一下!

This plugin(Termux:Tasker)for Termux provides a way to run Termux scripts from Tasker.

这个是配合Tasker实现Termux脚本运行自动化的插件。需要注意的是,Termux与插件必须是同一个签名,否则会安装失败。(例如,你不能把Google Play来源的Termux与F-driod来源的插件混用)

构建文件

思路是和Windows端的实现几乎一致的,也就是在连接到指定Wi-Fi时运行脚本。一样可以用Python脚本/cURL来实现;Tasker还有内置的HTTP-POST,但我对它不太熟悉。

第一种:Python

构造两个文件,分别为

  1. autologin.py
  2. auto-login.sh

1. autologin.py

代码与上文一样。

2. auto-login.sh

python /storage/emulated/0/Download/autologin.py

第二种:cURL

构建一个文件:

1. auto-login.sh

一样是抓包,与上文提到的类似,在Chrome开发者工具中,右击登录相关的字段,选择Copy->Copy all as cURL(bash),粘贴进文件,脚本就构建好了。(如图)

自动运行

无论是哪一种,文件都放在/storage/emulated/0/Download/下。

接着运行Termux,执行以下操作。

  1. 更新安装包
1
2
apt update
apt upgrade
  1. 安装python/cURL
    pkg install python curl
  2. 安装Requests库 (Python)
    pip install requests
  3. 在termux里创建目录(termux:task要求自动运行的脚本应当放于~/.termux/tasker下)
    mkdir -p .termux/tasker
  4. 拷贝脚本到~/.termux/tasker目录
    cp /storage/emulated/0/Download/auto-login.sh .termux/tasker

    由于Android10的存储规则,应用只能访问自身和公共存储区域,所以把文件放入指定目录的操作才会如此“曲折 ”。 此外,直接运行Python脚本是会被认为成.sh文件运行的,解决方案之一是在Python脚本开头增加声明"#!/data/data/com.termux/files/usr/bin/python",但是实测发现,运行会报文件不存在,也不知道是为什么...😓所以Python的方法最终选择用两个脚本文件实现。

  5. 接着进入Tasker,在配置文件下点击右下角加号,新建“第一条件”->状态->网络->Wifi已连接,在SSID填入对应的Wlan名称。

    注意,从 Android 6.0 开始,WiFi 的扫描结果需在 GPS 功能开启的前提下才能获取,这意味着你需要打开定位并赋予Tasker定位权限,Tasker才能正确获取到当前连接的网络名称。当然,你也可以选择不填写SSID,但是这会让Tasker连接任意网络时都运行脚本。

  6. 完成后返回,再新建一个任务,名称如“登陆校园网”,点击右下角加号添加操作->插件->Termux:Tasker->“配置”右侧的编辑按钮,进入插件的界面,填入脚本名称”auto-login.sh “
  7. 点击右上角保存按钮,返回到主界面,这时一个在一定条件下触发的操作任务就被保存了。
  8. 最后不要忘记授予Tasker无障碍权限与自启动权限。

终极的解决方案或许可以是:在一个可以刷第三方固件的路由器上设置一个cURL开机脚本。

2021.01.20更新

Selenium实现的相关代码

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
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.keys import Keys
import time
import os

# 开启浏览器
def openChrome():
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
option.add_argument("--headless")
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=option)
return driver

def find(driver,str):
try:
driver.find_element_by_xpath(str)
except:
return False
else:
return True

# 流程
def operate_dk(driver):
exit_code = os.system('ping www.baidu.com -n 2')#检测网络
if exit_code:
url = "http://10.9.1.3/"
driver.get(url)
#实例化一个select类的对象
selector=Select(driver.find_element_by_name("ISP_select"))
selector.select_by_value("@zgyd")#中国移动
driver.find_element_by_xpath("//input[@placeholder='学号']").send_keys("12345678")
driver.find_element_by_xpath("//input[@placeholder='密码']").send_keys("12345678")
driver.find_element_by_xpath("//form[@name='f1']//input[@name='0MKKey']").send_keys(Keys.ENTER)
time.sleep(3)
print("即将退出程序...")
driver.quit()
else:
driver.quit()

if __name__ == '__main__':
driver = openChrome()
operate_dk(driver)

2021.03.16更新

学校更换了dr.com的方案,因此重写了脚本。

autologin.py

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
import socket
import requests
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)
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.9.1.3/',
'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', ',b,USERNAME'),
('user_password', 'PASSWORD'),
('wlan_user_ip', ip),
('wlan_user_ipv6', ''),
('wlan_user_mac', '000000000000'),
('wlan_ac_ip', ''),
('wlan_ac_name', ''),
('jsVersion', '3.3.3'),
)
response = requests.get('http://10.9.1.3:801/eportal/', headers=headers, params=params, verify=False)
print(response)

实现校园网自动化登录——Python/cURL脚本+任务计划/Tasker&Termux(Windows/Android)/Selenium
https://yharea.com/421/
作者
艺航
发布于
2020年5月22日
许可协议