11 Commits
11 changed files with 117 additions and 15 deletions
+10
View File
@@ -0,0 +1,10 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# 已忽略包含查询文件的默认文件夹
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>
+6
View File
@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/buctAuthentication.iml" filepath="$PROJECT_DIR$/.idea/buctAuthentication.iml" />
</modules>
</component>
</project>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
+1
View File
@@ -0,0 +1 @@
3.13
+22 -10
View File
@@ -1,7 +1,8 @@
import os
import requests
import time
import datetime
import selenium.common.exceptions
import urllib3
import logging
from dotenv import load_dotenv
from selenium import webdriver
@@ -11,7 +12,7 @@ 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",
filename=f"logs/{datetime.date.today()}.log",
filemode="a"
)
@@ -21,9 +22,7 @@ class BUCTAU:
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}")
@@ -74,14 +73,16 @@ class BUCTAU:
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()
login_button = driver.find_element(By.XPATH, '/html/body/main/section/div[1]/div[8]/button[1]')
driver.execute_script("arguments[0].click();", login_button)
# driver.find_element(By.ID,"login-account").click()
return True
except selenium.common.exceptions.NoSuchElementException as e:
logging.info("NoSuchElementException: ", e)
return False
@staticmethod
def detect_net():
def detect_net_requests():
# noinspection PyBroadException
try:
detector = requests.get(url="https://www.baidu.com", timeout=5)
@@ -91,11 +92,22 @@ class BUCTAU:
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
return False
@staticmethod
def detect_net(driver):
# noinspection PyBroadException
try:
driver.get("https://tree.buct.edu.cn/index_20.html")
driver.maximize_window()
time.sleep(3) # Wait for the page to load
driver.find_element(By.XPATH, '/html/body/main/section/div[1]/div[7]/button[1]')
logging.info("Have logged in")
return True # Not logged in
except Exception:
logging.warning("Not logged in")
return False
+35 -3
View File
@@ -4,11 +4,43 @@
用crontab理论上也行。
由于用到了logging。所以service里面要加上`WorkingDirectory=/path/to/programe`。出错先找找权限问题。
---
## 关于登录账号
在程序的根目录下面新建`.env`文件,里面写
```ini
BUCT_AUTHENTICATION_USERNAME=你的学号
BUCT_AUTHENTICATION_PASSWORD=校园网密码
```
---
现在还是有点问题。比如说没有连接wifi的情况下,request的get会报ssl error然后直接退出。except也不好用。
## 关于service
由于用到了logging。所以service里面要加上`WorkingDirectory=/path/to/programe`来确保文件可以正常写入 。
出错先找找权限问题,我应该是直接给了755。这里是一个servivce的配置文件例子。
```YAML
[Unit]
Description=Auto authentication.
After=network-online.target
[Service]
Type=simple
ExecStart=/path/to/your/python /path/to/your/program
WorkingDirectory=/path/to/your/program
User=Your_User
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
```
---
~~现在还是有点问题。比如说没有连接wifi的情况下,request的get会报ssl error然后直接退出。except也不好用。~~
虽然我不知道为什么,但是最后还是改成用selenium检测登陆界面元素来做这事。虽然是反璞归真了,但是管他呢它跑得起来就行了。
我的解决方法就是service里面`Restart=always`,`RestartSec=60`。实测下来是能正常认证的。
用request来检测纯属闲的,本来还是拿selenium检测的。反正能跑管他呢。
用request来检测纯属闲的,本来还是拿selenium检测的。反正能跑管他呢。
+6
View File
@@ -0,0 +1,6 @@
def main():
print("Hello from buctauthentication!")
if __name__ == "__main__":
main()
+7
View File
@@ -0,0 +1,7 @@
[project]
name = "buctauthentication"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
+2 -2
View File
@@ -5,11 +5,11 @@ from Authtication import BUCTAU
def main():
"""Main function to run the script."""
authenticator = BUCTAU()
driver = authenticator.init_driver_edge()
driver = authenticator.init_driver_chrome()
past_time = time.time()
while True:
if time.time() - past_time > 10.0:
if authenticator.detect_net():
if authenticator.detect_net(driver=driver):
past_time = time.time()
continue
else: