HDU Net Auto Login

2024 年 9 月 28 日 星期六(已编辑)
5
这篇文章上次修改于 2024 年 9 月 28 日 星期六,可能部分内容已经不适用,如有疑问可询问作者。

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 脚本,正好符合对网页进行操作的需求,而且非常简单

// ==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

    npm install puppeteer
  3. 编写 Puppeteer 脚本

    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

  4. 自动运行登录脚本

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

    crontab -e
    0 * * * * /path/to/node /path/to/HDU-Net-Login.js >> /path/to/HDU-Net-Login.log 2>&1
    • /path/to/node 通过在 Terminal 中执行 which node 获取

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

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

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...