Skip to content

Instantly share code, notes, and snippets.

@kerphi
Last active March 29, 2019 11:25
Show Gist options
  • Save kerphi/5124367 to your computer and use it in GitHub Desktop.
Save kerphi/5124367 to your computer and use it in GitHub Desktop.
Script permettant de télécharger en ligne de commande une facture internet free (freebox) via du screen scraping
#!/usr/bin/env node
//
// Script permettant de télécharger en ligne de commande une facture internet free (freebox) via du screen scraping
// Dépendances : npm install request http-get jsdom jquery optimist
//
var fs = require('fs');
var u = require('url');
var request = require('request');
var http = require('http-get');
var jsdom = require('jsdom');
var jquery = require('jquery');
var optimist = require('optimist')
.usage('Récupération de facture free.fr\nUsage: $0 --login="0359248140" --pass="el43kd87" --date="Février 2013" --file="1302_internet_chucknoris.pdf"')
.demand('date').string('login')
.demand('file').alias('file', 'f').default('file', 'facture.pdf').string('login')
.demand('login').alias('login', 'l').string('login')
.demand('pass').alias('pass', 'p').string('login')
.describe('date', 'Date de la facture à récupérer')
.describe('file', 'Nom du fichier où sauvegarder la facture')
.describe('login', 'Identifiant free')
.describe('pass', 'Mot de passe free');
var argv = optimist.argv;
// show usage if --help option is used
if (argv.help) {
optimist.showHelp();
process.exit(0);
}
// cookies
var j = request.jar();
var request = request.defaults({jar:j});
var url = 'https://subscribe.free.fr/login/login.pl';
request.post(url,
{
form: {
login: argv.login,
pass: argv.pass,
ok: ''
}
},
function (error, response, body) {
assertError(error, 'Login error ' + response.statusCode);
if (response.statusCode != 302) {
process.stderr.write('Erreur de redirection après formulaire de connexion');
process.exit(1);
}
url = response.headers.location;
console.log('Téléchargement de ' + url);
var url_query = u.parse(url, true).query;
request.get(url, function (error, response, body) {
assertError(error, 'Erreur du chargement de la page après connexion (mauvais login ou mdp)');
url = 'https://adsl.free.fr/liste-factures.pl?id=' + url_query.id + '&idt=' + url_query.idt;
console.log('Téléchargement de ' + url);
request.get(url, function (error, response, body) {
assertError(error, 'Invoice list error');
jsdom.env({ html: body }, function (err, window) {
var $ = jquery.create(window);
// url du pdf de la facture
url = $('.mesfactures strong:contains("' + argv.date + '")').parent().parent().find('.btn_download').attr('href');
url = 'https://adsl.free.fr/' + url;
console.log('Téléchargement de ' + url);
var options = { url: url };
http.get(options, argv.file, function (error, result) {
if (error) {
console.error(error);
} else {
console.log('Facture free téléchargée ici : ' + result.file);
}
});
});
});
});
}
);
function assertError(error, msg) {
if (error) {
process.stderr.write(msg + ' [' + error + ']');
process.stderr.write('\n');
process.exit(1);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment