Skip to content

Instantly share code, notes, and snippets.

@danilopopeye
Last active January 19, 2017 19:32
Show Gist options
  • Save danilopopeye/4b83b6a91caa29820e31c448b5680822 to your computer and use it in GitHub Desktop.
Save danilopopeye/4b83b6a91caa29820e31c448b5680822 to your computer and use it in GitHub Desktop.
Nubank to CSV

Nubank2ynab

Exporte as transações do seu cartão Nubank para CSV no formato do You Need A Budget.

Tutorial

  1. Crie um bookmarklet com o snipet que está no final da página
  2. Acesse a página Histórico: https://conta.nubank.com.br/#/transactions
  3. Clique no bookmarklet na barra de favoritos
  4. O download do arquivo sodexo_{últimos 4 digitos}.csv deve ter sido iniciado
  5. Profit! 🌟
javascript:(function(d,u,s){s=d.createElement('script');s.type='text/javascript';s.charset='utf-8';s.src=u;d.body.appendChild(s);})(document,'https://cdn.rawgit.com/danilopopeye/4b83b6a91caa29820e31c448b5680822/raw/ab48f564471138cde01be16cc05063577f4289a1/nubank2csv.js')
// Nubank transaction element
// <div class="event-card transaction">
// <span class="category">eletrônicos</span>
// <h4 class="merchant">Google Play</h4>
// <div class="amount">R$ 6,66</div>
// <span class="tags">
// <span class="tag">android</span>
// <span class="tag">apps</span>
// </span>
// <span class="time">32 Janeiro</span>
// </div>
(function($) {
'use strict';
var instance,
MONTHS = [ null, 'Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun',
'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez' ];
function Nubank2CSV() {
this.chargesElements = $('.transaction:visible');
}
Nubank2CSV.prototype = {
init: function() {
this.checkPage();
this.charges = this.parseCharges();
this.downloadFile();
},
checkPage: function() {
if (location.hash !== "#/transactions") {
alert('vá para a págian de transações e tente novamente!');
throw 'Nubank2CSV: wrong page';
}
},
parseCharges: function() {
var callback = _.bind(function(el) {
var charge = $(el);
return {
date: this.parseDate(charge),
payee: this.parsePayee(charge),
category: this.parseCategory(charge),
memo: this.parseMemo(charge),
outflow: this.parseOutflow(charge),
inflow: this.parseInflow(charge)
};
}, this);
return this.chargesElements.get().map(callback);
},
parseDate: function(charge) {
var text = charge.find('.time').text(),
values = text.trim().split(' '),
// TODO: find a way to stop guessing the year
year = (new Date()).getFullYear(),
month = MONTHS.indexOf(values[1]),
day = values[0];
return [day, month, year].join('/');
},
parsePayee: function(charge) {
return charge.find('.description').text();
},
parseCategory: function(charge) {
return charge.find('.title').text();
},
parseMemo: function(charge) {
var tags = charge.find('.tag').map(function(i, tag) {
return $(tag).text();
}).get();
return tags.join(' - ');
},
parseOutflow: function(charge) {
return this.parseValue(charge);
},
parseInflow: function(charge) {
return '';
},
parseValue: function(charge) {
return charge.find('.amount').text()
.replace(/R\$ /, '')
.replace(',', '.');
},
toCSV: function() {
var charges = this.charges.map(function(l) {
return [
l.date, l.payee, l.category, l.memo, l.outflow, l.inflow
].join(',');
});
charges.unshift('Date,Payee,Category,Memo,Outflow,Inflow');
return charges.join('\n');
},
filename: function() {
var filter = $('#timeChart .filter').text();
return ['Nubank2CSV ', filter, '.csv'].join('');
},
link: function() {
return '<a href="data:attachment/csv;base64,' + btoa(this.toCSV()) +
'" id="nubank2csv" target="_blank" download="' + this.filename() + '">Nubank2CSV</a>';
},
downloadFile: function() {
$('body').append(this.link());
var link = $('#nubank2csv').get(0);
// FIXME: phantomjs don't have the `#click` method
if (typeof link.click === 'function') {
// INFO: download only works through the native `click` API
link.click();
}
link.remove();
}
};
window.Nubank2CSV = Nubank2CSV;
var n = new Nubank2CSV();
n.init();
}(jQuery));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment