Completed
Push — master ( 84125d...23c154 )
by Equim
01:08
created

app.js (1 issue)

Severity
1
/* TODO
2
 * 完善异常处理
3
 */
4
5
"use strict";
6
7
var express = require('express'),
8
    superagent = require('superagent'),
9
    cheerio = require('cheerio'),
10
    escaper = require('true-html-escape'),
11
    colors = require('colors'),
12
    program = require('commander'),
13
    Date = require('./lib/Date.js'),
14
    access = require('./lib/access.js');
15
16
program
17
    .option('-h, --help')
18
    .option('-v, --version')
19
    .option('-p, --port [n]', parseInt)
20
    .option('-f, --fulllog')
21
    .parse(process.argv);
22
23
// 别问我为什么这里逻辑这么奇怪……测试的结果确实是这样的啊hhh
24
if (!program.help || !program.version) {
25
    console.log(('CSUEMS API v1.0.0').rainbow);
26
    console.log(('by The Liberators').rainbow);
27
    if (!program.help) {
28
        console.log('Preparation:');
29
        console.log('  \\\\This section is WIP\\\\');
30
        console.log('\nUsage:');
31
        console.log('  npm start [-- <options...>]');
32
        console.log('\nOptions:');
33
        console.log('  -h, --help          print this message and exit.');
34
        console.log('  -v, --version       print the version and exit.');
35
        console.log('  -f, --fulllog       enable full log, by default only errors are logged.');
36
        console.log('  -p, --port [value]  specify a port to listen, 2333 by default.');
37
        console.log('\nExamples:');
38
        console.log('  $ npm start -p 43715                      # listening to 43715');
39
        console.log('  # forever start app.js                    # deploy with forever as daemon (root access recommended)');
40
        console.log('  # pm2 start -i 0 --name "csuapi" app.js   # deploy with pm2 as daemon  (root access recommended)');
41
    }
42
    process.exit(0);
43
}
44
45
const timeStamp = () => new Date().format('[MM-dd hh:mm:ss] '),
46
      port = program.port || 2333,
47
      base = 'http://csujwc.its.csu.edu.cn';
48
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, iires) {
58
        program.fulllog && console.log((timeStamp() + 'Successfully logged in.').green);
59
        var ret = {};
60
        var $ = cheerio.load(iires.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, iiires) {
68
                if (err) {
69
                    console.log((timeStamp() + 'Failed to fetch grades\n' + err.stack).red);
1 ignored issue
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
70
                    ret.error = '获取成绩失败';
71
                    return next(err);
72
                }
73
                program.fulllog && console.log((timeStamp() + 'Successfully entered grades page.').green);
74
75
                $ = cheerio.load(iiires.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
// 查考试API,通过GET传入用户名和密码
112
/*
113
app.get('/exams/', function (req, res, next) {
114
    if (program.fulllog) {
115
        var start = new Date();
116
        console.log((timeStamp() + 'Started to query the exams: ').cyan + req.query.id.yellow);
117
    }
118
    login(req.query.id, req.query.pwd, res, function (headers, iires) {
119
        var ret = {};
120
        var $ = cheerio.load(iires.text);
121
        ret.name = escaper.unescape($('.block1text').html()).match(/姓名:.+</)[0].replace('<', '').substring(3);
122
        ret.id = req.query.id;
123
124
        // TODO: POST,注意headers
125
});
126
*/
127
128
app.listen(port);
129
console.log((timeStamp() + 'The server is now running on port ' + port + '.').green);