概述

苦于校园网每天都需要重新登录,写了一个脚本可以自动登录校园网,在断网时间段则使用手机热点上网,最后生成exe程序可以放到开机自启文件夹里实现开机自动登录校园网

本教程涉及装配Python环境和工具

安装vscode 和python

以Windows系统为例,在执行脚本前需要先安装vscode(或PyCharm等)和python,并设好环境变量以供调试使用

vscode安装

从官网下载安装后先设置语言

点击install后重新打开应用程序

随后安装python扩展包,过程和安装中文包类似

搜索python,install即可

安装完成后显示下图框选的四个

python安装

请参考Python安装教程(新手)_python tcl/tk support-CSDN博客

 安装pyinstaller

pyinstaller这个工具可以将python转为exe文件

先打开命令提示符

  1. 按下 "Win + R" 键,打开 "运行" 对话框

  2. 在 "运行" 对话框中,输入 "cmd"(不带引号),回车

  3. 可以使用pip进行安装:

    pip install pyinstaller

安装selenium 

在命令提示符中输入

   pip install selenium

添加webdriver

参考以下两篇文章:

基于Python的Selenium详细教程_selenium python-CSDN博客  浏览器安装selenium驱动,以Microsoft Edge安装驱动为例_edge浏览器驱动-CSDN博客

下载后放在安装python的文件夹下

代码部分

#南京邮电大学移动电信校园网自动登录脚本
#created by yh 2024.3.23

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import datetime
import subprocess
import urllib.request



#检查网络能否链接到Internet
def check_internet():
       try:
           urllib.request.urlopen("http://www.baidu.com", timeout=4)
           return True
       except urllib.error.URLError:
           return False




# 检查是否能搜索到特定的WiFi网络名称
def check_network_availability(target_network_name):
    try:
        # 运行"netsh wlan show networks"命令
        result = subprocess.check_output(['netsh', 'wlan', 'show', 'networks'], shell=True).decode('utf-8', 'ignore')

        # 检查输出中是否存在指定的WiFi网络名称
        if target_network_name in result:
            print(f"找到WiFi网络:{target_network_name}。")
            return True
        else:
            print(f"未找到WiFi网络:{target_network_name}。")
            return False
    except subprocess.CalledProcessError as e:
        print("搜索WiFi网络时出错:", e.output)
        return False
'''
# 示例使用
network_name = input("请输入您要搜索的WiFi网络名称: ")
check_network_availability(network_name)
'''




# 检查当前连接的WiFi网络名称是否为指定的名称
def check_wifi_connected(target_network_name):
    try:
        # 运行"netsh wlan show interfaces"命令
        result = subprocess.check_output(['netsh', 'wlan', 'show', 'interfaces']).decode('mbcs')

        # 检查输出中是否存在"已连接"字样
        if "已连接" in result:
            # 截取当前连接的WiFi名称
            for line in result.split('\n'):
                if "SSID" in line and ":" in line:
                    # 提取SSID字段
                    current_network_name = line.split(":")[1].strip()
                    # 检查是否与指定的网络名称匹配
                    if current_network_name == target_network_name:
                        print(f"当前已连接至指定WiFi网络:{target_network_name}。")
                        return True
                    else:
                        print(f"当前连接的WiFi不是指定网络,连接到的是:{current_network_name}")
                        return False
        else:
            print("当前未连接WiFi。")
            return 2
    except subprocess.CalledProcessError as e:
        print("检查WiFi连接时出错:", e.output)
        return False
'''
# 示例使用
network_name = input("请输入您要检查的WiFi网络名称: ")
check_wifi_connected(network_name)
'''



# 连接到指定的WiFi网络(需要已有配置文件)
def connect_to_wifi(network_name):
    try:
        # 运行"netsh wlan connect"命令
        result = subprocess.run(['netsh', 'wlan', 'connect', 'name={}'.format(network_name)], check=True)
        #print(f"尝试连接到 {network_name}...")
    except subprocess.CalledProcessError as e:
        print(f"连接到WiFi失败:{e}")


#登录校园网
def login_to_website(username, password):
    # 启动Edge浏览器
    browser = webdriver.Edge()
    time.sleep(1)
    try:
        # 访问页面
        browser.get("https://p.njupt.edu.cn/")
        # 定位用户名输入框并输入用户名
        input_text = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/form/input[3]')
        input_text.send_keys(username)
        
        # 定位密码输入框并输入密码
        input_text = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/form/input[4]')
        input_text.send_keys(password)
        
        # 定位登录按钮并点击
        button = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/form/input[2]')
        browser.execute_script("arguments[0].click();", button)
    except:
        print("可能已经登录或登录错误")
    finally:
        # 退出浏览器
        browser.quit()



#检测当前时间在周末
def is_time_in_weekend_range():
    # 获取当前时间
    current_time = datetime.datetime.now()
    # 获取当前时间的小时和星期几
    current_hour = current_time.hour
    current_weekday = current_time.weekday()  # 星期五是4,星期六是5,星期日是6

    # 如果现在是周五晚上23点后
    if current_weekday == 4 and current_hour >= 23:
        return True
    # 如果现在是周六全天
    elif current_weekday == 5:
        return True
    # 如果现在是周日但还没到晚上23点
    elif current_weekday == 6 and current_hour < 23:
        return True
    else:
        return False
    


######################################################################################
####-----------------------------在此修改你的个人信息-------------------------------####
######################################################################################
target_network_name ='NJUPT-CMCC'               #请注释其中一行
target_network_name ='NJUPT-CHINANET'           #请注释其中一行
account="BPQ232323"
password="123456"                               #智慧校园账号密码
network_name="123456"                           #此为断网期间的备用网络
######################################################################################
####------------------------------------------------------------------------------####
######################################################################################



# 获取当前时间
current_time = datetime.datetime.now()

# 设定时间范围:晚上11点到早上7点
start_time = current_time.replace(hour=23, minute=40, second=0, microsecond=0)
end_time = current_time.replace(hour=7, minute=0, second=0, microsecond=0)

# 如果当前时间在范围内,则
if end_time <= current_time <= start_time and is_time_in_weekend_range():
    print("当前时间在7-23点之间或周末,登录校园网")
    
    if check_wifi_connected(target_network_name)==2:
        # 如果没有连接到指定网络,执行这部分代码
        print(f"没有连接网络,尝试连接:{target_network_name}")
        # ... 这里加入没有连接到网络时要执行的代码 ...
        connect_to_wifi(target_network_name)
        # 调用函数执行登录动作
        login_to_website(account, password)
    else:
        # if check_internet():
        #  print("Internet连接正常。")
        # else:
        #  print("无法连接到Internet。")
         login_to_website(account, password)
else:
    print("当前时间在凌晨,断开校园网")  
    if check_network_availability(network_name):
        # 连接到特定的WiFi(确保你之前已经通过GUI或netsh命令保存过该网络的配置文件)
        connect_to_wifi(network_name)
    else:
        print(f"没有连接到指定网络:{network_name}")


result = subprocess.check_output(['netsh', 'wlan', 'show', 'interfaces']).decode('mbcs')
# 检查输出中是否存在"已连接"字样
if "已连接" in result:
    print(f"当前已连接WiFi网络。")
else:
    print("当前未连接WiFi。") 

注意:

  1. 在代码142-152行修改个人信息
  2. 如果不是edge,在96行相应替换

将Python文件 转换为exe文件

pyinstaller --onefile your_script.py

这里的your_script.py是要转换的Python文件名称

在生成的dist目录里找到你的 .exe 文件,这个文件就是可执行的Windows程序,可以在没有Python环境的电脑上运行。

设置开机自启(以Windows为例)

打开C:\Users\(主机名)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

或者在资源管理器的地址栏输入以下路径快速访问:

shell:startup

 将程序的快捷方式复制该文件夹中,重启电脑

写在最后

第一版写于2024.3.23,可能有不够详尽之处,且笔者能力有限,欢迎批评指正

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐