node.js模拟学校教务处登录
临近毕业,在做毕设,我的毕设中有一个功能是模拟我学校的教务处登录以获得cookie,本来以为是挺简单的一个功能,但却花了我两天的时间。(我学校教务处用的是湖南强智科技开发的)
在网上搜了大量的模拟登录教务处的文章,发现基本都是java/php/python的,居然没有几篇node.js,我决定亲自动手。
1、先打开Charles抓包,完整的登录一次教务处

发送了不少请求,但显而易见,只有最后带Logon的请求才是真正登录要发的请求,两条请求都是POST请求,直接看看请求的form信息和响应的body


图一中画黑线的form数据我经过多次重发,发现是无用数据,可以直接删掉,也就是说发送登录请求只要USERNAME、PASSWORD和RANDOMCODE。那么为什么还要发送图二请求?
我找到了这篇文章
https://www.cnblogs.com/geqianst/p/3286027.html 1 将username和password两个的值post到http://202.114.242.21/whkjdx/Logon.do?method=logon
2 通过1的操作以后,页面会跳转到http://202.114.242.21/whkjdx/index.jsp,接着我们post一个空表单到http://202.114.242.21/whkjdx/Logon.do?method=logonBySSO,这样才算完全登录成功,如果没有第二步,会提示权限错误
原来如此。两个请求缺一不可
2、使用request-promise库依葫芦画瓢
// rp-login.js
const rp = require('request-promise') const baseUrl = 'http://59.51.24.46/hysf'
let studentCookie = '' // 填入cookie const headers = {
Cookie: studentCookie
} const options = {
method: 'POST',
uri: `${baseUrl}/Logon.do?method=logon`,
headers,
resolveWithFullResponse: true,
form: {
USERNAME: '我是帐号',
PASSWORD: '我是密码',
RANDOMCODE: '' //填入验证码
}
}
const optionsSSO = {
method: 'POST',
uri: `${baseUrl}/Logon.do?method=logonBySSO`,
headers,
resolveWithFullResponse: true
} rp(options)
.then(body => {
if (body.body.includes('main.jsp')) {
console.log('登录成功')
} else {
console.log('登录失败', body)
} rp(optionsSSO)
.then(body => {
console.log('单点登录成功!')
// if (body.body.includes('Menus')) {
// console.log('登录成功')
// } else {
// console.log('登录失败')
// }
})
.catch(err => {
console.log('单点登录失败!', err)
})
})
.catch(err => {
console.log('帐号验证失败或者验证码错误', err)
})
打开教务处页面

获得验证码和cookie,填入代码中,node rp-login.js,没有问题,然后进入教务处主页,进入成功,无需再校验帐号
本来以为到此就结束了,但我发现直接在我的页面中使用验证码地址放入img标签然后获取cookie是行不通的
http://59.51.24.46/hysf/verifycode.servlet
因为nodejs发送的POST请求又会收到一个新的cookie,和验证码的cookie不一样,于是还有第三步
3、获取验证码图片
// rcode.js
const request = require('request')
var fs = require('fs') request(
'http://59.51.24.46/hysf/verifycode.servlet',
{ encoding: null }, // 此处需设置null,否则获取的body是乱码
(err, res, buffer) => {
if (err) {
console.log('出错了', err)
} else {
const id = res.headers['set-cookie'][0].slice(0, 43)
fs.writeFile(`./${id}.jpg`, buffer, err => {
if (err) {
console.log('保存验证码失败:', err)
} else {
console.log('存储验证码图片成功')
}
})
}
}
)
执行后获得验证码图片和COOKIE

就是这样,后续的页面处理较简单就不写了
node.js模拟学校教务处登录的更多相关文章
- Node.js模拟发起http请求从异步转同步的5种方法
使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...
- node.js模拟qq漂流瓶
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...
- node.js 模拟自动发送邮件验证码
node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...
- Node.js搭建简易用户登录
根据学习笔记一的知识点搭建的简易用户注册登录模块,用户数据暂用json保存. HTML: <!DOCTYPE html> <html lang="en" dir= ...
- node.js实现简单的登录注册页面
首先需要新建四个文件 一个服务器js 一个保存数据的txt 一个登陆.一个注册页面html 1.注册页面 <!DOCTYPE html> <html lang="en&qu ...
- js模拟自动化测试 -- 多用户登录
1.核心登录提交方法 /** * 动态表单提交方法 * @param url{string}: 提交地址 * @param params{object}: 要提交的表单数据 **/ function ...
- 用node.js模拟服务器和客户端
服务器 代码 var net = require("net") var server = net.createServer(); server.listen(12306," ...
- node.js使用express框架进行文件上传
关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...
- Centos7 中 Node.js安装简单方法
最近,我一直对学习Node.js比较感兴趣.下面是小编给大家带来的Centos7 中 Node.js安装简单方法,在此记录一下,方便自己也方便大家,一起看看吧! 安装node.js 登陆Centos ...
随机推荐
- mysql 多个字段重复记录查询
select * from productstockquantity t where () ORDER BY t.CombinationI
- nlogn的最长不下降子序列【tyvj1254挑选士兵】
var a,d:Array[-..]of longint; i,n,m,k,l:longint; function erfen(x:longint):longint; var mid,h,t:long ...
- EPX-Studio脚本调用
procedure TF408017792.Button1Click(Sender: TObject); var NEPX: IExcelPanelXDisp; begin NEPX := this. ...
- weblogic-CVE-2020-2551-IIOP反序列化学习记录
CORBA: 具体的对CORBA的介绍安全客这篇文章https://www.anquanke.com/post/id/199227说的很详细,但是完全记住是不可能的,我觉得读完它要弄清以下几个点: 1 ...
- Journal of Proteome Research | Down-Regulation of a Male-Specific H3K4 Demethylase, KDM5D, Impairs Cardiomyocyte Differentiation (男性特有的H3K4脱甲基酶基因(KDM5D)下调会损伤心肌细胞分化) | (解读人:徐宁)
文献名:Down-Regulation of a Male-Specific H3K4 Demethylase, KDM5D, Impairs Cardiomyocyte Differentiatio ...
- C++技法杂记
C++ 技法杂技杂记 1. 枚举 1.1 枚举继承(Enum Inheritance) struct Enum{ enum{ One = 1, Two, Last }; }; struct EnumD ...
- spring单例bean是线程安全的吗?
如果在你不定义成员变量的情况下,spring默认是线程安全的 否则,设置scope="prototype"
- MySQL学习(3)
一 SQL语句 1. 数据库级别(*) 显示全部数据库:show databases; 创建数据库:create database '数据库名字’; 使用数据库:use '数据库名字'; 删除数据库: ...
- Jupyter的安装和基本使用
1. 安装Jupyter pip install jupyter 2. Jupyter的初次使用 # 进入虚拟环境 workon ai # 输入命令 jupyter notebook 本地notebo ...
- SSI服务器端包含注入
服务器端嵌入:Server Side Include,是一种类似于ASP的基于服务器的网页制作技术.大多数(尤其是基于Unix平台)的WEB服务器如Netscape Enterprise Server ...