nodejs模拟登陆旧版正方教务系统
nodejs模拟登陆学校教务系统
因为刚进入大一,学习了一些网页设计的知识,大一寒假期间,学习了解了一些微信小程序开发,并制作了登陆学校教务系统获取课表的小程序,本篇文章主要讲解的是旧版正方教务系统的模拟登陆,其他教程网络上也有很多相似的教程,此教程仅供学习参考,使用的nodejs模块为:
var request = require('request');//发送请求的模块
var iconv = require('iconv-lite');//防止编码错乱的模块
var fs = require('fs');//储存验证码到本地的文件操作模块
var readline = require('readline');//读取用户键盘输入的模块
var jsdom = require("jsdom");//解析网页dom的模块
需要使用的请自行npm i xxxx
1、分析教务系统地址
学校教务系统的首页为:http://218.195.117.143/
学校教务系统验证码的为:http://218.195.117.143/CheckCode.aspx
2、分析请求头和请求数据
我们随意在用户名密码验证码输入栏中输入数据点击登陆,查询控制台数据如下:
分析数据我们可以发现,我们这边需要提供用户名密码验证码,以及__VIEWSTATE和RadioButtonList1数据,在请求头上我们正常复制,仅仅在cookie上需要进行一些操作。
后续我通过Fiddler抓包发现RadioButtonList1是教务系统登陆界面下的学生选项,所以我们的主要问题是在于cookie、__VIEWSTATE数据的获取
3、对Cookie、__VIEWSTATE数据的获取
(1)获取cookie
获取cookie首先我们考虑登陆的时候要保证验证码对应cookie,这样我们输入验证码登陆的时候保证cookie对应验证码,这样就能正常登陆了,因此我们首先创建cookie的全局变量,再通过request向验证码发送get请求保存验证码再保存cookie。
(2)获取__VIEWSTATE
通过对教务系统网页的代码分析,我们发现__VIEWSTATE存在于网页代码中,所以我们在请求登陆页面的时候通过分析网页得到__VIEWSTATE即可。
获取cookie和__VIEWSTATE代码如下(代码中有使用readline模块读取用户输入验证码):
var request = require('request')
var iconv = require('iconv-lite')
var fs = require('fs')
var readline = require('readline');
const jsdom = require("jsdom");
let url = 'http://218.195.117.143/'
let url2 = 'http://218.195.117.143/CheckCode.aspx'
//创建readline接口实例(读取用户输入要先创建readline接口实例)
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var cookie = '';;
var __VIEWSTATE = '';
var answers = '';//验证码
//获取__VIEWSTATE
request(url, function (error, response, body) {
var arr = body.split('"');
__VIEWSTATE = arr[119];//这边因为懒得去解析dom,干脆取巧直接解析字符串获取
console.log('__VIEWSTATE是:' + __VIEWSTATE);//输出一下信息确认内容
});
//获取验证码并储存到本地,
let stream = fs.createWriteStream("./code.jpg");
request(url2, function (error, response, body) {
cookie = response.headers["set-cookie"][0];//这边通过response得到cookie
rl.question("请输入验证码:", function (answer) {
answers = answer;//这边得到用户输入的验证码
});
}).pipe(stream).on('close', function () {
console.log(cookie);
});
4、得到用户数据开始模拟登陆
我们之前通过对请求的分析得到了post需要填入的数据,这时候我们复制粘贴刚才的数据,直接照着数据发送post请求(post请求部分代码如下):
request.post({
url: url, headers: {
"Cookie": cookie
}, encoding: null, form: {
"__VIEWSTATE": __VIEWSTATE,
"txtUserName": "这边输入账号",
"TextBox1": '',
"TextBox2": "这边输入密码",
"txtSecretCode": answers,
'RadioButtonList1': '%D1%A7%C9%FA',
'Button1': '',
'lbLanguage': '',
'hidPdrs': '',
'hidsc': ''
}
}, function (error, response, body) {
var buf = iconv.decode(body, 'gb2312');//这里是对得到的网页数据进行编码设置
console.log(buf.toString());
});
我们正常运行该js,根据同目录下生成的验证码输入验证码信息,得到的截图如下:
这边其实我们可以看到以及登陆成功了,网页上的信息提示我们跳转到其他页面,这边我们再做一次网页跳转测试效果。
5、跳转到教务系统个人主页面
request.get({
url: url+'xs_main.aspx?xh=这边填学号', encoding: null, headers: {
"Cookie": cookie
}
}, function (e, r, b) {
var buf2 = iconv.decode(b, 'gb2312');
console.log(buf2.toString());
});
截图如下:
我们翻阅过输出的信息后发现确实是我们成功登录到教务系统的网页代码,因此我们模拟登陆教务系统的功能实现完成!
6、全部代码
var request = require('request')
var iconv = require('iconv-lite')
var fs = require('fs')
var readline = require('readline');
const jsdom = require("jsdom");
let url = 'http://218.195.117.143/'
let url2 = 'http://218.195.117.143/CheckCode.aspx'
//创建readline接口实例(读取用户输入要先创建readline接口实例)
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var cookie = '';;
var __VIEWSTATE = '';
var answers = '';//验证码
//获取__VIEWSTATE
request(url, function (error, response, body) {
var arr = body.split('"');
__VIEWSTATE = arr[119];//这边因为懒得去解析dom,干脆取巧直接解析字符串获取
console.log('__VIEWSTATE是:' + __VIEWSTATE);//输出一下信息确认内容
});
//获取验证码并储存到本地,
let stream = fs.createWriteStream("./code1.jpg");
request(url2, function (error, response, body) {
cookie = response.headers["set-cookie"][0];//这边通过response得到cookie
rl.question("请输入验证码:", function (answer) {
answers = answer;//这边得到用户输入的验证码
request.post({
url: url, headers: {
"Cookie": cookie
}, encoding: null, form: {
"__VIEWSTATE": __VIEWSTATE,
"txtUserName": "这里输入学号",
"TextBox1": '',
"TextBox2": "这里输入密码",
"txtSecretCode": answers,
'RadioButtonList1': '%D1%A7%C9%FA',
'Button1': '',
'lbLanguage': '',
'hidPdrs': '',
'hidsc': ''
}
}, function (error, response, body) {
var buf = iconv.decode(body, 'gb2312');//这里是对得到的网页数据进行编码设置
console.log(buf.toString());
request.get({//跳转到教务系统个人主页面
url: url+'xs_main.aspx?xh=这里输入学号', encoding: null, headers: {
"Cookie": cookie
}
}, function (e, r, b) {
var buf2 = iconv.decode(b, 'gb2312');
console.log(buf2.toString());
});
});
});
}).pipe(stream).on('close', function () {
console.log(cookie);
});