// ==UserScript== // @name SRUN3000 helper // @namespace Kn // @version 0.31 // @description 自动登录srun3000校园网计费系统,关闭登录成功页面并返回跳转前页面 // @author KevinTan // @match http://192.0.0.6/* // @grant none // @downloadURL none // ==/UserScript== /* jshint -W097 */ 'use strict'; alert = console.log.bind(console); var sid = null; var view = (function() { var ret = {}; var style = document.createElement('style'); var header = document.createElement('header'); var brand = document.createElement('div'); var board = document.createElement('div'); var info = document.createElement('div'); style.innerHTML = 'header, header *{box-sizing:border-box;font-size:16px;line-height:50px;height:50px;}'; header.style = 'position:fixed;background-color:#303a40;z-index:9999;top:0;left:0;width:100%;color:#fff;' + '-webkit-box-shadow: 0 2px 5px rgba(0,0,0,.2);-moz-box-shadow: 0 2px 5px rgba(0,0,0,.2);box-shadow: 0 2px 5px rgba(0,0,0,.2)'; brand.style = 'float:left;background-color:#3689b3;padding:0 30px'; board.style = 'width;100%;white-space:nowrap;overflow:hidden;text-align:center;opacity:1'; info.style = 'float:right;color:#ccc;padding:0 20px;cursor:pointer'; brand.innerText = 'SRUN3000认证助手'; board.innerText = '欢迎使用 (\'v\')~'; info.innerText = '@kevinsfork'; ret.load = function() { document.head.appendChild(style); document.body.appendChild(header); header.appendChild(brand); header.appendChild(info); header.appendChild(board); } ret.print = function(msg, speed) { speed = speed || 0.1; if (speed == 1) { board.innerText = msg; return; } function fadeOut() { if (board.style.opacity > 0) { board.style.opacity = 1 * board.style.opacity - speed; console.log('[Out]', board.style.opacity); requestAnimationFrame(fadeOut); } else { board.innerText = msg; requestAnimationFrame(fadeIn); } } function fadeIn() { if (board.style.opacity < 1) { board.style.opacity = 1 * board.style.opacity + speed; console.log('[In]', board.style.opacity); requestAnimationFrame(fadeIn); } } requestAnimationFrame(fadeOut); } return ret; })(); window.dict = { 'user_tab_error': '认证程序未启动', 'username_error': '用户名错误,请在localStorage中修改usernamae字段', 'non_auth_error': '您无须认证,可直接上网', 'password_error': '密码错误,请在localStorage中修改password字段', 'status_error': '用户已欠费,请尽快充值。', 'available_error': '用户已禁用', 'ip_exist_error': '您的IP尚未下线,请等待2分钟再试。', 'usernum_error': '用户数已达上限', 'online_num_error': '该帐号的登录人数已超过限额\n如果怀疑帐号被盗用,请联系管理员。', 'mode_error': '系统已禁止WEB方式登录,请使用客户端', 'time_policy_error': '当前时段不允许连接', 'flux_error': '您的流量已超支', 'minutes_error': '您的时长已超支', 'ip_error': '您的IP地址不合法', 'mac_error': '您的MAC地址不合法', 'sync_error': '您的资料已修改,正在等待同步,请2分钟后再试。', 'logout_ok': '注销成功,请等1分钟后登录。', 'logout_error': '您不在线上' }; window.AutoLogin = function(loginInfo) { var loginStr = "username=" + loginInfo.username + "&password=" + hex_md5(loginInfo.password).substr(8, 16) + "&drop=0&type=1&n=1"; view.print('正在使用 ' + loginInfo.username + ' 的用户信息登陆'); console.log('login params:', loginStr); var req = new XMLHttpRequest(); req.open('POST', '/cgi-bin/do_login'); req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send(loginStr); req.addEventListener('load', function(e) { var status = req.responseText; console.log(status); if (/^\d+$/.test(status)) { view.print('登陆成功,跳转回原页面'); var originUrl = (function() { var url = window.location.toString().match(/\?(?:url=)?(https?:\/\/.*)$/); return url ? url[1] || -1 : -1; })(); if (originUrl !== -1) { window.location.href = originUrl; } else { window.close(); } } else if (status === 'online_num_error') { //forcelogout view.print('登录人数超过限额,尝试强制注销'); req.open('POST', '/cgi-bin/force_logout'); var logoutStr = "username=" + loginInfo.username + "&password=" + loginInfo.password + "&drop=0&type=1&n=1"; console.log('logout params:', logoutStr); req.send(logoutStr); } else if (status === 'logout_ok') { var count = 60; sid = window.setInterval(function() { if (count == 0) { window.AutoLogin(loginInfo); sid && window.clearInterval(sid); } else { var hint = '强制注销成功,等待 ' + count + 's 后自动重试'; view.print(hint, 1); } count--; }, 1000); } else if (status === 'non_auth_error') { window.close(); } else { view.print(window.dict[status]); } }); } view.load(); if (document.title.indexOf('欢迎使用') !== -1) { if (window.localStorage.username == null) { view.print('没有可用的登陆信息,请手动登陆'); return; } var loginInfo = { username: window.localStorage.username, rpassword: window.localStorage.password, password: window.localStorage.password } window.AutoLogin(loginInfo); } else if (document.title.indexOf('登录成功') !== -1) { window.onbeforeunload = null; window.onunload = null; if (window.opener) { window.opener.close(); window.close(); } }