下面是“NodeJs模拟登陆正方教务”的完整攻略:
一、前置准备
在开始NodeJs模拟登陆正方教务之前,我们需要保证以下几点:
- 学校教务系统平台支持模拟登陆,常见的支持教务系统有“正方教务系统”、“智慧校园”等;
- 获取学校教务系统的账号和密码,以进行模拟登陆;
- 安装NodeJs开发环境和npm包管理工具,以便安装相关插件。
二、安装必要插件
模拟登陆正方教务需要用到request、cheerio、iconv-lite等插件,这些插件可以通过npm包管理工具进行安装。
具体命令如下:
npm install request cheerio iconv-lite --save
三、实现模拟登陆
实现模拟登陆正方教务主要涉及以下几个步骤:
1. 获取登陆页面
使用request插件发送请求获取登陆页面,代码示例如下:
var request = require('request');
var url = 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html';
request.get({
url: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
},
encoding: null
}, function (err, response, body) {
if (err) {
console.error(err);
return;
}
if (response.statusCode === 200) {
var html = iconv.decode(body, 'GBK');
console.log(html);
}
});
2. 提取表单数据
从登陆页面获取到表单数据,一般是包含表单元素的html。使用cheerio插件可以轻松提取表单元素的data值,代码示例如下:
var cheerio = require('cheerio');
var $ = cheerio.load(html);
var form = $('form#fm1');
var formdata = {};
form.find('input').each(function (index, element) {
var input = $(element);
formdata[input.attr('name')] = input.attr('value') || '';
});
3. 发送登陆请求
将刚才提取的表单数据发送给服务器验证登陆信息,代码示例如下:
var request = require('request');
var iconv = require('iconv-lite');
var url = 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html';
var formdata = {
'yhm': 'YourUsername',
'mm': 'YourPassword',
'mm': '',
};
request.post({
url: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
'Referer': 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html'
},
encoding: null,
form: formdata
}, function (err, response, body) {
if (err) {
console.error(err);
return;
}
if (response.statusCode === 200) {
var html = iconv.decode(body, 'GBK');
console.log(html);
}
});
四、示例说明
下面分别通过建立session和使用jsonwebtoken的方式实现模拟登陆正方教务的过程。
1. 示例一:建立session
const request = require('request');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');
let j = request.jar();
const loginOptions = {
url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
jar: j,
encoding: null,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
};
let courseId = '';
const user = {
username: 'YourUsername',
password: 'YourPassword'
};
request(loginOptions, (err, response, body) => {
const $ = cheerio.load(iconv.decode(body, 'GBK'));
const inputList = $('form.login-form').eq(0).find('input[type="hidden"]');
const params = {
yhm: user.username,
mm: user.password,
};
inputList.each((i, ele) => {
const thisEle = $(ele);
params[thisEle.attr('name')] = thisEle.attr('value');
});
const options = {
url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
jar: j,
encoding: null,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
'Referer': 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html'
},
formData: params,
};
request.post(options, (err, response, body) => {
const $ = cheerio.load(iconv.decode(body, 'GBK'));
courseId = $('a').eq(0).attr('href').split('=')[1];
setTableList();
});
});
2. 示例二:使用jsonwebtoken
const request = require('request');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');
const jwt = require('jsonwebtoken');
const user = {
username: 'YourUsername',
password: 'YourPassword'
};
const options = {
url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
encoding: null,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
};
request(options, (err, response, body) => {
const $ = cheerio.load(iconv.decode(body, 'GBK'));
const inputList = $('form.login-form').eq(0).find('input[type="hidden"]');
const params = {
yhm: user.username,
mm: user.password,
};
inputList.each((i, ele) => {
const thisEle = $(ele);
params[thisEle.attr('name')] = thisEle.attr('value');
});
const rsaModulus = params.rsaModulus;
const exponent = '10001';
const key = new Buffer(rsaModulus, 'base64').toString();
const password = new Buffer(params.mm).toString('base64');
const rsa = jwt.sign({
"sub": user.username,
"iat": Math.floor(Date.now() / 1000) - 30,
"exp": Math.floor(Date.now() / 1000) + (60 * 60),
}, key, {
algorithm: 'RS256',
header: {
"alg": "RS256",
"typ": "JWT",
"kid": "rsa1"
}
});
const options = {
url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
encoding: null,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
'Referer': 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html'
},
form: {
yhm: user.username,
mm: password,
"yzm": '',
"mm": rsa,
}
};
request.post(options);
});
以上就是NodeJs模拟登陆正方教务的完整攻略,通过上述步骤和示例代码可以成功实现登陆操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJs模拟登陆正方教务 - Python技术站