September 28, 2024

HDU Net Auto Login

HDU Net Auto Login

HDU 的网络每天都需要手动在网页上输入学号和密码登录,不仅非常麻烦

而且经过测试,网络一般在每天凌晨一点多的时候断开,而我至少也要等到早上才会到实验室重新登录

如果有需要长时间保持联网的服务,将导致很长一段时间的网络不可用

因此考虑写一个自动化脚本,每天自动登录

登录方式

首先,HDU 的网络是通过在 http://192.168.112.30 输入学号和密码登录,对此过程观察网络请求

可以发现,登录时的请求中包含了用户名 username 和密码 passowrd

但同时也包括了校验码 chksum 和加密验证信息 info

以及观察登录页面的元素

可以发现,学号、密码和登录按钮分别为 #username#passowrd#login-account

因此,只需自动填入 #username#passowrd,然后点击 #login-account 即可

Tampermonkey

我首先想到的就是利用 Tampermonkey 脚本,正好符合对网页进行操作的需求,而且非常简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// ==UserScript==
// @name HDU-Net-Login
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Automatically login to network auth
// @author You
// @match http://192.168.112.30/*
// @grant none
// ==/UserScript==

(function() {
'use strict';

// Replace with your username and password
var username = '<USERNAME>';
var password = '<PASSWORD>';

// Replace 'username_field_id', 'password_field_id', and 'login_button_id' with the actual IDs
document.getElementById('username').value = username;
document.getElementById('password').value = password;

// Automatically click the login button
document.getElementById('login-account').click();
})();

这样,访问 http://192.168.112.30 的时候 Tampermonkey 就会自动往文本框中填入学号和密码,并自动点击登录

然而,这虽然很大程度上简化了登录,但仍旧需要手动访问登录页面

我也尝试过使用 Automator.app 定时自动打开网页,但是似乎在 Mac 进入屏幕保护程序之后是无法打开图形化程序的,只好放弃

Puppeteer

Puppeteer 是一个 Node.js 库,可以控制无头浏览器,可以使用它模拟用户在浏览器中的操作,从而自动执行登录流程

  1. 安装 Node.js

    Node.js — Download Node.js®

  2. 安装 Puppeteer

1
npm install puppeteer
  1. 编写 Puppeteer 脚本
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
const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();

// Go to login auth page
await page.goto('http://192.168.112.30/srun_portal_pc?ac_id=0&theme=pro');

// Fill username and password
await page.type('#username', '<USERNAME>');
await page.type('#password', '<PASSWORD>');

// Click login button
await Promise.all([
page.click('#login-account'),
page.waitForNavigation() // Wait for navigation
]);

// Check login status
const success = await page.evaluate(() => {
return document.body.innerText.includes("Login Successful");
});

if (success) {
console.log('Login Successful');
} else {
console.log('Login Failed');
}

await browser.close();
})();

保存为 HDU-Net-Login.js

  1. 自动运行登录脚本

每个小时自动运行登录脚本,并把运行结果写入到 HDU-Net-Login.log

1
2
crontab -e
0 * * * * /path/to/node /path/to/HDU-Net-Login.js >> /path/to/HDU-Net-Login.log 2>&1

经过测试,脚本运行正常,可以实现登录功能

但是定时每小时运行还是不够完美,后续可以修改为持续的网络状态检测,发现网络断开后自动运行登录脚本

About this Post

This post is written by OwlllOvO, licensed under CC BY-NC 4.0.

#HDU