Python实现自动登录校园网并且维持校园网登录状态教程

程序登录

获取连接请求链接

更正:登录请求连接一样 不需要获取了 可以直接跳转到代码部分

更新 :直接创建bat脚本调用python也可实现(推荐)

校园网宿舍区连接方式是post进行连接

进入http://172.168.254.6/ 输入账号密码和选择连接方式 然后

先不要点击登录 先进入控制台清理界面

image-20230217202043170

然后点击登录

image-20230217202247719

将请求网址记录下来

代码

安装库

requests 这个库主要是用来向目标网页发送请求

方法一:可以在 cmd 下使用命令下载安装:

按下 WIN+R 组合键,然后在弹出的窗口中输入 cmd ,再按下回车
在 cmd 中输入:pip3 install requests
然后回车即可,等待下载完成

方法二:可以在 Pycharm 里安装这些库

image-20230217202924602

编写代码

填写自己的usernamepwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
import socket

#此处根据自己校园网Form Data中发送的数据进行更改
username = '123456@yidong' # 格式学号@登录方式 联通@unicom 电信@telecom 移动 @yidong
pwd = '123456' # 校园网登录密码
om = '123456' #不用管
#获取计算机名称
hostname=socket.gethostname()
#获取本机IP
ip=socket.gethostbyname(hostname)
print(ip)
# 登录地址
post_addr = "http://172.168.254.6:801/eportal/?c=ACSetting&a=Login&protocol=http:&hostname=172.168.254.6&iTermType=1&wlanuserip="+ip+"&wlanacip=172.168.254.100&mac=000000000000&ip="+ip+"&enAdvert=0&loginMethod=1"

post_data = {
'DDDDD': username,
'upass': pwd,
'0MKKey': om
}
# 发送post请求登录网页
requests.post(post_addr, data=post_data)
print("login success!")

执行程序 验证

刚才我们在获取请求链接的时候登录成功了 先注销登录验证使用程序是否能够连接

进入http://172.168.254.6/

点击注销登录

PyCharm 在终端运行

image-20230217204108677

1
python .\main.py

然后随便进个网页验证是否连接成功

校园网持久化

经过上面的步骤,我们可以实现程序登录校园网

但是,有时候校园网过了一段时间会自动断开,这时候又需要我们在浏览器中输入账号密码来登录

我们的时间非常宝贵,不能浪费在登录校园网这种事情上

所以这就是本小节的内容:校园网持久化

原理

思路:

1.判断是否连接上校园网

如果已连接,那么什么也不做

如果没有连接到校园网,那么开始连接校园网

2.将上述逻辑放入死循环中,让它一直执行

校园网页面的源代码中<title>标签为:注销页

这时断开校园网,再重复上述操作

可以看到校园网页面源代码中的<title>标签为:校园网登录页

接下来就简单了:

注销页 = 已登录校园网

校园网登录页 = 未登录校园网

我们只需要去获取到这个<title>标签,然后判断是哪种情况即可

代码如下

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
# _*_ coding : utf-8 _*_
import re # 正则表达式,用于匹配字符
import requests
import socket

#此处根据自己校园网Form Data中发送的数据进行更改
username = '123456@yidong' # 格式学号@登录方式 联通@unicom 电信@telecom 移动 @yidong
pwd = '123456' # 校园网登录密码
om = '123456' #不用管
#获取计算机名称
hostname=socket.gethostname()
#获取本机IP
ip=socket.gethostbyname(hostname)
print(ip)
# 登录地址
post_addr = "http://172.168.254.6:801/eportal/?c=ACSetting&a=Login&protocol=http:&hostname=172.168.254.6&iTermType=1&wlanuserip="+ip+"&wlanacip=172.168.254.100&mac=000000000000&ip="+ip+"&enAdvert=0&loginMethod=1"

post_data = {
'DDDDD': username,
'upass': pwd,
'0MKKey': om
}
schoolWebURL = 'http://172.168.254.6/'
while(True):
# 正则表达式,匹配<title>标签中的内容
response = requests.get(schoolWebURL)
pattern = re.compile('<title>(.*?)</title>', re.S)
title = re.findall(pattern, response.text)
title = title[0] # 将格式转为字符串

if title == '注销页': # 根据上面的分析填入相应的字符
pass
else:
# 发送post请求登录网页
requests.post(post_addr, data=post_data)
print("login success!")

现在你可以运行代码,然后再断开校园网,看它是否能正常帮你连上校园网

代码运行成功!

开机自动启动

安装库

pyinstaller 这个库用来将我们写好的代码打包成类似于 .exe 的可执行程序

方法一:可以在 cmd 下使用命令下载安装:

cmd 中输入:pip3 install pyinstaller
然后回车,等待它下载完成即可

方法二:可以在 Pycharm 里安装这些库

看前边

打包

终端输入(cmd终端和Pycharm终端都可以 但是要进入main的路径)

1
pyinstaller -F -w main.py

注意, 上面这行命令中的main.py是我的 Python 代码文件名,你需要替换为你自己的

这次我们添加了 -w 参数,这表示当我们执行打包好的.exe 程序时不会有黑框框出来(它会在后台运行)

等待打包完成,在 dist 目录下可以看到一个.exe程序

image-20230217211319242

当你双击执行它的时候,不会有弹窗出现,只是在后台运行

设置开机自动运行

搜索计算机管理

image-20230217211424380

然后按照下图依次点击:

image-20230217211622708

在新出现的窗口中输入名称,描述可以不用写,然后点击下一步

再接着,勾选计算机启动时 ,然后点击下一步

image-20230217211742787

勾选启动程序 ,然后点击下一步

点击浏览,选择好你刚刚打包好的.exe程序 ,选择好后点击下一步

把这个选项勾选上,然后点击完成

image-20230217212005551

如下图,在出现的窗口中选择好操作系统

image-20230217212102477

在同样的窗口中点击条件,按照你自己的需要进行勾选

image-20230217212157282

在同样的页面中点击设置,自行设置,完成后点击确定

image-20230217212251845

通过以上步骤我们就实现了每次开机的时候自动登录校园网,再也不用每次都要开浏览器自己手动登录了

快断开你的校园网然后重启你的电脑试试看吧

使用bat调用

可以直接在cmd输入shell:common startup 打开启动文件夹 在此文件夹创建login.bat文件 里边写入

1
2
3
4
@echo off 
D:
cd D:\login
python login.py

我的是把login.py放在了D盘的login文件夹下 你可以效仿。这个bat的作用是切换到指定的位置然后python调用 可以不使用python打包生成exe文件 @echo off是启动时不显示

代理关闭

因为有时候我会使用代理软件然后我又经常忘记关闭代理开机这个时候开机之后就没办法联网所以要加一个代理检测的函数

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
import winreg

def disable_proxy():
try:
key_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_SET_VALUE) as key:
winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 0)
print("系统代理已关闭")
except Exception as e:
print(f"关闭系统代理时发生错误: {e}")

def is_proxy_enabled():
try:
key_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_READ) as key:
value, _ = winreg.QueryValueEx(key, "ProxyEnable")
print("代理为关闭")
return value == 1
except Exception as e:
print(f"获取系统代理状态时发生错误: {e}")
return False

if is_proxy_enabled():
disable_proxy()

如果你不需要就可以把这一部分去掉

我的完整代码

对于请求中的 post_addr 我建议是你先自己登录一次,抓取你自己的请求连接 不然使用我的的话可能会出现ip地址冲突的问题

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
45
46
import requests
import winreg

def disable_proxy():
try:
key_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_SET_VALUE) as key:
winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 0)
print("系统代理已关闭")
except Exception as e:
print(f"关闭系统代理时发生错误: {e}")

def is_proxy_enabled():
try:
key_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_READ) as key:
value, _ = winreg.QueryValueEx(key, "ProxyEnable")
print("代理为关闭")
return value == 1
except Exception as e:
print(f"获取系统代理状态时发生错误: {e}")
return False

def login():
# 此处根据自己校园网Form Data中发送的数据进行更改
username = '@yidong' # 格式学号@登录方式 联通@unicom 电信@telecom 移动 @yidong
pwd = '' # 校园网登录密码
om = '123456' # 不用管
# 登录地址
post_addr = "http://172.168.254.6:801/eportal/?c=ACSetting&a=Login&protocol=http:&hostname=172.168.254.6&iTermType=1&mac=000000000000&ip=172.19.209.78&enAdvert=0&loginMethod=1"

post_data = {
'DDDDD': username,
'upass': pwd,
'0MKKey': om
}
# 发送post请求登录网页
requests.post(post_addr, data=post_data)
print("login success!")

if is_proxy_enabled():
disable_proxy()

login()