因为开学选课的事情拖了几天…于是到现在才写完 :)

上篇介绍了要使用到的模块,等到我完善代码后会在 GitHub 上开源,跟大家分享讨论。

2018.12.06/更新

本项目已开源:GitHub

所以这篇就讲讲我在编码过程中遇到的难点吧。

在 Async 模块中.end(function(response)中的 response 取值

获取 XSRF-TOKEN 值:

1
2
3
example.XSRFTOKEN = response.response.header['set-cookie']
.join(',')
.match(/(XSRF-TOKEN=.+?);/)[1];

同理:JSESSIONID 值:

1
2
3
example.XSRFTOKEN = response.response.header['set-cookie']
.join(',')
.match(/(JSESSIONID=.+?);/)[1];

关于 SuperAgent 模块的自动重定向问题

我们需要在 request 请求中设置request.redirects(0),以免 request 模块自动跟踪重定向(这样我们就不能分开每一步获取 Cookie 了)。

关于 Async waterfall 中的传参

1
2
3
4
5
6
7
8
9
10
async.waterfall([
function() {
const foo = 1;
callback(null, foo);
},

function(foo, callback) {
console.log(foo); // 1
}
]);

关于User-Agent

在几次尝试后发现,服务器会自动过滤掉 Request Headers 中无User-Agent的请求,所以我们在请求中可以通过.set('User-Agent', String)去设置该字段。

Example: .set('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36')

关于重定向 URL 的获取

和获取 Set-Cookie 值同理,我们可以在 Response Headers 中获取 location 的值

1
step.redirectUrl = response.response.header.location;

结语

通过模拟登陆取得的Cookie 可以访问很多TMS的API,如获取教室使用情况,获取课表,获取考勤记录等。

至此,模拟登陆 TMS 就完成啦,一开始做这个其实是打算做一个让同学们可以快速查看课表的小程序,当然数据来源就是通过这个模拟登陆爬取啦!

下一篇可能就是讲小程序了!