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

从大一开始

就用脚本在刷课

在专业课踢的只剩下一门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. [VS SVN] VS的SVN插件AnkhSvn

    VS的SVN插件AnkhSvn   修改VS配置  将解决方案或项目加入SVN管理

  2. OpenJDK和JDK区别

    OpenJDK和JDK区别 OpenJDK与JDK的区别分析 Sun的JDK7.OpenJDK及IcedTea释疑 简介(ps): 简单来说jdk从7开始,弄出一个可以自由使用的公共版本(openjd ...

  3. HBuilder控制台集成命令提示符(终端/CMD)功能

    参考:https://jingyan.baidu.com/album/6b97984dc9cda31ca2b0bf00.html?picindex=3

  4. Java课程课后作业02之动手动脑

    一.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 数学算法原理: 可以使用的方法:Math中的random类以及random类,区别:Math中的random类只能用于生成随机数 ...

  5. 腾讯地图打开地图选取位置 withMap

    https://lbs.qq.com/tool/component-picker.html withMap import React, { Component } from "react&q ...

  6. 使用 jQuery 调用 ASP.NET AJAX Page Method

    文章来源:http://chungle.iteye.com/blog/406054 说到轻量级的客户端通信,我注意到大多数人喜欢使用 ASP.NET AJAX Page Method 多于 ASMX ...

  7. [No0000197]Windows用户都应该知道的运行命令

    通过"运行"命令,运行Windows丰富工具的方法.如果您知道工具或任务的相应"运行"命令,那么您就知道访问所述工具或任务的最快方法. 以下是我们最喜欢的Run ...

  8. 把vim改装为source sight

    本文在ubuntu18.04上实践. 主要为VIM 安装4个插件: taglist,srcexpl,NERD_tree,ctrlp 1,taglist.vim :https://www.vim.org ...

  9. 实现mybash

    任务内容 1.使用fork,exec,wait实现mybash 查找资料: fork函数 通过fork()系统调用我们可以创建一个和当前进程印象一样的新进程.我们通常将新进程称为子进程,而当前进程称为 ...

  10. nlp底层技术列举

    其实目前除了之前博客写到的一些关于自然语言处理用到的知识点之外,很多其他nlp技术只是会用但是不了解原理,先整体分个类,之后再仔细分析吧. 上图是https://www.sohu.com/a/1386 ...