diff options
author | 2018-07-16 20:13:08 +0200 | |
---|---|---|
committer | 2018-07-16 20:13:08 +0200 | |
commit | 87fc9e915661adad323c552ea82a7dbc2b59dbaf (patch) | |
tree | 0a2bd95a0be563e4515887b16198f486ff1953c1 | |
parent | c7b0c9fd31aa5ce88dbf4d4a0fb7ca71bf8b7f46 (diff) | |
download | rss-bridge-87fc9e915661adad323c552ea82a7dbc2b59dbaf.tar.gz rss-bridge-87fc9e915661adad323c552ea82a7dbc2b59dbaf.tar.zst rss-bridge-87fc9e915661adad323c552ea82a7dbc2b59dbaf.zip |
fix LeBonCoin bridge (#747)
-rw-r--r-- | bridges/LeBonCoinBridge.php | 294 |
1 files changed, 163 insertions, 131 deletions
diff --git a/bridges/LeBonCoinBridge.php b/bridges/LeBonCoinBridge.php index bb89d612..8cfea7cb 100644 --- a/bridges/LeBonCoinBridge.php +++ b/bridges/LeBonCoinBridge.php @@ -1,11 +1,10 @@ <?php class LeBonCoinBridge extends BridgeAbstract { - const MAINTAINER = '16mhz'; + const MAINTAINER = 'jacknumber'; const NAME = 'LeBonCoin'; const URI = 'https://www.leboncoin.fr/'; - const DESCRIPTION = 'Returns most recent results from LeBonCoin for a -region, and optionally a category and a keyword .'; + const DESCRIPTION = 'Returns most recent results from LeBonCoin'; const PARAMETERS = array( array( @@ -14,125 +13,137 @@ region, and optionally a category and a keyword .'; 'name' => 'Région', 'type' => 'list', 'values' => array( - 'Toute la France' => 'ile_de_france/occasions', - 'Alsace' => 'alsace', - 'Aquitaine' => 'aquitaine', - 'Auvergne' => 'auvergne', - 'Basse Normandie' => 'basse_normandie', - 'Bourgogne' => 'bourgogne', - 'Bretagne' => 'bretagne', - 'Centre' => 'centre', - 'Champagne Ardenne' => 'champagne_ardenne', - 'Corse' => 'corse', - 'Franche Comté' => 'franche_comte', - 'Haute Normandie' => 'haute_normandie', - 'Ile de France' => 'ile_de_france', - 'Languedoc Roussillon' => 'languedoc_roussillon', - 'Limousin' => 'limousin', - 'Lorraine' => 'lorraine', - 'Midi Pyrénées' => 'midi_pyrenees', - 'Nord Pas De Calais' => 'nord_pas_de_calais', - 'Pays de la Loire' => 'pays_de_la_loire', - 'Picardie' => 'picardie', - 'Poitou Charentes' => 'poitou_charentes', - 'Provence Alpes Côte d\'Azur' => 'provence_alpes_cote_d_azur', - 'Rhône-Alpes' => 'rhone_alpes', - 'Guadeloupe' => 'guadeloupe', - 'Martinique' => 'martinique', - 'Guyane' => 'guyane', - 'Réunion' => 'reunion' + 'Toute la France' => '', + 'Alsace' => '1', + 'Aquitaine' => '2', + 'Auvergne' => '3', + 'Basse Normandie' => '4', + 'Bourgogne' => '5', + 'Bretagne' => '6', + 'Centre' => '7', + 'Champagne Ardenne' => '8', + 'Corse' => '9', + 'Franche Comté' => '10', + 'Haute Normandie' => '11', + 'Ile de France' => '12', + 'Languedoc Roussillon' => '13', + 'Limousin' => '14', + 'Lorraine' => '15', + 'Midi Pyrénées' => '16', + 'Nord Pas De Calais' => '17', + 'Pays de la Loire' => '18', + 'Picardie' => '19', + 'Poitou Charentes' => '20', + 'Provence Alpes Côte d\'Azur' => '21', + 'Rhône-Alpes' => '22', + 'Guadeloupe' => '23', + 'Martinique' => '24', + 'Guyane' => '25', + 'Réunion' => '26' ) ), 'c' => array( 'name' => 'Catégorie', 'type' => 'list', 'values' => array( - 'TOUS' => '', - 'EMPLOI' => '_emploi_', + 'Toutes catégories' => '', + 'EMPLOI' => array( + 'Emploi et recrutement' => '71', + 'Offres d\'emploi et jobs' => '33' + ), 'VEHICULES' => array( - 'Tous' => '_vehicules_', - 'Voitures' => 'voitures', - 'Motos' => 'motos', - 'Caravaning' => 'caravaning', - 'Utilitaires' => 'utilitaires', - 'Équipement Auto' => 'equipement_auto', - 'Équipement Moto' => 'equipement_moto', - 'Équipement Caravaning' => 'equipement_caravaning', - 'Nautisme' => 'nautisme', - 'Équipement Nautisme' => 'equipement_nautisme' + 'Tous' => '1', + 'Voitures' => '2', + 'Motos' => '3', + 'Caravaning' => '4', + 'Utilitaires' => '5', + 'Equipement Auto' => '6', + 'Equipement Moto' => '44', + 'Equipement Caravaning' => '50', + 'Nautisme' => '7', + 'Equipement Nautisme' => '51' ), 'IMMOBILIER' => array( - 'Tous' => '_immobilier_', - 'Ventes immobilières' => 'ventes_immobilieres', - 'Locations' => 'locations', - 'Colocations' => 'colocations', - 'Bureaux & Commerces' => 'bureaux_commerces' + 'Tous' => '8', + 'Ventes immobilières' => '9', + 'Locations' => '10', + 'Colocations' => '11', + 'Bureaux & Commerces' => '13' ), 'VACANCES' => array( - 'Tous' => '_vacances_', - 'Location gîtes' => 'locations_gites', - 'Chambres d\'hôtes' => 'chambres_d_hotes', - 'Campings' => 'campings', - 'Hôtels' => 'hotels', - 'Hébergements insolites' => 'hebergements_insolites' + 'Tous' => '66', + 'Locations & Gîtes' => '12', + 'Chambres d\'hôtes' => '67', + 'Campings' => '68', + 'Hôtels' => '69', + 'Hébergements insolites' => '70' ), 'MULTIMEDIA' => array( - 'Tous' => '_multimedia_', - 'Informatique' => 'informatique', - 'Consoles & Jeux vidéo' => 'consoles_jeux_video', - 'Image & Son' => 'image_son', - 'Téléphonie' => 'telephonie' + 'Tous' => '14', + 'Informatique' => '15', + 'Consoles & Jeux vidéo' => '43', + 'Image & Son' => '16', + 'Téléphonie' => '17' ), 'LOISIRS' => array( - 'Tous' => '_loisirs_', - 'DVD / Films' => 'dvd_films', - 'CD / Musique' => 'cd_musique', - 'Livres' => 'livres', - 'Animaux' => 'animaux', - 'Vélos' => 'velos', - 'Sports & Hobbies' => 'sports_hobbies', - 'Instruments de musique' => 'instruments_de_musique', - 'Collection' => 'collection', - 'Jeux & Jouets' => 'jeux_jouets', - 'Vins & Gastronomie' => 'vins_gastronomie' + 'Tous' => '24', + 'DVD / Films' => '25', + 'CD / Musique' => '26', + 'Livres' => '27', + 'Animaux' => '28', + 'Vélos' => '55', + 'Sports & Hobbies' => '29', + 'Instruments de musique' => '30', + 'Collection' => '40', + 'Jeux & Jouets' => '41', + 'Vins & Gastronomie' => '48' ), - 'MATÉRIEL PROFESSIONNEL' => array( - 'Tous' => '_materiel_professionnel_', - 'Matériel Agricole' => 'mateiel_agricole', - 'Transport - Manutention' => 'transport_manutention', - 'BTP - Chantier - Gros-œuvre' => 'btp_chantier_gros_oeuvre', - 'Outillage - Matériaux 2nd-œuvre' => 'outillage_materiaux_2nd_oeuvre', - 'Équipements Industriels' => 'equipement_industriels', - 'Restauration - Hôtellerie' => 'restauration_hotellerie', - 'Fournitures de Bureau' => 'fournitures_de_bureau', - 'Commerces & Marchés' => 'commerces_marches', - 'Matériel médical' => 'materiel_medical' + 'MATERIEL PROFESSIONNEL' => array( + 'Tous' => '56', + 'Matériel Agricole' => '57', + 'Transport - Manutention' => '58', + 'BTP - Chantier Gros-oeuvre' => '59', + 'Outillage - Matériaux 2nd-oeuvre' => '60', + 'Équipements Industriels' => '32', + 'Restauration - Hôtellerie' => '61', + 'Fournitures de Bureau' => '62', + 'Commerces & Marchés' => '63', + 'Matériel Médical' => '64' ), 'SERVICES' => array( - 'Tous' => '_services_', - 'Prestations de services' => 'prestations_de_services', - 'Billetterie' => 'billetterie', - 'Évènements' => 'evenements', - 'Cours particuliers' => 'cours_particuliers', - 'Covoiturage' => 'covoiturage' + 'Tous' => '31', + 'Prestations de services' => '34', + 'Billetterie' => '35', + 'Evénements' => '49', + 'Cours particuliers' => '36', + 'Covoiturage' => '65' ), 'MAISON' => array( - 'Tous' => '_maison_', - 'Ameublement' => 'ameublement', - 'Électroménager' => 'electromenager', - 'Arts de la table' => 'arts_de_la_table', - 'Décoration' => 'decoration', - 'Linge de maison' => 'linge_de_maison', - 'Bricolage' => 'bricolage', - 'Jardinage' => 'jardinage', - 'Vêtements' => 'vetements', - 'Chaussures' => 'chaussures', - 'Accessoires & Bagagerie' => 'accessoires_bagagerie', - 'Montres & Bijoux' => 'montres_bijoux', - 'Équipement bébé' => 'equipement_bebe', - 'Vêtements bébé' => 'vetements_bebe' + 'Tous' => '18', + 'Ameublement' => '19', + 'Electroménager' => '20', + 'Arts de la table' => '45', + 'Décoration' => '39', + 'Linge de maison' => '46', + 'Bricolage' => '21', + 'Jardinage' => '52', + 'Vêtements' => '22', + 'Chaussures' => '53', + 'Accessoires & Bagagerie' => '47', + 'Montres & Bijoux' => '42', + 'Equipement bébé' => '23', + 'Vêtements bébé' => '54', ), - 'AUTRES' => 'autres' + 'AUTRES' => '37' + ) + ), + 'o' => array( + 'name' => 'Vendeur', + 'type' => 'list', + 'values' => array( + 'Tous' => '', + 'Particuliers' => 'private', + 'Professionnels' => 'pro', ) ) ) @@ -140,50 +151,71 @@ region, and optionally a category and a keyword .'; public function collectData(){ - $category = $this->getInput('c'); - if(empty($category)) { - $category = 'annonces'; + $params = array( + 'text' => $this->getInput('k'), + 'region' => $this->getInput('r'), + 'category' => $this->getInput('c'), + 'owner_type' => $this->getInput('o'), + ); + + $url = self::URI . 'recherche/?' . http_build_query($params); + $html = file_get_contents($url) + or returnServerError('Could not request LeBonCoin. Tried: ' . $url); + + if(!preg_match('/^<script>window.FLUX_STATE[^\r\n]*/m', $html, $matches)) { + returnServerError('Could not parse JSON in page content.'); } - $html = getSimpleHTMLDOM(self::URI - . $category - . '/offres/' - . $this->getInput('r') - . '/?f=a&th=1&q=' - . urlencode($this->getInput('k'))) - or returnServerError('Could not request LeBonCoin.'); + $clean_match = str_replace( + array('</script>', '<script>window.FLUX_STATE = '), + array('', ''), + $matches[0] + ); + $json = json_decode($clean_match); - $list = $html->find('.tabsContent', 0); - if($list === null) { + if($json->adSearch->data->total === 0) { return; } - $tags = $list->find('li'); + foreach($json->adSearch->data->ads as $element) { + + $item['title'] = $element->subject; + $item['content'] = $element->body; + $item['date'] = $element->index_date; + $item['timestamp'] = strtotime($element->index_date); + $item['uri'] = $element->url; + $item['ad_type'] = $element->ad_type; + $item['author'] = $element->owner->name; - foreach($tags as $element) { + if(isset($element->location->city)) { - $element = $element->find('a', 0); + $item['city'] = $element->location->city; + $item['content'] .= ' -- ' . $element->location->city; - $item = array(); - $item['uri'] = $element->href; - $title = html_entity_decode($element->getAttribute('title')); - $content_image = $element->find('div.item_image', 0)->find('.lazyload', 0); + } + + if(isset($element->location->zipcode)) { + $item['zipcode'] = $element->location->zipcode; + } + + if(isset($element->price)) { + + $item['price'] = $element->price[0]; + $item['content'] .= ' -- ' . current($element->price) . '€'; - if($content_image !== null) { - $content = '<img src="' . $content_image->getAttribute('data-imgsrc') . '" alt="thumbnail">'; - } else { - $content = ''; } - $date = $element->find('aside.item_absolute', 0)->find('p.item_sup', 0); - $detailsList = $element->find('section.item_infos', 0); + if(isset($element->images->urls)) { + + $item['thumbnail'] = $element->images->thumb_url; + $item['enclosures'] = array(); - for($i = 0; $i <= 1; $i++) $content .= $detailsList->find('p.item_supp', $i)->plaintext; - $price = $detailsList->find('h3.item_price', 0); - $content .= $price === null ? '' : $price->plaintext; + foreach($element->images->urls as $image) { + $item['enclosures'][] = $image; + } + + } - $item['title'] = $title; - $item['content'] = $content . $date; $this->items[] = $item; } } |