summaryrefslogtreecommitdiff
path: root/bridges/LeBonCoinBridge.php
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/LeBonCoinBridge.php')
-rw-r--r--bridges/LeBonCoinBridge.php222
1 files changed, 222 insertions, 0 deletions
diff --git a/bridges/LeBonCoinBridge.php b/bridges/LeBonCoinBridge.php
new file mode 100644
index 0000000..927b43e
--- /dev/null
+++ b/bridges/LeBonCoinBridge.php
@@ -0,0 +1,222 @@
+<?php
+class LeBonCoinBridge extends BridgeAbstract {
+
+ const MAINTAINER = 'jacknumber';
+ const NAME = 'LeBonCoin';
+ const URI = 'https://www.leboncoin.fr/';
+ const DESCRIPTION = 'Returns most recent results from LeBonCoin';
+
+ const PARAMETERS = array(
+ array(
+ 'k' => array('name' => 'Mot Clé'),
+ 'r' => array(
+ 'name' => 'Région',
+ 'type' => 'list',
+ 'values' => array(
+ '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(
+ 'Toutes catégories' => '',
+ 'EMPLOI' => array(
+ 'Emploi et recrutement' => '71',
+ 'Offres d\'emploi et jobs' => '33'
+ ),
+ 'VEHICULES' => array(
+ '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' => '8',
+ 'Ventes immobilières' => '9',
+ 'Locations' => '10',
+ 'Colocations' => '11',
+ 'Bureaux & Commerces' => '13'
+ ),
+ 'VACANCES' => array(
+ 'Tous' => '66',
+ 'Locations & Gîtes' => '12',
+ 'Chambres d\'hôtes' => '67',
+ 'Campings' => '68',
+ 'Hôtels' => '69',
+ 'Hébergements insolites' => '70'
+ ),
+ 'MULTIMEDIA' => array(
+ 'Tous' => '14',
+ 'Informatique' => '15',
+ 'Consoles & Jeux vidéo' => '43',
+ 'Image & Son' => '16',
+ 'Téléphonie' => '17'
+ ),
+ 'LOISIRS' => array(
+ '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'
+ ),
+ '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' => '31',
+ 'Prestations de services' => '34',
+ 'Billetterie' => '35',
+ 'Evénements' => '49',
+ 'Cours particuliers' => '36',
+ 'Covoiturage' => '65'
+ ),
+ 'MAISON' => array(
+ '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' => '37'
+ )
+ ),
+ 'o' => array(
+ 'name' => 'Vendeur',
+ 'type' => 'list',
+ 'values' => array(
+ 'Tous' => '',
+ 'Particuliers' => 'private',
+ 'Professionnels' => 'pro',
+ )
+ )
+ )
+ );
+
+ public function collectData(){
+
+ $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 = getContents($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.');
+ }
+
+ $clean_match = str_replace(
+ array('</script>', '<script>window.FLUX_STATE = '),
+ array('', ''),
+ $matches[0]
+ );
+ $json = json_decode($clean_match);
+
+ if($json->adSearch->data->total === 0) {
+ return;
+ }
+
+ 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;
+
+ if(isset($element->location->city)) {
+
+ $item['city'] = $element->location->city;
+ $item['content'] .= ' -- ' . $element->location->city;
+
+ }
+
+ 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(isset($element->images->urls)) {
+
+ $item['thumbnail'] = $element->images->thumb_url;
+ $item['enclosures'] = array();
+
+ foreach($element->images->urls as $image) {
+ $item['enclosures'][] = $image;
+ }
+
+ }
+
+ $this->items[] = $item;
+ }
+ }
+}