电脑定时开机及校园网自动登录设置

1.应用背景

为了追求更高的性价比,多数人的电脑选择自己配置电脑,由于配置的是台式机,不方便移动。为了在自己现场的时候也可以使用就需要用到桌面远程操作。在学校的场景下,由于校园网需要登录认证才能连接互联网,所以在远程操作的时候需要保证校园网处于登录状态。同时,有时候需要将电脑关机以延长使用寿命,而现有的远程开机操作大多需要购买相关硬件(学生党资金不充裕),鉴于此,对电脑设置定时开机操作在一定程度上可以守住钱袋子。

2.电脑定时开机

由于博主使用的Windows系统为win10,这里的操作以win10为例。(经博主测试,电脑是双系统(win10+ubuntu20.4)也可定时开机)

2.1需要在Windows上设置的相关操作

1.打开控制面板,找到“系统与安全选项”

2.找到“电源选项”,点击,“更改电源按钮功能”

3.点击“更改当前不可用设置”

4.取消“启用快速启动(推荐)”

5.保存更改,关闭窗口,在Windows上的设置完成

2.2在bios上设置的相关操作

博主使用的主板是微星主板,这里设置以微星主板为例(各大主板操作应该相差不大)

1.进入bios,如果是高级模式则进行下一步操作,如果不是则按“F7”进入高级模式,高级模式如下图

2.单击SETTINGS,进入SETTINGS设置,选择高级选项

3.点击“唤醒事件设置”

4.将“即时(RTC)闹铃唤醒”更改为允许;“日期(月份)闹钟”设置为0表示为每天,设置为1表示为每月1日,2为2日,依次类推,最大为31日;后面的“时分秒”则设置为在某天的几点几分几秒(时间格式为24小时制)进行唤醒操作。博主的设置如下图,表示每天早上7点0分0秒进行唤醒操作

5.点击右上角“X”,选择保存并退出,bios上的相关操作到这里设置完成

3.校园网自动登录程序

博主学校的校园网认证采用的是网页认证,认证请求方式为GET。具体查看校园网认证请求方式可以打开浏览器(Chrome或则edge浏览器都可以),按“F12”打开开发者模式,打开校园网认证页面。如下图所示

1.校园网登录程序如下

需要额外安装的库

pyinstaller~=4.7
requests~=2.26.0
import subprocess
import time
import requests

class Network:
  def __init__(self, userId, password, delay_time, ping_baidu, ping_campus):
    self.userId = userId
    self.password = password
    self.delay_time = delay_time*60 #秒转化为分钟
    self.ping_baidu = ping_baidu
    self.ping_campus = ping_campus

  def __call__(self):
    self.run_loop() # 第一次执行

  def ping_network(self, ip_or_domain):
    si = subprocess.STARTUPINFO()
    si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    try:
        output = subprocess.check_output('ping %s -n 3 -w 80' % ip_or_domain, stderr=subprocess.STDOUT, universal_newlines=True, startupinfo=si)
        if '100% packet loss' in output:
            # print('Ping failed: 100% packet loss')
            return False
        else:
            # print('Ping succeeded')
            return True
    except subprocess.CalledProcessError as e:
        # print('Ping failed:', e.returncode, e.output)
        return False

  def get_wlan_ip(self):
      headers = {
          "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
          "Accept-Encoding": "gzip, deflate",
          "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
          "Cache-Control": "max-age=0",
          "Connection": "keep-alive",
          "Host": self.ping_campus,
          "Referer": "http://%s" % self.ping_campus,
          "Upgrade-Insecure-Requests": "1",
          "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"
      }
      try:
        result = requests.get('http://%s' % self.ping_campus, headers)
      except requests.exceptions.RequestException as e:
        # print("请求异常:", e)
        return False
      ip = ""
      for i in range(result.text.find('ss5=') + 5, result.text.find('ss6=')):
          if result.text[i] == '"': break
          ip = ip + result.text[i]
      print("本机ip:%s" % ip)
      return ip

  def login(self):
      userip = self.get_wlan_ip()
      if userip :
          url = 'http://{}:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=%2C0%2C{}&user_password={}&wlan_user_ip={}&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=4.2.1&terminal_type=1&lang=zh-cn&v=7923&lang=zh'.format(
              self.ping_campus,
              self.userId, self.password, userip)
          headers = {
              "Accept": "*/*",
              "Accept-Encoding": "gzip, deflate",
              "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",
              "Host": self.ping_campus,
              "Referer": "http://%s/" % self.ping_campus,
              "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"
          }
          try:
            req = requests.get(url, headers)
          except requests.exceptions.RequestException as e:
            # print("请求异常:", e)
            return False
          if req.status_code == 200:
              return True
          else:
              return False
      else: return False


  def run_loop(self):
    while True :
        flag_campus = self.ping_network(self.ping_campus)
        flag_baidu = self.ping_network(self.ping_baidu)
        if flag_campus and flag_baidu :
            print("校园网连接正常!")
        else:
            if not flag_campus :
                print("无法访问校园网登录页面, 请检查是否连接网络!")
            elif not flag_baidu :
                print("校园网未登录, 尝试重连中...")
                relogin = self.login()
                time.sleep(3)  # 等待3秒钟再判断是否登录成功
                if relogin and self.ping_network(ping_baidu):
                  print("校园网已登录")
                else: print("校园网登录失败")
        time.sleep(self.delay_time)

if __name__ == '__main__':
    userId = "++++" #校园网账号
    password = "++++" #校园网密码
    delay_time = 360 #360分钟后判断是否需要重连
    ping_baidu="baidu.com" #百度
    ping_campus="++++++" #校园网认证页
    network = Network(userId, password, delay_time, ping_baidu, ping_campus)
    network()

2.主函数中userid为自己的校园网账号;password为自己的校园网密码;ping_campus为检测电脑是否连接到互联网的网址,可以替换为任一国内互联网网址(bilibi.com之类);ping_campus为自己学校的校园网认证页网址

if __name__ == '__main__':
    userId = "++++" #联通加上%40unicom,电信加上%40telecom,移动加上%40Mobile
    password = "++++"
    delay_time = 360 #360分钟后判断是否需要重连
    ping_baidu="baidu.com" #百度
    ping_campus="++++++" #校园网认证页
    network = Network(userId, password, delay_time, ping_baidu, ping_campus)
    network()

3.ping_network用于测试网络连通性

下面代码为Windows中使用

  def ping_network(self, ip_or_domain):
    si = subprocess.STARTUPINFO()
    si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    try:
        output = subprocess.check_output('ping %s -n 3 -w 80' % ip_or_domain, stderr=subprocess.STDOUT, universal_newlines=True, startupinfo=si)
        if '100% packet loss' in output:
            # print('Ping failed: 100% packet loss')
            return False
        else:
            # print('Ping succeeded')
            return True
    except subprocess.CalledProcessError as e:
        # print('Ping failed:', e.returncode, e.output)
        return False

ubuntu下使用下面代码

  def ping_network(self, ip_or_domain):
    ping_result = subprocess.call(['ping', '-c', '3', ip_or_domain])
    # 判断Ping结果中是否有100%丢失
    if ping_result == 0:
      return True
    else:
      return False

4.获取学校服务器分配的校园网IP地址,其中的headers根据不同学校可能有所不同,url为Request URL,可以浏览器开发者模式获取。对应填入即可

ip通过向校园网认证页发送请求所得到的响应提取出来

  def get_wlan_ip(self):
      headers = {
          "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
          "Accept-Encoding": "gzip, deflate",
          "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
          "Cache-Control": "max-age=0",
          "Connection": "keep-alive",
          "Host": self.ping_campus,
          "Referer": "http://%s" % self.ping_campus,
          "Upgrade-Insecure-Requests": "1",
          "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"
      }
      try:
        result = requests.get('http://%s' % self.ping_campus, headers)
      except requests.exceptions.RequestException as e:
        # print("请求异常:", e)
        return False
      ip = ""
      for i in range(result.text.find('ss5=') + 5, result.text.find('ss6=')):
          if result.text[i] == '"': break
          ip = ip + result.text[i]
      print("本机ip:%s" % ip)
      return ip

5.登录函数,与步骤4相同方式可以获得url和headers,

  def login(self):
      userip = self.get_wlan_ip()
      if userip :
          url = 'http://{}:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=%2C0%2C{}&user_password={}&wlan_user_ip={}&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=4.2.1&terminal_type=1&lang=zh-cn&v=7923&lang=zh'.format(
              self.ping_campus,
              self.userId, self.password, userip)
          headers = {
              "Accept": "*/*",
              "Accept-Encoding": "gzip, deflate",
              "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",
              "Host": self.ping_campus,
              "Referer": "http://%s/" % self.ping_campus,
              "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"
          }
          try:
            req = requests.get(url, headers)
          except requests.exceptions.RequestException as e:
            # print("请求异常:", e)
            return False
          if req.status_code == 200:
              return True
          else:
              return False
      else: return False

6.在pycharm中选择终端,输入以下指令即可生成可执行文件

pyinstaller --onefile -w auto_connect.py #auto_connect.py替换成自己命名的名字

4.设置开机自启动

1.右键此电脑,管理;选择“创建任务”

2.常规设置,名称和描述无所谓,按选项选需要修改成第二项

3.触发器,选择“新建”,“开始任务”选择“启动时”

4.操作,选择“新建”,“浏览”找到自己生成的可执行文件,双击,确定

5.点击确定,就创建好任务了。以后只要电脑开机,就会自动运行程序了

  • 21
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值