// ==UserScript== // @name 亳州学院校园网自动登录 // @namespace http://scriptcat.org/ // @version 1.0.0 // @description 亳州学院GiWiFi专属,断网自动重连,自定义检测间隔,脚本猫后台运行专属 | 作者微信:daishuawangke88 // @author 微信:daishuawangke88 // @match http://10.15.1.4/* // @match *://*/* // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_openInTab // @grant GM_notification // @run-at document-end // @license MIT // ==/UserScript== (function () { 'use strict'; // ===================== 核心固定配置(适配你的校园网源码,无需修改) ===================== const CONFIG = { // 校园网固定地址 LOGIN_PAGE: 'http://10.15.1.4/gportal/web/login', LOGIN_HOST: '10.15.1.4', // 外网检测地址(百度favicon,零误判) CHECK_URL: 'http://www.baidu.com/favicon.ico', // 默认检测间隔(秒),可在菜单自定义 DEFAULT_CHECK_INTERVAL: 30, // 表单查找最大重试次数(适配页面动态渲染) MAX_FORM_RETRY: 30, }; // ===================== 账号存储管理(单账号,简单稳定) ===================== const AccountManager = { // 读取保存的账号 get() { return { username: GM_getValue('bzxy_username', ''), password: GM_getValue('bzxy_password', '') }; }, // 保存账号密码 save(username, password) { GM_setValue('bzxy_username', username.trim()); GM_setValue('bzxy_password', password.trim()); GM_notification({ title: '✅ 账号保存成功', text: '账号密码已保存,刷新登录页即可自动填充', timeout: 3000 }); }, // 查看已保存的账号 view() { const account = this.get(); if (!account.username) { alert('⚠️ 暂未保存任何账号密码,请先在菜单中设置'); return; } alert(`📝 已保存的账号信息:\n\n账号:${account.username}\n密码:${account.password}`); }, // 检查是否已配置账号 hasConfig() { const account = this.get(); return account.username && account.password; } }; // ===================== 网络检测模块(100%准确,不会被内网欺骗) ===================== const NetworkChecker = { // 获取用户设置的检测间隔 getInterval() { return GM_getValue('bzxy_check_interval', CONFIG.DEFAULT_CHECK_INTERVAL) * 1000; }, // 设置检测间隔 setInterval(second) { GM_setValue('bzxy_check_interval', second); this.restartLoop(); alert(`✅ 检测间隔已设置为${second}秒,已自动重启检测`); }, // 核心检测:是否能上外网(用图片加载,零误判) async isOnline() { return new Promise((resolve) => { const img = new Image(); // 加时间戳防缓存 img.src = `${CONFIG.CHECK_URL}?t=${new Date().getTime()}`; // 加载成功=外网通 img.onload = () => resolve(true); // 加载失败=外网断 img.onerror = () => resolve(false); // 3秒超时=外网断 setTimeout(() => resolve(false), 3000); }); }, // 立即检测网络并弹窗提示 async checkNow() { alert('正在检测外网状态,请稍候...'); const online = await this.isOnline(); if (online) { alert('✅ 网络正常,校园网已连接,祝你上网愉快'); } else { if (confirm('❌ 网络断开,生活打不败我!是否打开校园网登录页?')) { this.openLoginPage(); } } }, // 打开校园网登录页 openLoginPage() { // 防重复弹窗,10秒内只弹一次 if (window.bzxy_login_lock) return; window.bzxy_login_lock = true; setTimeout(() => window.bzxy_login_lock = false, 10000); console.log('[亳州学院校园网] 检测到外网断开,打开登录页'); GM_notification({ title: '🔌 校园网已断开', text: '生活打不败我!正在打开登录页,将自动完成登录', timeout: 3000 }); GM_openInTab(CONFIG.LOGIN_PAGE, { active: true }); }, // 后台检测循环 loopTimer: null, startLoop() { this.stopLoop(); const interval = this.getInterval(); this.loopTimer = setInterval(async () => { const online = await this.isOnline(); console.log('[亳州学院校园网] 外网检测结果:', online ? '正常' : '断开'); // 外网断开,打开登录页 if (!online) { this.openLoginPage(); } }, interval); console.log(`[亳州学院校园网] 后台检测已启动,间隔${interval/1000}秒`); }, stopLoop() { if (this.loopTimer) { clearInterval(this.loopTimer); this.loopTimer = null; console.log('[亳州学院校园网] 后台检测已停止'); } }, restartLoop() { this.stopLoop(); this.startLoop(); } }; // ===================== 自动登录模块(精准适配你的校园网源码,100%找到表单) ===================== const AutoLogin = { // 【精准匹配源码】登录页元素选择器,从你的源码里直接提取,绝对不会找不到 selectors: { username: 'input[name="user_account"], #p_account', password: 'input[name="user_password"]', loginBtn: '#btn_login' }, // 判断当前是不是登录页 isLoginPage() { return location.host.includes(CONFIG.LOGIN_HOST) && location.pathname.toLowerCase().includes('/login'); }, // 判断当前是不是已登录的页面(成功页/下线页) isLoggedInPage() { return location.host.includes(CONFIG.LOGIN_HOST) && (location.pathname.toLowerCase().includes('/index') || location.pathname.toLowerCase().includes('/logout')); }, // 查找登录表单 findForm() { return { usernameInput: document.querySelector(this.selectors.username), passwordInput: document.querySelector(this.selectors.password), loginBtn: document.querySelector(this.selectors.loginBtn) }; }, // 执行自动填充和登录 async fillAndLogin() { // 不是登录页,直接退出 if (!this.isLoginPage()) return; // 没配置账号,提示用户 if (!AccountManager.hasConfig()) { alert('⚠️ 请先点击脚本猫菜单,设置你的校园网账号密码!'); return; } const account = AccountManager.get(); console.log('[亳州学院校园网] 开始查找登录表单,准备自动登录'); // 循环查找表单,适配页面动态渲染,每秒找一次,最多找30秒 for (let i = 0; i < CONFIG.MAX_FORM_RETRY; i++) { const { usernameInput, passwordInput, loginBtn } = this.findForm(); // 三个元素都找到,执行登录 if (usernameInput && passwordInput && loginBtn) { console.log(`[亳州学院校园网] 第${i+1}次查找,已找到完整登录表单,开始填充`); // 填充账号密码 usernameInput.value = account.username; passwordInput.value = account.password; // 触发页面输入事件,适配GiWiFi的JS校验 usernameInput.dispatchEvent(new Event('input', { bubbles: true })); passwordInput.dispatchEvent(new Event('input', { bubbles: true })); usernameInput.dispatchEvent(new Event('change', { bubbles: true })); passwordInput.dispatchEvent(new Event('change', { bubbles: true })); // 延迟点击,确保页面校验完成 await sleep(500); loginBtn.click(); console.log('[亳州学院校园网] 已点击登录按钮'); // 等待登录结果,3秒后检测 await sleep(3000); await this.checkLoginResult(); return; } // 没找到,等待1秒重试 console.log(`[亳州学院校园网] 第${i+1}次查找,未找到表单,重试中...`); await sleep(1000); } // 重试完还没找到表单 console.error('[亳州学院校园网] 多次重试后未找到登录表单'); alert('❌ 未找到登录表单,页面可能加载异常,请刷新页面重试'); }, // 检查登录结果 async checkLoginResult() { const online = await NetworkChecker.isOnline(); if (online) { // 登录成功 GM_notification({ title: '🎉 登录成功', text: '祝你上网愉快', timeout: 5000 }); alert('🎉 登录成功,祝你上网愉快'); } else { // 登录失败 GM_notification({ title: '❌ 登录失败', text: '生活打不败我!请检查账号密码,或点击忘记密码找回', timeout: 5000 }); alert('❌ 登录失败,生活打不败我!\n\n请检查账号密码是否正确,若忘记密码,请点击页面上的「忘记密码」进行找回'); } }, // 页面加载完成后执行 async init() { // 已登录的页面,不执行任何操作 if (this.isLoggedInPage()) { console.log('[亳州学院校园网] 检测到已登录页面,无需操作'); return; } // 登录页,执行自动登录 if (this.isLoginPage()) { await sleep(1000); await this.fillAndLogin(); } } }; // ===================== 菜单命令(可视化操作,完全符合你的需求) ===================== function registerMenu() { GM_registerMenuCommand('📝 设置账号密码', () => { const username = prompt('请输入你的学号/校园网账号:'); if (!username) return; const password = prompt('请输入你的校园网密码:'); if (!password) return; AccountManager.save(username, password); }); GM_registerMenuCommand('👁️ 查看已保存账号', () => { AccountManager.view(); }); GM_registerMenuCommand('⏱️ 设置检测间隔', () => { const current = GM_getValue('bzxy_check_interval', CONFIG.DEFAULT_CHECK_INTERVAL); const input = prompt(`请输入网络检测间隔(单位:秒,建议5-300之间)`, current); if (!input) return; const second = parseInt(input); if (isNaN(second) || second < 5 || second > 300) { alert('❌ 请输入5-300之间的有效数字'); return; } NetworkChecker.setInterval(second); }); GM_registerMenuCommand('🔍 立即检测网络状态', () => { NetworkChecker.checkNow(); }); GM_registerMenuCommand('📌 后台运行开启教程', () => { alert(`📌 脚本猫后台运行开启步骤: 1. 点击浏览器右上角脚本猫图标 2. 找到「设置」选项并进入 3. 找到并开启「启用后台运行」开关 4. 额外设置:脚本猫→本脚本→设置→添加后台定时任务(建议5分钟执行一次) 开启后,即使关闭所有浏览器窗口,浏览器仍会在后台运行,并最小化到系统托盘,直到您手动退出浏览器。这使后台脚本能够继续运行,断网也能自动重连。 🔴 仅脚本猫支持后台运行功能,油猴/暴力猴等其他脚本管理器无此能力`); }); GM_registerMenuCommand('ℹ️ 关于脚本', () => { alert(`亳州学院校园网自动登录 ==================== 作者:微信 daishuawangke88 适配:亳州学院GiWiFi校园网 版本:1.0.0 开源协议:MIT License ==================== 💬 问题反馈/定制需求 📱 微信:daishuawangke88`); }); } // ===================== 工具函数 ===================== function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // ===================== 首次启动提示 ===================== function firstRunTip() { // 没配置账号,首次启动提示 if (!AccountManager.hasConfig()) { setTimeout(() => { alert('📌 首次使用请先点击脚本猫菜单,设置你的校园网账号密码!'); }, 1000); } // 后台运行提示,只弹一次 const hasShownTip = GM_getValue('bzxy_background_tip', false); if (!hasShownTip) { setTimeout(() => { alert('📌 必看:请在脚本猫设置里开启「后台运行」,关闭浏览器窗口也能自动重连!\n\n开启步骤可在脚本菜单的「后台运行开启教程」中查看'); GM_setValue('bzxy_background_tip', true); }, 1500); } } // ===================== 脚本初始化 ===================== async function init() { console.log('======================================'); console.log('亳州学院校园网自动登录 启动成功'); console.log('作者微信:daishuawangke88'); console.log('======================================'); // 1. 注册菜单 registerMenu(); // 2. 启动后台网络检测循环 NetworkChecker.startLoop(); // 3. 登录页自动登录逻辑 await AutoLogin.init(); // 4. 首次启动提示 firstRunTip(); } // 页面加载完成后启动脚本 if (document.readyState === 'complete') { init(); } else { window.addEventListener('load', init); } })();