@charlesaugust44/nubank-api
Version:
This is a package to easily integrate the nubank web api, supporting QRCode login.
192 lines (191 loc) • 7.87 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nubank = exports.NubankStatus = void 0;
var axios_1 = require("axios");
var discoveryRoutes_1 = require("./discoveryRoutes");
var fs_1 = require("fs");
var QRCode = require("qrcode");
var nubankConfig = './nubank.json';
var REQUEST_HEADER = {
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
Accept: 'application/json, text/plain, */*',
Origin: 'https://app.nubank.com.br',
Host: 'prod-global-webapp-proxy.nubank.com.br',
Connection: 'keep-alive'
};
var NubankStatus;
(function (NubankStatus) {
NubankStatus[NubankStatus["AUTHORIZED"] = 0] = "AUTHORIZED";
NubankStatus[NubankStatus["UNAUTHORIZED"] = 1] = "UNAUTHORIZED";
NubankStatus[NubankStatus["WAITING_QR"] = 2] = "WAITING_QR";
})(NubankStatus = exports.NubankStatus || (exports.NubankStatus = {}));
var Nubank = /** @class */ (function () {
function Nubank() {
}
Nubank.discovery = function () {
var discoveryRequest = axios_1.default.get(discoveryRoutes_1.default.discovery, { headers: REQUEST_HEADER });
var appDiscoveryRequest = axios_1.default.get(discoveryRoutes_1.default.appDiscovery, { headers: REQUEST_HEADER });
return Promise.all([discoveryRequest, appDiscoveryRequest]).then(function (response) {
Nubank.discoveryRoutes = response[0].data;
Nubank.appDiscoveryRoutes = response[1].data;
});
};
Nubank.login = function (cpf, password) {
return new Promise(function (resolve, reject) {
Nubank.discovery().then(function () {
var data = {
grant_type: "password",
login: cpf,
password: password,
client_id: "other.conta",
client_secret: Nubank.clientSecret
};
axios_1.default.post(Nubank.discoveryRoutes.login, data, { headers: REQUEST_HEADER })
.then(function (response) {
Nubank.loginResponse = response.data;
Nubank.status = NubankStatus.WAITING_QR;
resolve(response.data);
})
.catch(function (error) {
Nubank.status = NubankStatus.UNAUTHORIZED;
reject(error);
});
});
});
};
Nubank.logout = function () {
return axios_1.default.post(Nubank.loginResponse._links.revoke_token.href, {}, Nubank.getRequestConfig())
.then(function () {
Nubank.status = NubankStatus.UNAUTHORIZED;
});
};
Nubank.lift = function () {
return new Promise(function (resolve, reject) {
if (Nubank.status !== NubankStatus.WAITING_QR) {
reject({ message: "Login needs to be done before trying to lift the QRCode!" });
}
var data = {
qr_code_id: Nubank.sessionId,
type: "login-webapp"
};
axios_1.default.post(Nubank.appDiscoveryRoutes.lift, data, Nubank.getRequestConfig(true))
.then(function (response) {
Nubank.liftResponse = response.data;
Nubank.status = NubankStatus.AUTHORIZED;
resolve(response.data);
})
.catch(function (err) {
reject(err);
});
});
};
Nubank.fetchBillsSummary = function () {
return new Promise(function (resolve, reject) {
axios_1.default.get(Nubank.liftResponse._links.bills_summary.href, Nubank.getRequestConfig())
.then((function (response) {
resolve(response.data.bills);
}))
.catch(function (error) {
reject(error);
});
});
};
Nubank.fetchBill = function (billFragment) {
return new Promise(function (resolve, reject) {
axios_1.default.get(billFragment._links.self.href, Nubank.getRequestConfig())
.then((function (response) {
resolve(response.data.bill);
}))
.catch(function (error) {
reject(error);
});
});
};
Nubank.fetchEvents = function () {
return new Promise(function (resolve, reject) {
axios_1.default.get(Nubank.liftResponse._links.events.href, Nubank.getRequestConfig())
.then((function (response) {
resolve(response.data.events);
}))
.catch(function (error) {
reject(error);
});
});
};
Nubank.getQRCodeImage = function () {
Nubank.sessionId = Nubank.generateSSID();
return new Promise(function (resolve, reject) {
QRCode.toDataURL(Nubank.sessionId, { errorCorrectionLevel: 'H' }, function (err, url) {
if (err)
reject(err);
if (url)
resolve(url);
});
});
};
Nubank.printQRCode = function () {
Nubank.sessionId = Nubank.generateSSID();
return new Promise(function (resolve, reject) {
QRCode.toString(Nubank.sessionId, {
type: 'terminal'
}, function (err, url) {
if (err)
reject(err);
if (url)
resolve(url);
console.log("\n" + url);
});
});
};
Nubank.getRequestConfig = function (useLoginToken) {
if (useLoginToken === void 0) { useLoginToken = false; }
var token = useLoginToken ? Nubank.loginResponse.access_token : Nubank.liftResponse.access_token;
return {
headers: __assign(__assign({}, REQUEST_HEADER), { Authorization: "Bearer " + token })
};
};
Nubank.generateSSID = function () {
var crypto = require('crypto').webcrypto;
var rand = function () {
if (crypto.getRandomValues) {
var arr = new Uint8Array(1);
crypto.getRandomValues(arr);
return (arr[0] % 16).toString(16);
}
return (16 * Math.random() | 0).toString(16);
};
return "xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx".replace(/x/g, rand);
};
Nubank.loadData = function () {
if (!(0, fs_1.existsSync)(nubankConfig))
return false;
var serialized = (0, fs_1.readFileSync)(nubankConfig, { encoding: 'utf8', flag: 'r' });
var data = JSON.parse(serialized);
Nubank.liftResponse = data.liftResponse;
Nubank.loginResponse = data.loginResponse;
Nubank.status = NubankStatus.AUTHORIZED;
return true;
};
Nubank.storeData = function () {
(0, fs_1.writeFileSync)(nubankConfig, JSON.stringify({
liftResponse: Nubank.liftResponse,
loginResponse: Nubank.loginResponse
}));
};
Nubank.status = NubankStatus.UNAUTHORIZED;
Nubank.clientSecret = "yQPeLzoHuJzlMMSAjC-LgNUJdUecx8XO";
return Nubank;
}());
exports.Nubank = Nubank;