你的账号访问太频繁,请一分钟之后再试!

从大一开始

就用脚本在刷课

在专业课踢的只剩下一门C#的情况下

活活刷到一周的课

大二开始教务系统多了一个非常**的操作

退课池 and 访问频繁缓冲

难道,我大三下还要去学政治课咩?


虽然学政治不如敲代码

但我想毕业啊

emmmmmm

在量子力学的角度,没有抢上毛概的我只是我本体的一个属性,和我本身没有多大关系,我还是快乐敲代码吧。


0.教务系统后台登录流程

先来看一下后台账号密码在发送给服务器之前做了什么处理

这是文中的JS代码

 j$(document).ready(function(evt){
// 初始化验证码
refreshImg();
// 判断操作系统是32位或64位,设置兼容性文件的下载
var cpu = getCPU();
if (cpu != "x64"){
j$("#setjw").attr("href","../custom/lodop/setjw32.zip");
} else {
j$("#setjw").attr("href","../custom/lodop/setjw.zip");
}
// Enter键转TAB
kutil.enter2tab("LoginForm");
// 定位焦点
j$("#yhmc").focus();
}) function doLogon() { // 输入信息验证
if (!validate()) {
return false;
} // 验证码正确性验证
var username = j$("#yhmc").val();
var password = j$("#yhmm").val();
var randnumber = j$("#randnumber").val();
var passwordPolicy = kutil.isPasswordPolicy(username, password);
var url = _webRootPath + "cas/logon.action";
password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));
/**
var params = {
"yhmc" : username,
"yhmm" : password,
"randnumber": randnumber,
"isPasswordPolicy" : passwordPolicy
};
*/
var p_username = "_u"+randnumber;
var p_password = "_p"+randnumber;
username = base64encode(username+";;"+_sessionid);
var params = p_username+"="+username+"&"+p_password+"="+password+"&randnumber="+randnumber+"&isPasswordPolicy="+passwordPolicy ;
//alert("params="+params);
//params = getEncParams(params);
//alert("encparams="+params);
doPreLogon();
kutil.doAjax(url, params, doPostLogon); function doPreLogon(){
j$("#msg").html("正在登录......");
j$("#login").attr("disabled", true);
j$("#reset").attr("disabled", true);
} function doPostLogon(response) {
var data = JSON.parse(response);
var status = data.status ;
var message = data.message ;
if ("200" == status) {
var result = data.result ;
window.document.location.href = result ;
} else {
reloadScript("kingo_encypt",_webRootPath+"custom/js/SetKingoEncypt.jsp");
if("407" == status){
alert(message);
showMessage("");
}else{
showMessage(message);
}
j$("#login").attr("disabled", false);
j$("#reset").attr("disabled", false);
refreshImg();
if ("401"==status) {
j$("#randnumber").val("");
j$("#randnumber").focus();
} else {
j$("#yhmc").val("");
j$("#yhmm").val("");
j$("#randnumber").val("");
j$("#yhmc").focus();
}
}
}
} function validate() {
var username = j$("#yhmc").val();
var password = j$("#yhmm").val();
var randnumber = j$("#randnumber").val();
if (kutil.isNull(username)) {
showMessage("请输入用户名!");
j$("#yhmc").focus();
return false;
}
if (kutil.isNull(password)) {
showMessage("请输入密码!");
j$("#yhmm").focus();
return false;
}
if (kutil.isNull(randnumber)) {
showMessage("请输入验证码!");
j$("#randnumber").focus();
return false;
}
return true;
} // 重置密码为账号(找回密码)
function doReset() {
var tourl = _webRootPath + "frame/retrievePassword.jsp" ;
window.document.location.href = tourl ;
} /**
* 刷新验证码
*/
function refreshImg(){
var url = _webRootPath + "cas/genValidateCode?dateTime="+(new Date());
document.getElementById("randpic").src = url ;
} function showMessage(message){
$("msg").innerHTML = message;
setTimeout("$('msg').innerHTML='';",15000);
} function gologin(e , obj){
var e = window.event?window.event:e;
var x=e.keyCode;
if(x!=13) return false;
if(x<48||x>57) e.returnValue=false;
obj.select();
$("login").onclick();
} function getCPU()
{
var agent=navigator.userAgent.toLowerCase();
if(agent.indexOf("win64")>=0 || agent.indexOf("wow64")>=0) return "x64";
return navigator.cpuClass;
}

来分析一下每一步

     // 验证码正确性验证
var username = j$("#yhmc").val();
var password = j$("#yhmm").val();
var randnumber = j$("#randnumber").val();
var passwordPolicy = kutil.isPasswordPolicy(username, password);
var url = _webRootPath + "cas/logon.action";
password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));

这里拿到username,password,randnumber之后是通过kutil.isPasswordPolicy(username,password)来检验规范

passwordPolicy也是表单参数,一般情况为 1 即可。

     var url = _webRootPath + "cas/logon.action";

url是表单提交处。

password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));

可见密码在输入后会经过一次md5加密,然后将验证码进行一次md加密,拼接到一起之后再进行一次md5加密。

再来看下一部分。

    var p_username = "_u"+randnumber;
var p_password = "_p"+randnumber;
username = base64encode(username+";;"+_sessionid);
var params = p_username+"="+username+"&"+p_password+"="+password+"&randnumber="+randnumber+"&isPasswordPolicy="+passwordPolicy ;

可以发现输入的学号(用户名)在加入表单之前会把username和sessionid字段用base64进行加密

sessionid从cookie中拿到

那么整个params结构就很清楚了。

注意在表单中键是'_p','_u'和验证码拼接的。


1.点击登录之后的表单分析

这是一份学号验证码输入正确,密码输入错误的栗子

这个是成功登录的例子

整个流程已经很明显了

emmmmm至于登录失败的Response,就是下面这个


2.使用Java进行模拟登录

  可能在这之前,你会很好奇验证码怎么拿到

的确,验证码与时间有关

至于怎么拿

你可以在模拟登录之前先用最简单的爬虫知识去request登录页

下面详细来讲模拟登录的流程。

1.如何拿到jsessionid

2.表单的设置

这些就是模拟登录的核心代码了

去年写的代码

注释也是...话说...


    

                              

Java爬虫模拟登录——不给我毛概二的H某大学的更多相关文章

  1. Java爬虫——模拟登录知乎

    登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...

  2. Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇

    前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从<为了媳妇的一张号,我与百度医生杠上了>里就有网友 ...

  3. Java实现模拟登录新浪微博

    毕设题目要使用到新浪微博数据,所以要爬取新浪微博的数据.一般而言,新浪微博的爬虫有两种模式:新浪官方API和模拟登录新浪微博.两种方法的异同点和适用情况就无须赘述了.前辈的文章已经非常多了.写这篇文章 ...

  4. Android(Java) 模拟登录知乎并抓取用户信息

    前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...

  5. 【Java】模拟登录教务网并获取数据

    本文章仅做技术交流演示学习,请勿用于违法操作! 前期准备 首先我们需要到要模拟登录的网页,进行抓包操作. 使用Chrome浏览器打开系统的登录页面,按F12打开开发者工具 切换到Network选项卡 ...

  6. python爬虫模拟登录的图片验证码处理和会话维持

    目标网站:古诗文网 登录界面显示: 打开控制台工具,输入账号密码,在ALL栏目中进行抓包 数据如下: 登录请求的url和请求方式 登录所需参数 参数分析: __VIEWSTATE和__VIEWSTAT ...

  7. python自动化之爬虫模拟登录

    http://selenium-python.readthedocs.io/locating-elements.html ####################################### ...

  8. php后台“爬虫”模拟登录第三方系统

    http://blog.csdn.net/liu_c_y/article/details/49956679 http://www.php100.com/html/webkaifa/PHP/PHPyin ...

  9. Python爬虫模拟登录带验证码网站

    问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...

随机推荐

  1. [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM

    缘由: 使用jenkins的目的需要固定时间构建和间隔固定时间构建,所以才会用到这两个功能. 位置:这两个功能的位置位于每个job的config项中,如下图: [重要的注意点:]           ...

  2. mysql中的事物处理

    首先,事物的概念,保证一组sql语句操作的完整性,在这个过程中要充分考虑到多用户同时访问数据库数据的情况. 关键词有COMMIT,ROLLBACK,,START TRANSACTION

  3. Ubuntu 离线安装Mysql

    一.安装包 先从网络上,下载Mysql安装包,复制到U盘 下载地址:https://dev.mysql.com/downloads/mysql/ 二.挂载U盘 2.1查看分区 先输入命令  cat   ...

  4. 微信小程序开发笔记04

    今天将小程序的页面进行优化 消除昨天遇到的bug问题. 完成了微信小程序的开发.

  5. Exception occurred during processing request: id to load is required for loading

    ERROR Dispatcher:38 - Exception occurred during processing request: id to load is required for loadi ...

  6. php const常量 不能使用字符串连接符.链接

    class jdpay extends pay { const BASE_URL = "https://mapi.jdpay.com/npp10/"; private $agree ...

  7. The way to unwind the stack on Linux EABI

    I. probe the stack frame structure The original idea is to unwind the function call stack according ...

  8. odoo Q-web

    文档链接于:https://www.odoo.com/documentation/8.0/reference/qweb.html QWeb is the primary templating engi ...

  9. LeetCode 237 Delete Node in a Linked List 解题报告

    题目要求 Write a function to delete a node (except the tail) in a singly linked list, given only access ...

  10. vue开发记录--通用时间格式函数

    parseTime(time, fm) { // 解析时间 time: 时间戳或者实践对象 fm: 格式 默认是{y}-{m}-{d} {h}:{i}:{s} if (arguments.length ...