python脚本实现实验室服务器断网自动重连

系统:Ubuntu22.04
selenium4和之前的版本不一样,在网上找的代码就报错说某某函数被弃用了。。。

步骤一:驱动问题

就是要下载个启动自己浏览器的驱动,我用的是chrome
chrome驱动下载

火狐的自已搜吧
下载完直接放在脚本对应的文件夹下面把,方便直接用

步骤二:上代码

import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import datetime
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By

username_str = "xxx" # 你的校园网登陆用户名
password_str = "xxx" # 你的校园网登陆密码

CHROMEDRIVER_PATH = './chromedriver'
URL_SCHOOL_NET = 'xxx'

def login():
    try:
        options = webdriver.ChromeOptions()
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("useAutomationExtension", False)
        service = ChromeService(executable_path=CHROMEDRIVER_PATH)
        driver = webdriver.Chrome(service=service, options=options)
        driver.get(url=URL_SCHOOL_NET)

        time.sleep(3)
        driver.find_element(By.NAME,'f1').find_element(By.NAME,'DDDDD').send_keys(username_str)
        driver.find_element(By.NAME,'f1').find_element(By.NAME, 'upass').send_keys(password_str)
        print("成功输入用户名和密码 ; )")
        time.sleep(2)
        login_button = driver.find_element(By.XPATH,"//input[@name='0MKKey' and contains(@class, 'edit_lobo_cell')]")
        driver.execute_script("arguments[0].click();", login_button)
        time.sleep(20)
        print("成功点击按钮 ; )")

        print('Connect')
    except:
        print("登陆函数异常")
    finally:
        driver.quit()

def test():
    baidu_request = requests.get("http://www.baidu.com")
    if (baidu_request.status_code == 200):
        baidu_request.encoding = 'utf-8'
        baidu_request_bsObj = BeautifulSoup(baidu_request.text, 'html.parser')
        baidu_input = baidu_request_bsObj.find(value="百度一下")
        if baidu_input == None:
            return False
        return True

if __name__ == '__main__':
    while True:
        if test():
            print("网络正常 :) ")
            print(f"北京时间:{datetime.datetime.now()}")
            time.sleep(600)
        else:
            print("无网络,正在连接。。。。 : - ")
            print(f"北京时间:{datetime.datetime.now()}")
            login()
            time.sleep(10)

感谢实验室李姓学弟的帮助,就是登录按钮一直无法定位,最后用xpath交叉定位,点击用selenium的 .clock()也点击不了,要用js来点击

——————————————————————————
我在写进随系统自启动的时候,出现了问题,
一个是说百度地址解析不了,感觉是系统刚启动时无法用dns解析,我不知道,我猜的,解决办法就是若用requests请求百度,只要抛异常就让判断函数返回无网络,只有继续连接
还有一个时chrome的错误,就是要用谷歌浏览器的 headless模式,更改后的代码如下

import logging
import time
import requests
import datetime
import traceback
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By

username_str = "xxx" # 你的校园网登陆用户名
password_str = "xxx" # 你的校园网登陆密码

CHROMEDRIVER_PATH = '/path/to/your/network/chromedriver'
URL_SCHOOL_NET = 'xxxx'

def login():
    try:
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')  # 这个超级重要啊,不然在systemctl 启动不了
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("useAutomationExtension", False)
        service = ChromeService(executable_path=CHROMEDRIVER_PATH)
        driver = webdriver.Chrome(service=service, options=options)
        driver.get(url=URL_SCHOOL_NET)

        time.sleep(3)
        driver.find_element(By.NAME,'f1').find_element(By.NAME,'DDDDD').send_keys(username_str)
        driver.find_element(By.NAME,'f1').find_element(By.NAME, 'upass').send_keys(password_str)
        logging.info(f'北京时间:{datetime.datetime.now()} 成功输入用户名和密码 : )')
        print(f'北京时间:{datetime.datetime.now()} 成功输入用户名和密码 : )')
        time.sleep(2)
        login_button = driver.find_element(By.XPATH, "//input[@name='0MKKey' and contains(@class, 'edit_lobo_cell')]")
        driver.execute_script("arguments[0].click();", login_button)
        logging.info(f'北京时间:{datetime.datetime.now()} 成功点击登录按钮 : ), 应该已连接')
        print(f'北京时间:{datetime.datetime.now()} 成功点击登录按钮 : ), 应该已连接')
    except:
        logging.info(f'北京时间:{datetime.datetime.now()} 登陆函数异常')
        print(f'北京时间:{datetime.datetime.now()} 登陆函数异常')
        logging.info(f"ERROR, INFO:{traceback.format_exc()}")
 	finally:
        driver.quit()

def test():
    try:
        baidu_request = requests.get("http://www.baidu.com")
        if (baidu_request.status_code == 200):
            baidu_request.encoding = 'utf-8'
            baidu_request_bsObj = BeautifulSoup(baidu_request.text, 'html.parser')
            baidu_input = baidu_request_bsObj.find(value="百度一下")
            if baidu_input == None:
                return False
    except requests.exceptions.ConnectionError:
        return False
    return True
    '''
    baidu_request = requests.get("http://www.baidu.com")
    if (baidu_request.status_code == 200):
        baidu_request.encoding = 'utf-8'
        baidu_request_bsObj = BeautifulSoup(baidu_request.text, 'html.parser')
        baidu_input = baidu_request_bsObj.find(value="百度一下")
        if baidu_input == None:
            return False
        return True
    '''

if __name__ == '__main__':
    while True:
        logging.basicConfig(filename='/path/to/your/network/output.log', level=logging.INFO)
        if test():
            logging.info(f'北京时间:{datetime.datetime.now()} .............. 网络正常 :) .................')
            print(f'北京时间:{datetime.datetime.now()} .............. 网络正常 :) .................')
            time.sleep(300)
        else:
            logging.info(f'北京时间:{datetime.datetime.now()} 。。。。。。。。。无网络,正在连接 。。。。。。。。。')
            print(f'北京时间:{datetime.datetime.now()} 。。。。。。。。。无网络,正在连接 。。。。。。。。。')
            login()
            time.sleep(10)

下面是 /etc/systemd/system/schoolNet.service的文件内容

[Unit]
Description=School Network Automatic Connection Python Script
After=network.target

[Service]
User=xxx
WorkingDirectory=/path/to/your/network
ExecStart=/usr/bin/python3 /path/to/your/network/school_net.py
Restart=always

[Install]
WantedBy=default.target

启用schoolNet.service

systemctl daemon-reload
systemctl enable schoolNet.service
systemctl start schoolNet.service
systemctl status schoolNet.service

你可能感兴趣的:(杂记,python,服务器,开发语言)