cu-api
Version:
An api for CU Boulder students.
94 lines (93 loc) • 3.98 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CUSession = void 0;
const path = require("path");
const cheerio = require("cheerio");
const qs = require("querystring");
const request = require("superagent");
function getFormValues($, values = []) {
Object.values;
return values.reduce((prev, key) => (Object.assign(Object.assign({}, prev), { [key]: $(`input[name='${key}']`).attr('value') })), {});
}
const userUrl = 'https://buffportal.colorado.edu/usews/api/v1/profile/v3';
const termUrl = 'https://buffportal.colorado.edu/usews/api/v1/terms';
const gpaUrl = 'https://buffportal.colorado.edu/usews/api/v1/gpa/all';
class CUSession {
constructor() {
this.agent = request.agent();
this.isLoggedIn = false;
const rootCas = require('ssl-root-cas').create();
rootCas.inject().addFile(path.resolve(__dirname, 'intermediate.pem'));
this.agent.ca(rootCas);
}
init(username, password) {
return __awaiter(this, void 0, void 0, function* () {
yield this.agent
.get('https://buffportal.colorado.edu/')
.then((res) => {
const $ = cheerio.load(res.text);
return this.agent
.post(`https://fedauth.colorado.edu${$('form').attr('action')}`)
.accept('text/html,application/xhtml+xml,application/xml')
.set('Content-Type', 'application/x-www-form-urlencoded')
.send(qs.stringify({
j_username: username,
j_password: password,
_eventId_proceed: ''
}));
})
.then((res) => {
const $ = cheerio.load(res.text);
const data = getFormValues($, ['RelayState', 'SAMLResponse']);
return this.agent
.post($('form').attr('action'))
.accept('text/html,application/xhtml+xml,application/xml')
.set('Content-Type', 'application/x-www-form-urlencoded')
.send(data);
})
.then(() => {
this.isLoggedIn = true;
});
});
}
get loggedIn() {
return this.isLoggedIn;
}
json(url) {
return __awaiter(this, void 0, void 0, function* () {
return yield this.agent.get(url).then((res) => JSON.parse(res.text));
});
}
userData() {
return __awaiter(this, void 0, void 0, function* () {
return yield this.json(userUrl);
});
}
termData() {
return __awaiter(this, void 0, void 0, function* () {
return (yield this.json(termUrl)).data;
});
}
GPA() {
return __awaiter(this, void 0, void 0, function* () {
const data = yield this.json(gpaUrl);
return data[0];
});
}
classTermData(term4) {
return __awaiter(this, void 0, void 0, function* () {
const data = yield this.json(`https://buffportal.colorado.edu/usews/api/v1/schedule/term/${term4}`);
return new Map(data.map((course) => [`${course.crseId}-${course.classSection}`, course]));
});
}
}
exports.CUSession = CUSession;