UNPKG

@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
"use strict"; 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;