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库
构造两个个文件,分别为
autologin.py
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 pythonimport 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' } 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 > < QueryList> < Query Id="0" Path="Microsoft-Windows-WLAN-AutoConfig/Operational"> < Select Path="Microsoft-Windows-WLAN-AutoConfig/Operational"> *[System[Provider[@Name='Microsoft-Windows-WLAN-AutoConfig'] and (EventID=8001)]][EventData[Data[@Name='SSID']='Your WiFi Network']]< /Select> < /Query> < /QueryList> </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 >
具体步骤
创建一个任务,命名一个名称,如:“校园网自动登录”。接着为这个任务添加一个自定义的触发器:新建->触发器->开始任务->发生事件时->自定义->新建事件筛选器
按日志 -> 事件日志-(应用程序和服务日志)-Microsoft-Windows-WLAN-AutoConfig/Operational -> 事件来源-WLAN-AutoConfig -> 事件ID-8001 -> XML
勾选“手动编辑查询” -> 在</Select>
前增加代码[EventData[Data[@Name='SSID']='Your WiFi Network']]
确定以后,在选择触发时运行的脚本:操作->新建->启动程序-程序或脚本,填入程序路径
你还可能需要在条件选项卡里面去除勾选“只有在计算机使用交流电源时才启动此任务”,以避免未接通电源时脚本停止工作。
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 构造两个文件,分别为
autologin.py
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,执行以下操作。
更新安装包
安装python/cURLpkg install python curl
安装Requests库 (Python)pip install requests
在termux里创建目录(termux:task要求自动运行的脚本应当放于~/.termux/tasker
下)mkdir -p .termux/tasker
拷贝脚本到~/.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的方法最终选择用两个脚本文件实现。
接着进入Tasker,在配置文件下点击右下角加号,新建“第一条件”->状态->网络->Wifi已连接,在SSID填入对应的Wlan名称。 注意,从 Android 6.0 开始,WiFi 的扫描结果需在 GPS 功能开启的前提下才能获取,这意味着你需要打开定位并赋予Tasker定位权限,Tasker才能正确获取到当前连接的网络名称。当然,你也可以选择不填写SSID,但是这会让Tasker连接任意网络时都运行脚本。
完成后返回,再新建一个任务,名称如“登陆校园网”,点击右下角加号添加操作->插件->Termux:Tasker->“配置”右侧的编辑按钮,进入插件的界面,填入脚本名称”auto-login.sh “
点击右上角保存按钮,返回到主界面,这时一个在一定条件下触发的操作任务就被保存了。
最后不要忘记授予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 webdriverfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.common.keys import Keysimport timeimport osdef 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 driverdef 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) 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 socketimport 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)