别给我搞炸了
This commit is contained in:
commit
81553d27a2
101
Authtication.py
Normal file
101
Authtication.py
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import os
|
||||||
|
import requests
|
||||||
|
import selenium.common.exceptions
|
||||||
|
import urllib3
|
||||||
|
import logging
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
from selenium import webdriver
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format="%(levelno)s - %(levelname)s - %(asctime)s - %(name)s - %(message)s",
|
||||||
|
datefmt="%Y-%m-%d %H:%M:%S",
|
||||||
|
filename="log.log",
|
||||||
|
filemode="a"
|
||||||
|
)
|
||||||
|
|
||||||
|
class BUCTAU:
|
||||||
|
def __init__(self):
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
self.USER_USERNAME = os.environ.get('BUCT_AUTHENTICATION_USERNAME')
|
||||||
|
self.USER_PASSWORD = os.environ.get('BUCT_AUTHENTICATION_PASSWORD')
|
||||||
|
self.USER_NAME = os.getlogin()
|
||||||
|
|
||||||
|
logging.info(f"USER now is {self.USER_NAME}")
|
||||||
|
logging.info(f"BUCTAU initialized with username:{self.USER_USERNAME}")
|
||||||
|
logging.info(f"BUCTAU initialized with password:{self.USER_PASSWORD}")
|
||||||
|
# print(f"USER now is {self.USER_NAME}")
|
||||||
|
# print("BUCTAU initialized with username:", self.USER_USERNAME)
|
||||||
|
# print("BUCTAU initialized with password:", self.USER_PASSWORD)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def init_driver_edge():
|
||||||
|
"""Initialize the Selenium WebDriver with Edge options.
|
||||||
|
Returns:
|
||||||
|
WebDriver: The initialized Selenium WebDriver instance.
|
||||||
|
"""
|
||||||
|
from selenium.webdriver.edge.options import Options
|
||||||
|
from selenium.webdriver.edge.service import Service
|
||||||
|
|
||||||
|
service = Service()
|
||||||
|
options = Options()
|
||||||
|
options.add_argument("--headless") # Run in headless mode
|
||||||
|
options.add_argument("--no-sandbox")
|
||||||
|
# options.add_experimental_option("detach", True)
|
||||||
|
driver = webdriver.Edge(service=service, options=options)
|
||||||
|
driver.implicitly_wait(5) # Implicit wait for elements to load
|
||||||
|
return driver
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def init_driver_chrome():
|
||||||
|
"""Initialize the Selenium WebDriver with Chrome options.
|
||||||
|
Returns:
|
||||||
|
WebDriver: The initialized Selenium WebDriver instance.
|
||||||
|
"""
|
||||||
|
from selenium.webdriver.chrome.options import Options
|
||||||
|
from selenium.webdriver.chrome.service import Service
|
||||||
|
|
||||||
|
service = Service(executable_path="/usr/bin/chromedriver")
|
||||||
|
options = Options()
|
||||||
|
options.add_argument("--headless") # Run in headless mode
|
||||||
|
options.add_argument("--no-sandbox")
|
||||||
|
# options.add_experimental_option("detach", True)
|
||||||
|
driver = webdriver.Chrome(service=service, options=options)
|
||||||
|
driver.implicitly_wait(5) # Implicit wait for elements to load
|
||||||
|
return driver
|
||||||
|
|
||||||
|
def login(self, driver):
|
||||||
|
"""open the page and login"""
|
||||||
|
logging.info("LOGIN")
|
||||||
|
driver.get("https://tree.buct.edu.cn/index_20.html")
|
||||||
|
driver.maximize_window()
|
||||||
|
try:
|
||||||
|
driver.find_element(By.XPATH, '/html/body/main/section/div[1]/div[2]/input').send_keys(self.USER_USERNAME)
|
||||||
|
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(self.USER_PASSWORD)
|
||||||
|
driver.find_element(By.XPATH, '/html/body/main/section/div[1]/div[8]/button[1]').click()
|
||||||
|
return True
|
||||||
|
except selenium.common.exceptions.NoSuchElementException as e:
|
||||||
|
logging.info("NoSuchElementException: ", e)
|
||||||
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def detect_net():
|
||||||
|
# noinspection PyBroadException
|
||||||
|
try:
|
||||||
|
detector = requests.get(url="https://www.baidu.com", timeout=5)
|
||||||
|
if detector.status_code == 200:
|
||||||
|
logging.info("Network is available")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
logging.info("Network is not available")
|
||||||
|
return False
|
||||||
|
except urllib3.exceptions.MaxRetryError:
|
||||||
|
logging.info("MaxRetryError: False")
|
||||||
|
return False
|
||||||
|
except requests.ConnectionError:
|
||||||
|
logging.info("ConnectionError: False")
|
||||||
|
return False
|
||||||
|
except Exception:
|
||||||
|
return False
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Zhou Zhaoyu
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
15
README.md
Normal file
15
README.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# BUCT校园网自动认证
|
||||||
|
|
||||||
|
使用selenium实现,将edge的webdriver放入系统路径。准备使用树莓派进行自动定时认证。
|
||||||
|
|
||||||
|
# 食用
|
||||||
|
## 配置selenium环境
|
||||||
|
### Windows
|
||||||
|
1. Python和pip安装,加入环境变量
|
||||||
|
2. 用pip安装selenium库
|
||||||
|
3. 下载相应浏览器版本的webdriver并存入环境变量
|
||||||
|
4. run code
|
||||||
|
### Rasbian
|
||||||
|
1. 安装selenium库
|
||||||
|
`sudo apt-get install python3-selenium`
|
||||||
|
他会**自行**安装**所有**需要的库、Webdriver、chronium等等。
|
5
requirements.txt
Normal file
5
requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
requests~=2.32.3
|
||||||
|
selenium~=4.31.0
|
||||||
|
urllib3~=2.4.0
|
||||||
|
dotenv~=0.9.9
|
||||||
|
python-dotenv~=1.1.0
|
26
run.py
Normal file
26
run.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import time
|
||||||
|
import logging
|
||||||
|
from Authtication import BUCTAU
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Main function to run the script."""
|
||||||
|
authenticator = BUCTAU()
|
||||||
|
driver = authenticator.init_driver_edge()
|
||||||
|
past_time = time.time()
|
||||||
|
while True:
|
||||||
|
if time.time() - past_time > 10.0:
|
||||||
|
if authenticator.detect_net():
|
||||||
|
past_time = time.time()
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
authenticator.login(driver)
|
||||||
|
past_time = time.time()
|
||||||
|
continue
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
logging.info("Script interrupted by user. Exiting...")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"An error occurred: {e}")
|
Loading…
x
Reference in New Issue
Block a user