0.引言
校园网是通过网页进行连接的,但是我自己的主机不太方便携带,离了学校想跑一些深度学习的代码比较麻烦,在学校的主机是可以不关机的,但是校园网到了早上会断,因此萌发了用脚本让主机自动联网的想法,方便使用远程软件控制电脑。参考了一些其他学校的教程,方法都大同小异,下面以汕大的校园网作为示例,此方法适用于插学校网线的情况。
1.前期准备
1.配置好python环境,这里采用的是python 3.8版本
2.用pycharm进行开发
3.用于登录的浏览器一个,这里用的edge浏览器
2.分析STU的登录页面
打开之后,按F12打开开发人员工具,选到“网络”,再把保留日志给勾上,像这样
接着输入用户名和密码并且点击登录,就能看到右侧多出一个login.php ,可以看到登录时用的是post请求,我们需要做的就是模拟这个Request Headers
点负载可以看到post请求中提交的用户名和密码
3.安装相关库和编写脚本
3.1安装相关库
打开Pycharm
先创建一个新项目Network,用于后续编写代码
注意:我们需要用到 requests 和 pyinstaller 这两个库,如果你没下载,可以按照下面提供的方法下载好
requests 这个库主要是用来向目标网页发送请求
pyinstaller 这个库用来将我们写好的代码打包成类似于 .exe 的可执行程序
下面是两种下载方法(任选其一即可)
方法一:可以在 cmd 下使用命令下载安装:
按下 WIN+R 组合键,然后在弹出的窗口中输入 cmd ,再按下回车
在 cmd 中输入:pip3 install requests
然后回车即可,等待下载完成
在 cmd 中输入:pip3 install pyinstaller
方法二:可以在 Pycharm 里安装这些库
在setting中找到Interreter再点击右边的 + 号找到pyinstaller并安装, requests包同理
3.2 编写代码
import requests
import datetime
# 校园网地址
post_addr = "https://a.stu.edu.cn/ac_portal/login.php"
# 下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Content-Length': '70',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'a.stu.edu.cn',
'Origin': 'https://a.stu.edu.cn',
'Referer': 'https://a.stu.edu.cn/ac_portal/20170602150308/pc.html?template=20170602150308&tabs=pwd&vlanid=0&_ID_=0&switch_url=&url=',
'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
'X-Requested-With': 'XMLHttpRequest',
}
post_data = {
'opr': 'pwdLogin',
'userName': '',# 换成自己的用户名
'pwd': '', # 换自己的密码
'ipv4or6': '',
'rememberPwd': '0',
}
response = requests.post(url, data, headers=header).status_code # POST 方式向 URL 发送表单,同时获取状态码
print("状态码{}".format(response)) # 打印状态码
以上代码参考了自动登录校园网脚本(Python实现),但运行时出现了报错,错误信息显示我们模拟的post请求被拒绝,因为SSL证书无法通过验证。
问了下GPT,有两种方法一种是更新证书,一种是直接忽略SSL证书验证,这里选择忽略,笔者用到现在其实没什么问题。修改后的代码如下:
import requests
import datetime
# 校园网地址
post_addr = "https://a.stu.edu.cn/ac_portal/login.php"
# 下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Content-Length': '70',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'a.stu.edu.cn',
'Origin': 'https://a.stu.edu.cn',
'Referer': 'https://a.stu.edu.cn/ac_portal/20170602150308/pc.html?template=20170602150308&tabs=pwd&vlanid=0&_ID_=0&switch_url=&url=',
'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
'X-Requested-With': 'XMLHttpRequest',
}
post_data = {
'opr': 'pwdLogin',
'userName': '',# 换成自己的用户名
'pwd': '', # 换自己的密码
'ipv4or6': '',
'rememberPwd': '0',
}
print("未联网,启动联网脚本")
# 这里放置未联网时的处理代码
try:
response = requests.post(post_addr, data=post_data, headers=post_header, verify=False)
print(response.text)
except requests.exceptions.SSLError as e:
print("SSL证书验证失败:", e)
info = "ssl fail"
print("连接成功,按任意键以退出")
info = "connect success"
接着回到1.1.1.2页面注销登录,接着右键运行get_link。
再进入登录界面可以发现已经通过认证了。至此,最主要的功能已经实现了,接下来就是打包程序再进行持久化操作。
由于网络有时候会自己断掉,所以需要让脚本检测是否联网并执行登录联网操作。
3.3 打包代码
在pycharm中使用如下命令打包get_link.py
pyinstaller -F get_link.py
等待它打包完成即可
完成后会像这样多出一个文件夹dist
:
在 dist 目录下就有一个 get_link.exe 程序:
你可以像刚才那样断开校园网然后运行这个 .exe 程序看看能否正常登录校园网
这样我们就把我们写的代码打包好了
下面开始介绍如何在电脑开机时就运行这个可执行程序,并且让程序隔一段时间就连接一次。
3.4 持久化操作
Schtask命令是Windows操作系统中用来创建、删除、查询、更改系统计划任务的命令行工具。当您使用schtask创建一个计划任务时,这个任务会按照您设置的时间和条件执行。即使电脑关机或重启,只要设置了相应的触发条件,这些任务在电脑启动后仍然会按计划执行。
1、win+R打开cmd,如下命令创建定时任务InternetConnection
schtasks /create /sc HOURLY /tn "InternetConnection" /tr "\"C:\Users\Administrator\PycharmProjects\Network\src\dist\get_link.exe\""
注: /tr 后面的路径换成你自己的exe程序所在路径。
2、查看创建好的任务
schtasks /query /tn "InternetConnection"
schtasks创建的任务好像不受主机关机重启的影响,鉴于我自己的主机目前一直没关机,有条件的同学可以自己测试下主机重启后脚本是否还会自动运行。
至此,大功告成,相关的代码放在这里了。有需要的可以自取
STU_AutoConnection