问题背景
校园网连上后需要手动登录认证后才能正常使用
解决方案
模拟请求URL(不好用)
可以看到登录时请求的URL并不简单
这种可以成功,但并不总能成功,主要问题可能是这个请求的URL每次都是变化的,导致会失效,于是更推荐下面的更稳定的方案
通过selenium库模拟登录过程
主要步骤
- 需要下载一个驱动来打开浏览器
我用的是谷歌浏览器驱动,也可以用其他浏览器的驱动前提是你要有对应的浏览器,驱动版本需要对应你的浏览器的版本号
谷歌浏览器驱动下载地址
查看谷歌浏览器版本号(也可以在设置里面查看)
- 模拟登录过程
通过selenium库对登录界面的一些元素进行定位,这里面主要就是定位账号密码输入框并进行输入。具体元素的id或者名称可以通过查看登录界面的前端代码得知。
代码
# 湖北工业大学校园网自动登录脚本
from selenium.webdriver.common.by import By # 解决browser.find_element_By_
from time import sleep
# 打开浏览器
from selenium.webdriver.chrome.options import Options # 解决不打开浏览器问题
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
# 校园网ip
login_ip = "http://202.114.177.246" # 湖工大校园网ip
# 配置
username = "2010301019" # 账号
password = "XXXXXX" # 密码
yys = "@cucc" # 运营商(通过下方对应关系来确定符号)
# 联通-> "@cucc"
# 移动-> "@cmcc"
# 电信-> "@ctcc"
# 校园网->""
def login():
# 配置浏览器
options = Options()
options.add_argument('headless') # 隐藏浏览器
# 获取驱动
service = ChromeService(executable_path=r"D:\Desktop\code\Python\xywLogin\chromedriver.exe") # 具体地址为下载的浏览器驱动所在位置
driver = webdriver.Chrome(service=service, options=options)
# 启动浏览器
driver.get(login_ip)
# 设置定位等待时间(因网速原因需要等待网页加载好)
driver.implicitly_wait(3)
# 判断是否已经登录,已经登录则直接退出
try:
driver.find_element(By.ID, "logout")
print("already login")
driver.quit()
return
# 通过捕获"找不到登出元素异常"来判断未登录
except Exception as e:
print("no login")
# 设置定位等待时间
driver.implicitly_wait(1)
# 定位输入账号处并输入账号
driver.find_element(By.ID, "username").send_keys(username + yys)
# 定位密码并输入密码
driver.find_element(By.ID, "password").send_keys(password)
# 定位登录并点击登录
driver.find_element(By.ID, "login-account").click()
# 设置定位等待时间
sleep(1)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
login()
这样就能实现运行一次脚本在后台自动登录一次校园网了
再结合计算机自带的任务启动程序,就可以实现每次解锁锁屏的时候自动登录校园网
配置每次打开屏幕时自动登录
- 打开任务计划程序(电脑自带)
- 创建任务
- 常规
- 触发器内新建触发器
- 操作里新键操作(此步填入脚本的位置)
- 条件里也可以简单设置一下
运行起来可能会有驱动的黑框,解决方法可以参考这篇文章
至此可以实现每次解锁电脑时自动登录校园网,未登录状态时锁屏再解锁电脑即可
由于近期校园网总是gank学生(指总是掉线),本来打算实现每次断网都能触发这个脚本实现自动登录,但是没能成功找到一个合适的触发条件,暂时想到的唯一的方法是,间隔几秒检测一下网络状态,这样可以实现,但是需要消耗一定的运行内存来持续检测,也不太推荐用。
代码
# 需要结合上面的代码
# 判断网络状态
from subprocess import run, PIPE
def judge_net_state():
cnt = 1
while True:
# ping一次百度来判断网络状态
r = run('ping www.baidu.com',
stdout=PIPE,
stderr=PIPE,
stdin=PIPE,
shell=True)
# 当网络异常时重新登录网络
if r.returncode:
login() # 这里写login函数
print('relogin 第{}次'.format(cnt))
print(time.localtime())
cnt += 1
# print('正常联网')
sleep(10) # 每10s检查一次网络状态
先写这么多,如果有需要可以再讨论,如果不想看代码想直接白嫖现成脚本软件的也可以与我联系。