您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
lbc++general
// ==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(); // } });