Java爬虫模拟登录——不给我毛概二的H某大学
你的账号访问太频繁,请一分钟之后再试!
从大一开始
就用脚本在刷课
在专业课踢的只剩下一门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某大学的更多相关文章
- Java爬虫——模拟登录知乎
登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...
- Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇
前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从<为了媳妇的一张号,我与百度医生杠上了>里就有网友 ...
- Java实现模拟登录新浪微博
毕设题目要使用到新浪微博数据,所以要爬取新浪微博的数据.一般而言,新浪微博的爬虫有两种模式:新浪官方API和模拟登录新浪微博.两种方法的异同点和适用情况就无须赘述了.前辈的文章已经非常多了.写这篇文章 ...
- Android(Java) 模拟登录知乎并抓取用户信息
前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...
- 【Java】模拟登录教务网并获取数据
本文章仅做技术交流演示学习,请勿用于违法操作! 前期准备 首先我们需要到要模拟登录的网页,进行抓包操作. 使用Chrome浏览器打开系统的登录页面,按F12打开开发者工具 切换到Network选项卡 ...
- python爬虫模拟登录的图片验证码处理和会话维持
目标网站:古诗文网 登录界面显示: 打开控制台工具,输入账号密码,在ALL栏目中进行抓包 数据如下: 登录请求的url和请求方式 登录所需参数 参数分析: __VIEWSTATE和__VIEWSTAT ...
- python自动化之爬虫模拟登录
http://selenium-python.readthedocs.io/locating-elements.html ####################################### ...
- php后台“爬虫”模拟登录第三方系统
http://blog.csdn.net/liu_c_y/article/details/49956679 http://www.php100.com/html/webkaifa/PHP/PHPyin ...
- Python爬虫模拟登录带验证码网站
问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...
随机推荐
- [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM
缘由: 使用jenkins的目的需要固定时间构建和间隔固定时间构建,所以才会用到这两个功能. 位置:这两个功能的位置位于每个job的config项中,如下图: [重要的注意点:] ...
- mysql中的事物处理
首先,事物的概念,保证一组sql语句操作的完整性,在这个过程中要充分考虑到多用户同时访问数据库数据的情况. 关键词有COMMIT,ROLLBACK,,START TRANSACTION
- Ubuntu 离线安装Mysql
一.安装包 先从网络上,下载Mysql安装包,复制到U盘 下载地址:https://dev.mysql.com/downloads/mysql/ 二.挂载U盘 2.1查看分区 先输入命令 cat ...
- 微信小程序开发笔记04
今天将小程序的页面进行优化 消除昨天遇到的bug问题. 完成了微信小程序的开发.
- 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 ...
- php const常量 不能使用字符串连接符.链接
class jdpay extends pay { const BASE_URL = "https://mapi.jdpay.com/npp10/"; private $agree ...
- 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 ...
- odoo Q-web
文档链接于:https://www.odoo.com/documentation/8.0/reference/qweb.html QWeb is the primary templating engi ...
- 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 ...
- vue开发记录--通用时间格式函数
parseTime(time, fm) { // 解析时间 time: 时间戳或者实践对象 fm: 格式 默认是{y}-{m}-{d} {h}:{i}:{s} if (arguments.length ...
