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 ...
随机推荐
- C语言程序设计(七) 函数
第七章 函数 分而治之: 把较大的任务分解成若干较小.较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 ...
- 通过locust进行性能测试
首先我们需要准备好python环境 接口 安装python 插件 locust,网上有很多文章而且都很错,这里不再赘述 我是通过pycharm 编写的代码 导入 HttpLocust,TaskSet ...
- Caused by: java.lang.IllegalArgumentException
Caused by: java.lang.IllegalArgumentException 是因为jdk较高而项目需要的是低版本的问题 1.将idea或idea里的语言级别调到适合自己项目的版本比如安 ...
- python员工管理系统(基础版)
各位小伙伴们大家好,最近自学python已经差不多把基础学完了,现在运用这些基础知识写了一个简单版本的员工管理系统 因为在大学里我是学过java的,所以,当有了一定的基础和熏陶外,真心觉得python ...
- CSS导入方式和六种选择器
1.css的导入方式 1.1 行内嵌式 1.2 内部方式 1.2.1含义: css代码写在<head>的<style>标签中 1.2.2 优点 方便在同页面中修改样式 1.2. ...
- [Dynamic Programming]动态规划之背包问题
动态规划之背包问题 例题 现有4样物品n = ['a', 'b', 'c', 'd'],重量分别为w = [2, 4, 5, 3],价值分别为v = [5, 4, 6, 2].背包最大承重c = 9. ...
- Mybatis详解系列(一)--持久层框架解决了什么及如何使用Mybatis
简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...
- TCP、UDP服务器模型 在网络程序里面,通常都是一
TCP.UDP服务器模型 在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式. 目前最常用的服务器模型: 循环服务器:循环服务器在同一时刻只能响 ...
- MySQL数据库参数调优方法
怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据 ...
- OpenCV-Python 图像梯度 | 十八
目标 在本章中,我们将学习: 查找图像梯度,边缘等 我们将看到以下函数:cv.Sobel(),cv.Scharr(),cv.Laplacian()等 理论 OpenCV提供三种类型的梯度滤波器或高通滤 ...