Greasy Fork

Greasy Fork is available in English.

SRUN3000 helper

自动登录srun3000校园网计费系统,关闭登录成功页面并返回跳转前页面

当前为 2015-12-30 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         SRUN3000 helper
// @namespace    Kn
// @version      0.31
// @description  自动登录srun3000校园网计费系统,关闭登录成功页面并返回跳转前页面
// @author       KevinTan
// @match        http://192.0.0.6/*
// @grant        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();
  }
}