| @@ 52-109 (lines=58) @@ | ||
| 49 | var app = express(); |
|
| 50 | ||
| 51 | // 查成绩API,通过GET传入用户名和密码 |
|
| 52 | app.get('/grades/', function (req, res, next) {
|
|
| 53 | if (program.fulllog) {
|
|
| 54 | var start = new Date(); |
|
| 55 | console.log((timeStamp() + 'Started to query the grades: ').cyan + req.query.id.yellow); |
|
| 56 | } |
|
| 57 | access.login(req.query.id, req.query.pwd, res, function (headers, ires) {
|
|
| 58 | program.fulllog && console.log((timeStamp() + 'Successfully logged in.').green); |
|
| 59 | var ret = {};
|
|
| 60 | var $ = cheerio.load(ires.text); |
|
| 61 | ret.name = escaper.unescape($('.block1text').html()).match(/姓名:.+</)[0].replace('<', '').substring(3);
|
|
| 62 | ret.id = req.query.id; |
|
| 63 | ||
| 64 | // 进入成绩页面 |
|
| 65 | superagent.get(base + $('li[title="我的成绩"] a').attr('href'))
|
|
| 66 | .set(headers) |
|
| 67 | .end(function (err, iires) {
|
|
| 68 | if (err) {
|
|
| 69 | console.log((timeStamp() + 'Failed to get grades page\n' + err.stack).red); |
|
| 70 | res.send({ error: '无法进入成绩页面' });
|
|
| 71 | return next(err); |
|
| 72 | } |
|
| 73 | program.fulllog && console.log((timeStamp() + 'Successfully entered grades page.').green); |
|
| 74 | ||
| 75 | $ = cheerio.load(iires.text); |
|
| 76 | ||
| 77 | // 获取成绩列表 |
|
| 78 | let grades = {};
|
|
| 79 | let failed = {};
|
|
| 80 | $('#dataList').each(function (index) {
|
|
| 81 | // cheerio没有实现jQuery的lt |
|
| 82 | if (index >= 2) |
|
| 83 | return; |
|
| 84 | $(this).find('tr[class!="theadCss"]').each(function() {
|
|
| 85 | // 这段写得真是要吐血了 |
|
| 86 | let subject = escaper.unescape($(this).find('td[align="left"]').eq(1).text());
|
|
| 87 | if (subject) {
|
|
| 88 | let score = $(this).find('font');
|
|
| 89 | if (score.text()) |
|
| 90 | grades[subject] = score.text(); |
|
| 91 | if (score.css('color'))
|
|
| 92 | failed[subject] = score.text(); |
|
| 93 | } |
|
| 94 | }); |
|
| 95 | }); |
|
| 96 | ret.grades = grades; |
|
| 97 | ret['subject-count'] = Object.getOwnPropertyNames(grades).length; |
|
| 98 | ret.failed = failed; |
|
| 99 | ret['failed-count'] = Object.getOwnPropertyNames(failed).length; |
|
| 100 | ||
| 101 | // 完成所有工作后,登出 |
|
| 102 | access.logout(headers, res, function() {
|
|
| 103 | // 第五步:返回JSON |
|
| 104 | res.send(JSON.stringify(ret)); |
|
| 105 | program.fulllog && console.log((timeStamp() + 'Successfully logged out: ').green + req.query.id.yellow + (' (processed in ' + (new Date() - start) + 'ms)').green);
|
|
| 106 | }); |
|
| 107 | }); |
|
| 108 | }); |
|
| 109 | }); |
|
| 110 | ||
| 111 | // TODO: 对参数的正确性进行检查 |
|
| 112 | ||
| @@ 114-165 (lines=52) @@ | ||
| 111 | // TODO: 对参数的正确性进行检查 |
|
| 112 | ||
| 113 | // 查考试API,通过GET传入用户名和密码 |
|
| 114 | app.get('/exams/', function (req, res, next) {
|
|
| 115 | if (program.fulllog) {
|
|
| 116 | var start = new Date(); |
|
| 117 | console.log((timeStamp() + 'Started to query the exams: ').cyan + req.query.id.yellow); |
|
| 118 | } |
|
| 119 | access.login(req.query.id, req.query.pwd, res, function (headers, ires) {
|
|
| 120 | var ret = {};
|
|
| 121 | var $ = cheerio.load(ires.text); |
|
| 122 | ret.name = escaper.unescape($('.block1text').html()).match(/姓名:.+</)[0].replace('<', '').substring(3);
|
|
| 123 | ret.id = req.query.id; |
|
| 124 | ||
| 125 | superagent.post('http://csujwc.its.csu.edu.cn/jsxsd/xsks/xsksap_list')
|
|
| 126 | .set(headers) |
|
| 127 | .type('form')
|
|
| 128 | .send({
|
|
| 129 | xqlbmc: '', |
|
| 130 | xnxqid: '2016-2017-1', //TODO: 添加别的选项,或者通过参数传入 |
|
| 131 | xqlb: '' |
|
| 132 | }) |
|
| 133 | .end(function (err, iires) {
|
|
| 134 | if (err) {
|
|
| 135 | console.log((timeStamp() + 'Failed to reach exams page\n' + err.stack).red); |
|
| 136 | res.send({ error: '获取成绩失败' });
|
|
| 137 | return next(err); |
|
| 138 | } |
|
| 139 | program.fulllog && console.log((timeStamp() + 'Successfully entered exams page.').green); |
|
| 140 | ||
| 141 | $ = cheerio.load(iires.text); |
|
| 142 | ||
| 143 | let exams = []; |
|
| 144 | ||
| 145 | $('#dataList tr').each(function (index) {
|
|
| 146 | if (index === 0) |
|
| 147 | return; |
|
| 148 | let item = $(this).find('td');
|
|
| 149 | let subject = {};
|
|
| 150 | subject.subject = escaper.unescape(item.eq(3).text()); |
|
| 151 | subject.time = escaper.unescape(item.eq(4).text()); |
|
| 152 | subject.location = escaper.unescape(item.eq(5).text()); |
|
| 153 | subject.seat = escaper.unescape(item.eq(6).text()); |
|
| 154 | exams.push(subject); |
|
| 155 | }); |
|
| 156 | ||
| 157 | ret.exams = exams; |
|
| 158 | ||
| 159 | access.logout(headers, res, function() {
|
|
| 160 | res.send(JSON.stringify(ret)); |
|
| 161 | program.fulllog && console.log((timeStamp() + 'Successfully logged out: ').green + req.query.id.yellow + (' (processed in ' + (new Date() - start) + 'ms)').green);
|
|
| 162 | }); |
|
| 163 | }); |
|
| 164 | }); |
|
| 165 | }); |
|
| 166 | ||
| 167 | app.listen(port); |
|
| 168 | console.log((timeStamp() + 'The server is now running on port ' + port + '.').green); |
|