- // ==UserScript==
- // @name LeBonCoin plus plus General
- // @namespace lbc_general
- // @include https://www.leboncoin.fr/*
- // @version 1.0
- // @grant GM_xmlhttpRequest
- // @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js
- // @description lbc++general
-
- // ==/UserScript==
-
- this.$ = this.$$$ = jQuery.noConflict(true);
-
-
- // if($( "#searcharea option:selected" ).text().indexOf('Côte') !== -1) {
- // var onlyAddInfo = true;
- // } else {
- // var onlyAddInfo = false;
- // }
-
- $(function() {
- console.log( "LBC++ loading..." );
-
- var googleApiKey = "AIzaSyCHSc3xuyTzEa2fJfspmoibJduKa1iNmVs";
- var destCity = ["6 allée des clairs soleils, 21490 Ruffey-lès-Echirey, France", ""];
- // http://atlas.cosmosia.com/
- // var postalCodes = ["21121", "21120", "21240", "21370", "21380", "21490", "21850", "21800", "21560", "21110", "21600", "21300", "21910", "21220", "21160", "21410", "21640", "21540", "21470", "21310", "21270"];
-
-
- function getDistances(place, el, cityEl, dest, cityName) {
- // console.log("getting: "+ place.city);
- // transit: https://developers.google.com/maps/documentation/distance-matrix/intro?hl=fr#travel_modes
- var request = "https://maps.googleapis.com/maps/api/distancematrix/json?origins="+place.city+"&destinations="+dest+"&mode=driving&sensor=false&key="+googleApiKey;
-
- GM_xmlhttpRequest({
- method: "GET",
- url: request,
- onload: function(result) {
- var res = $.parseJSON(result.response);
- var status = res.rows[0].elements[0].status;
-
- if(status === "OK") {
-
- var duration = res.rows[0].elements[0].duration.text;
- var distance = res.rows[0].elements[0].distance.text;
-
- var infosAdd = distance+ ', ' +duration;
- var pBlock = '<p class="item_supp">'+cityName+': '+infosAdd+'</p>';
- cityEl.after(pBlock);
-
- }
- }
- });
- }
- function parsePageDom() {
- var offers = $('.tabsContent ul li');
- $.each(offers, function(i, el){
- // add target blank to a link
- // console.log('el', $(el).find('a').attr("target","_blank"));
- var href = $(el).find('a').attr('href');
-
- $(el).find('a').attr("target","_blank");
-
- var ctn = $(el).find('.item_price');
- ctn.prev().prev().append('<p class="item_supp loading" content=""><strong>Loading values...</strong></p>');
-
-
- requestPagesBis(href, el);
-
- // change pro/private container style
- var isProContainer = ($(el).find('.ispro').length !== 0);
- if(isProContainer) {
- $(el).css('opacity', '0.8').css('background', '#ddd');
- }
- if(!isProContainer && $(el).find('.lbcppheader').length === 0) {
- $(el).css('border', '1px solid #aaa');
- }
- // get city name to retrieve distance and duration
- var cityEl = $(el).find('.item_infos .item_supp:eq(1)');
- var cityTxt = $.trim(cityEl.text());
- var cityParsing = cityTxt.replace(/\r\n/g, "\n").split("\n");
- var place = { "city" : cityParsing[0], "departement" : cityParsing[cityParsing.length-1].trim() };
- getDistances(place, el, cityEl, destCity[0], "Maison");
- getDistances(place, el, cityEl, destCity[1], "beaune");
- });
- }
-
-
- function requestPagesBis(requestUrl, container, i) {
- // console.log("Requesting" +requestUrl +"...");
-
- // window.open(requests[i].request);
- // console.log("["+i+"] - Requesting lbc page ("+requests[i].request+") with "+requests[i].postalCodes.length+" postal codes...");
- GM_xmlhttpRequest({
- method: "GET",
- url: requestUrl,
- onload: function(result) {
- var resx = {};
- // console.log("result", result);
- resx.brand = $(result.response).find('.value[itemprop="brand"]').text();
- resx.model = $(result.response).find('.value[itemprop="model"]').text();
- resx.releaseDate = $(result.response).find('.value[itemprop="releaseDate"]').text().trim();
-
- // console.log(brand.text());
-
- var a = $(result.response).find('.line');
-
- $.each(a, function(i, el){
- // console.log('el', $(el).find('.property').text())
- // if( $(el).find('.property').text() == "Année-modèle" ) {
- // var annemodele = $(el).find('.value').text();
- // }
-
- if( $(el).find('.property').text() == "Kilométrage" ) {
- resx.km = $(el).find('.value').text();
- }
- if( $(el).find('.property').text() == "Carburant" ) {
- resx.carbu = $(el).find('.value').text();
- }
- if( $(el).find('.property').text() == "Boîte de vitesse" ) {
- resx.boite = $(el).find('.value').text();
- }
-
- // console.log(brand, model, releaseDate, km, carbu, boite);
- });
- console.log($(container).find('.item_price').prev().prev());
- var ctn = $(container).find('.item_price');
- ctn.prev().prev().append('<p class="item_supp" content=""> </p>');
- ctn.prev().prev().append('<p class="item_supp" content="">Kilométrage:<b>'+resx.km+'</b></p>');
- ctn.prev().prev().append('<p class="item_supp" content="">Année:<b>'+resx.releaseDate+'</b></p>');
- ctn.prev().prev().append('<p class="item_supp" content="">Marque:'+resx.brand+'</p>');
- ctn.prev().prev().append('<p class="item_supp" content="">Modèle:'+resx.model+'</p>');
- ctn.prev().prev().append('<p class="item_supp" content=""> </p>');
- ctn.prev().prev().append('<p class="item_supp" content="">Carburant:'+resx.carbu+'</p>');
- ctn.prev().prev().append('<p class="item_supp" content="">boite:'+resx.boite+'</p>');
- $(container).find('.loading').remove();
- // if(i === requests.length-1) {
- // // parsePageDom();
- // }
- }
- });
-
- }
-
- // return container as dom el
- function cleanupPage() {
- $('body').find('.information-immo').empty();
- $('body').find('.pagination').empty();
- $('body').find('.tabsContent').empty();
- $('body').find('.tabsContent').append('<ul id="lbcpp"><li><a class="list_item clearfix lbcppheader"><section class="item_infos"><h2 class="item_title">LBC PP</h2></section></a></li></ul>');
-
- $('.grid-2-1:eq(1)').after('<br />'+postalCodes.join(", "));
- var container = $('body').find('.tabsContent ul');
- return container;
- }
- function getDomBlock(postalCodes, requestLink, numberOfEls) {
- return '<li><a target="_blank" href="'+requestLink+'" class="list_item clearfix lbcppheader"><section class="item_infos"><h2 class="item_title">'+postalCodes.join(", ")+' - ('+numberOfEls+')</h2></section></a></li>';
- }
- // return requests as array
- function buildRequest() {
- var requests = [];
- var host = location.origin+location.pathname+'?location=';
- //var host = 'https://www.leboncoin.fr/ventes_immobilieres/offres/bourgogne/?location=';
- var pcString = 'Toutes%20les%20communes%20';
- var and = '%2C';
- // var closeReq = '&parrot=0&ret=1';
- var uriArguments = window.location.search.replace('?', '&');
- console.log(uriArguments);
-
- var PostalCodeBy3 = [];
- var pcList = JSON.stringify(postalCodes);
- var pcList = JSON.parse(pcList);
- while (pcList.length > 0) {
- var splittedPC = pcList.splice(0, 3);
- PostalCodeBy3.push(splittedPC);
- }
-
- for (var i = 0; i < PostalCodeBy3.length; i++) {
- var request = host;
- for (var j = 0; j < PostalCodeBy3[i].length; j++) {
- var pc = PostalCodeBy3[i][j];
- if (j !== PostalCodeBy3[i].length-1) {
- var str = pcString + pc + and;
- var request = request.concat(str);
- } else {
- var str = pcString + pc + uriArguments;
- var request = request.concat(str);
- requests.push({"request":request, "postalCodes": PostalCodeBy3[i]});
- }
- }
- }
- return requests;
- }
-
- function requestPages(requests, container, i) {
- console.log("Requesting" +requests.length +" pages, with at least 3 postal codes...");
-
- // window.open(requests[i].request);
- console.log("["+i+"] - Requesting lbc page ("+requests[i].request+") with "+requests[i].postalCodes.length+" postal codes...");
- GM_xmlhttpRequest({
- method: "GET",
- url: requests[i].request,
- onload: function(result) {
- var els = $(result.response).find('.tabsContent ul li');
- container.append(getDomBlock(requests[i].postalCodes, requests[i].request, els.length));
- container.append(els);
-
- if(i === requests.length-1) {
- parsePageDom();
- }
- }
- });
-
- }
-
- // Process...
-
- var isPlaceFieldEmpty = $('.nude') === null || $('.location').length === 0;
-
- // console.log(onlyAddInfo);
- // if(isPlaceFieldEmpty && !onlyAddInfo) {
- // var requests = buildRequest();
- // var container = cleanupPage();
-
- // setTimeout(function() {
- // for(var i=0; i<requests.length; i++) {
- // requestPages(requests, container, i);
- // }
- // }, 500);
- // } else {
- // console.log('pc or city field not empty: aborting script loading...');
- // }
-
- // if(onlyAddInfo) {
- parsePageDom();
- // }
-
- });