-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
122 lines (113 loc) · 3.66 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
var express = require('express');
var bodyParser = require('body-parser');
var request = require('urllib-sync').request;
var cheerio = require('cheerio');
var codepage = require('codepage');
var app = express();
app.use(bodyParser.json());
app.use('/', express.static(__dirname + '/build'));
app.get('/proxy/vcode', function(req, res){
var hres = request('http://grades.hs.ntnu.edu.tw/online/image/vcode.asp?vcode=' + Math.floor(Math.random() * (Math.pow(2, 32) - 1)));
res.send({ status: 'ok', session: hres.headers['set-cookie'][0].split(';')[0], image: hres.data.toString('base64') });
});
app.post('/proxy/login', function(req, res){
if(!req.body.username || !req.body.password || !req.body.vcode){
res.send({ status: 'error', message: 'invalid request' });
return;
}
var hres = request('http://grades.hs.ntnu.edu.tw/online/login.asp', {
method: 'POST',
data: {
'Loginid': req.body.username,
'LoginPwd': req.body.password,
'Uid': '',
'vcode': req.body.vcode,
'division': 'senior',
'Enter': 'LOGIN'
},
headers: {
'Cookie': req.body.session
}
});
var html = hres.data.toString();
if(html.indexOf('frames.asp') != -1){
var hres = request('http://grades.hs.ntnu.edu.tw/online/student/selection_look_over_data.asp?look_over=right_below', {
method: 'GET',
encoding: null,
headers: {
'Cookie': req.body.session
}
});
var html = codepage.utils.decode(950, new Buffer(hres.data));
var $ = cheerio.load(html);
var name = $('#authirty1 > td').eq(2).text();
res.send({ status: 'ok', username: name });
} else {
res.send({ status: 'error' });
}
});
app.get('/proxy/profile', function(req, res){
if(!req.query.session){
res.send({ status: 'error', message: 'invalid request' });
return;
}
var hres = request('http://grades.hs.ntnu.edu.tw/online/student/selection_look_over_data.asp?look_over=right_below', {
method: 'GET',
headers: {
'Cookie': req.query.session
}
});
var html = codepage.utils.decode(950, new Buffer(hres.data));
if(html.indexOf('伺服器錯誤') != -1){
res.send({ status: 'error', message: 'login timeout' });
return;
}
var $ = cheerio.load(html);
var name = $('#authirty1 > td').eq(2).text();
res.send({ status: 'ok', username: name });
});
app.get('/proxy/list', function(req, res){
if(!req.query.session){
res.send({ status: 'error', message: 'invalid request' });
return;
}
var hres = request('http://grades.hs.ntnu.edu.tw/online/selection_student/student_subjects_number.asp?action=open_window_frame', {
method: 'GET',
headers: {
'Cookie': req.query.session
}
});
var html = codepage.utils.decode(950, new Buffer(hres.data));
var $ = cheerio.load(html);
var els = $('option', 'select');
var ret = [];
els.each(function(idx, el){
if(idx < 2) return true;
ret[idx-2] = { name: $(this).text(), action: $(this).attr('value') };
});
res.send({ status: 'ok', list: ret });
});
app.post('/proxy/query', function(req, res){
if(!req.body.session || !req.body.action){
res.send({ status: 'error', message: 'invalid request' });
return;
}
var hres = request('http://grades.hs.ntnu.edu.tw/online/selection_student/' + req.body.action, {
method: 'GET',
timeout: 15000,
headers: {
'Cookie': req.body.session
}
});
var html = codepage.utils.decode(950, new Buffer(hres.data));
var $ = cheerio.load(html);
$('input').remove();
var ret = $('body').html();
res.send({ status: 'ok', result: ret.replace('圴', '均') });
});
app.use(function(req, res){
res.sendFile(__dirname + '/build/index.html');
});
app.listen(8000, function(){
console.log('started');
});