实验室自动登录校园网

系统Ubuntu20.04

仅适用于宁波大学(实验室)网络,寝室网络的认证更简单一些

部分代码参考:https://github.com/password123456/setup-selenium-with-chrome-driver-on-ubuntu_debian

更新源

1
2
apt update
apt upgrade

下载Chrome包

1
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

安装google-chrome

1
dpkg -i google-chrome-stable_current_amd64.deb

检查Chrome版本

1
2
google-chrome --version
# Google Chrome 117.0.5938.132

安装selenium, webdriver-manager

1
2
pip3 install selenium
pip3 install webdriver-manager

自动登录代码

路径:/home/autoNet.py

功能:使用chrome浏览器模拟登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

options = Options()
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

def login():
driver.get('https://sso.nbu.edu.cn/login')
# 如果当前URL包含登录页面的地址,那么填写登录信息并提交
username = "xx"
password = "xx"

# 等待页面加载完成
time.sleep(3) # 实践中应尽量避免使用time.sleep,而是使用WebDriverWait等待特定元素出现

# 填写用户名和密码
driver.find_element(By.NAME, 'username').send_keys(username)
driver.find_element(By.CSS_SELECTOR, 'input.ant-input[type="password"]').send_keys(password)

# 等待一小段时间让页面处理输入
time.sleep(1) # 在实际应用中,建议使用显式等待而非time.sleep

# 定位登录按钮并点击
# 由于按钮有可能是禁用状态,确保所有条件都满足使按钮可点击
login_button = driver.find_element(By.CSS_SELECTOR, 'button.login-button')
login_button.click()


# 尝试打开百度,但预期会被重定向
driver.get('https://www.baidu.com')
time.sleep(3)

# 检测是否被重定向到登录页面
current_url = driver.current_url
if 'sso.nbu.edu.cn/login' in current_url:
login()

# 执行其他需要的操作...
time.sleep(5)
# 关闭浏览器
driver.quit()

登录shell脚本

路径:/home/autoNet.sh

功能:判断是否联网,未联网则执行python脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

# 尝试ping baidu的公共DNS,检查网络连通性
if ping -c 1 baidu.com &> /dev/null
then
echo "已联网。"
else
echo "未联网,执行Python脚本。"
/opt/anaconda3/bin/python /home/autoNet.py
fi

开机自动执行脚本

在crontab中添加shell脚本,开机执行一次,每隔三个小时检测一次是否断网

1
2
@reboot /home/autoNet.sh 2>&1
0 */3 * * * /home/autoNet.sh 2>&1

寝室自动登录校园网

具体的data需要抓包获得,大致是要把账号和密码写入data即可

具体的ip也要修改下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

curl -X POST 'http://10.36.100.2:8181/eportal/InterFace.do?method=login' \
-H 'Accept: */*' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Cookie: EPORTAL_COOKIE_PASSWORD=; EPORTAL_COOKIE_USERNAME=; EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_COOKIE_SERVER=; EPORTAL_COOKIE_SERVER_NAME=; EPORTAL_COOKIE_NEWV=; EPORTAL_AUTO_LAND=; EPORTAL_USER_GROUP=null; JSESSIONID=D069F24487DD083F7DA803CC95D7E9E8' \
-H 'Host: 10.36.100.2:8181' \
-H 'Origin: http://10.36.100.2:8181' \
-H 'Referer: http://10.36.100.2:8181/eportal/index.jsp?wlanuserip=f8d6b18d1d88bbd7c5301af547f014b2&wlanacname=813916505d4c0137&ssid=7284ca0f746d6dcd&nasip=3cc5b35fd0a3ef1602aca09ebdc05056&mac=225422356a00073294ba1a9308b0c40c&t=wireless-v2&url=754ab213852ddc85a2f1c9d8f5f9700d4f729dd3f8f842b9' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0' \
--data 'userId=YourID&password=YourPassword&service=&queryString=wlanuserip%3Df8d6b18d1d88bbd7c5301af547f014b2%26wlanacname%3D813916505d4c0137%26ssid%3D7284ca0f746d6dcd%26nasip%3D3cc5b35fd0a3ef1602aca09ebdc05056%26mac%3D225422356a00073294ba1a9308b0c40c%26t%3Dwireless-v2%26url%3D754ab213852ddc85a2f1c9d8f5f9700d4f729dd3f8f842b9&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=false'
  • 最保险的方法是在浏览器抓包,找到data这个项,把它完整的复制过来
  • 上面代码的data不可以直接用

脚本wait2login.sh,输入一个参数表示等待时长(分钟),如ash wait2login.sh 20则是20分钟后执行登录脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
DEFAULT_DELAY=30
if [[ -n "$1" && "$1" =~ ^[0-9]+$ ]]; then
DELAY=$1
else
DELAY=$DEFAULT_DELAY
fi
echo " $DELAY to excute /root/login-in-network"
sleep $(($DELAY * 60))
ash /root/login-in-network
echo "finished"