aboutsummaryrefslogtreecommitdiff
path: root/bridges/LeBonCoinBridge.php
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/LeBonCoinBridge.php')
-rw-r--r--bridges/LeBonCoinBridge.php1064
1 files changed, 529 insertions, 535 deletions
diff --git a/bridges/LeBonCoinBridge.php b/bridges/LeBonCoinBridge.php
index 87389d18..62416b98 100644
--- a/bridges/LeBonCoinBridge.php
+++ b/bridges/LeBonCoinBridge.php
@@ -1,538 +1,532 @@
<?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(
- 'keywords' => array('name' => 'Mots-Clés'),
- 'region' => 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'
- )
- ),
- 'department' => array(
- 'name' => 'Département',
- 'type' => 'list',
- 'values' => array(
- '' => '',
- 'Ain' => '1',
- 'Aisne' => '2',
- 'Allier' => '3',
- 'Alpes-de-Haute-Provence' => '4',
- 'Hautes-Alpes' => '5',
- 'Alpes-Maritimes' => '6',
- 'Ardèche' => '7',
- 'Ardennes' => '8',
- 'Ariège' => '9',
- 'Aube' => '10',
- 'Aude' => '11',
- 'Aveyron' => '12',
- 'Bouches-du-Rhône' => '13',
- 'Calvados' => '14',
- 'Cantal' => '15',
- 'Charente' => '16',
- 'Charente-Maritime' => '17',
- 'Cher' => '18',
- 'Corrèze' => '19',
- 'Corse-du-Sud' => '2A',
- 'Haute-Corse' => '2B',
- 'Côte-d\'Or' => '21',
- 'Côtes-d\'Armor' => '22',
- 'Creuse' => '23',
- 'Dordogne' => '24',
- 'Doubs' => '25',
- 'Drôme' => '26',
- 'Eure' => '27',
- 'Eure-et-Loir' => '28',
- 'Finistère' => '29',
- 'Gard' => '30',
- 'Haute-Garonne' => '31',
- 'Gers' => '32',
- 'Gironde' => '33',
- 'Hérault' => '34',
- 'Ille-et-Vilaine' => '35',
- 'Indre' => '36',
- 'Indre-et-Loire' => '37',
- 'Isère' => '38',
- 'Jura' => '39',
- 'Landes' => '40',
- 'Loir-et-Cher' => '41',
- 'Loire' => '42',
- 'Haute-Loire' => '43',
- 'Loire-Atlantique' => '44',
- 'Loiret' => '45',
- 'Lot' => '46',
- 'Lot-et-Garonne' => '47',
- 'Lozère' => '48',
- 'Maine-et-Loire' => '49',
- 'Manche' => '50',
- 'Marne' => '51',
- 'Haute-Marne' => '52',
- 'Mayenne' => '53',
- 'Meurthe-et-Moselle' => '54',
- 'Meuse' => '55',
- 'Morbihan' => '56',
- 'Moselle' => '57',
- 'Nièvre' => '58',
- 'Nord' => '59',
- 'Oise' => '60',
- 'Orne' => '61',
- 'Pas-de-Calais' => '62',
- 'Puy-de-Dôme' => '63',
- 'Pyrénées-Atlantiques' => '64',
- 'Hautes-Pyrénées' => '65',
- 'Pyrénées-Orientales' => '66',
- 'Bas-Rhin' => '67',
- 'Haut-Rhin' => '68',
- 'Rhône' => '69',
- 'Haute-Saône' => '70',
- 'Saône-et-Loire' => '71',
- 'Sarthe' => '72',
- 'Savoie' => '73',
- 'Haute-Savoie' => '74',
- 'Paris' => '75',
- 'Seine-Maritime' => '76',
- 'Seine-et-Marne' => '77',
- 'Yvelines' => '78',
- 'Deux-Sèvres' => '79',
- 'Somme' => '80',
- 'Tarn' => '81',
- 'Tarn-et-Garonne' => '82',
- 'Var' => '83',
- 'Vaucluse' => '84',
- 'Vendée' => '85',
- 'Vienne' => '86',
- 'Haute-Vienne' => '87',
- 'Vosges' => '88',
- 'Yonne' => '89',
- 'Territoire de Belfort' => '90',
- 'Essonne' => '91',
- 'Hauts-de-Seine' => '92',
- 'Seine-Saint-Denis' => '93',
- 'Val-de-Marne' => '94',
- 'Val-d\'Oise' => '95'
- )
- ),
- 'cities' => array(
- 'name' => 'Villes',
- 'title' => 'Codes postaux séparés par des virgules'
- ),
- 'category' => array(
- 'name' => 'Catégorie',
- 'type' => 'list',
- 'values' => array(
- 'Toutes catégories' => '',
- 'EMPLOI' => array(
- 'Emploi et recrutement' => '71',
- 'Offres d\'emploi et jobs' => '33'
- ),
- 'VÉHICULES' => 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'
- ),
- 'MULTIMÉDIA' => 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'
- ),
- 'MATÉRIEL 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',
- 'Événements' => '49',
- 'Cours particuliers' => '36',
- 'Covoiturage' => '65'
- ),
- 'MAISON' => array(
- 'Tous' => '18',
- 'Ameublement' => '19',
- 'Électromé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',
- 'Équipement bébé' => '23',
- 'Vêtements bébé' => '54',
- ),
- 'AUTRES' => '37'
- )
- ),
- 'pricemin' => array(
- 'name' => 'Prix min',
- 'type' => 'number'
- ),
- 'pricemax' => array(
- 'name' => 'Prix max',
- 'type' => 'number'
- ),
- 'estate' => array(
- 'name' => 'Type de bien',
- 'type' => 'list',
- 'values' => array(
- '' => '',
- 'Maison' => '1',
- 'Appartement' => '2',
- 'Terrain' => '3',
- 'Parking' => '4',
- 'Autre' => '5'
- )
- ),
- 'roomsmin' => array(
- 'name' => 'Pièces min',
- 'type' => 'number'
- ),
- 'roomsmax' => array(
- 'name' => 'Pièces max',
- 'type' => 'number'
- ),
- 'squaremin' => array(
- 'name' => 'Surface min',
- 'type' => 'number'
- ),
- 'squaremax' => array(
- 'name' => 'Surface max',
- 'type' => 'number'
- ),
- 'mileagemin' => array(
- 'name' => 'Kilométrage min',
- 'type' => 'number'
- ),
- 'mileagemax' => array(
- 'name' => 'Kilométrage max',
- 'type' => 'number'
- ),
- 'yearmin' => array(
- 'name' => 'Année min',
- 'type' => 'number'
- ),
- 'yearmax' => array(
- 'name' => 'Année max',
- 'type' => 'number'
- ),
- 'cubiccapacitymin' => array(
- 'name' => 'Cylindrée min',
- 'type' => 'number'
- ),
- 'cubiccapacitymax' => array(
- 'name' => 'Cylindrée max',
- 'type' => 'number'
- ),
- 'fuel' => array(
- 'name' => 'Énergie',
- 'type' => 'list',
- 'values' => array(
- '' => '',
- 'Essence' => '1',
- 'Diesel' => '2',
- 'GPL' => '3',
- 'Électrique' => '4',
- 'Hybride' => '6',
- 'Autre' => '5'
- )
- ),
- 'owner' => array(
- 'name' => 'Vendeur',
- 'type' => 'list',
- 'values' => array(
- 'Tous' => '',
- 'Particuliers' => 'private',
- 'Professionnels' => 'pro'
- )
- )
- )
- );
-
- public static $LBC_API_KEY = 'ba0c2dad52b3ec';
-
- private function getRange($field, $range_min, $range_max){
-
- if(!is_null($range_min)
- && !is_null($range_max)
- && $range_min > $range_max) {
- returnClientError('Min-' . $field . ' must be lower than max-' . $field . '.');
- }
-
- if(!is_null($range_min)
- && is_null($range_max)) {
- returnClientError('Max-' . $field . ' is needed when min-' . $field . ' is setted (range).');
- }
-
- return array(
- 'min' => $range_min,
- 'max' => $range_max
- );
- }
-
- public function collectData(){
-
- $url = 'https://api.leboncoin.fr/api/adfinder/v1/search';
- $data = $this->buildRequestJson();
-
- $header = array(
- 'User-Agent: LBC;Android;10;SAMSUNG;phone;0aaaaaaaaaaaaaaa;wifi;8.24.3.8;152437;0',
- 'Content-Type: application/json',
- 'X-LBC-CC: 7',
- 'Accept: application/json,application/hal+json',
- 'Content-Length: ' . strlen($data),
- 'api_key: ' . self::$LBC_API_KEY
- );
-
- $opts = array(
- CURLOPT_CUSTOMREQUEST => 'POST',
- CURLOPT_POSTFIELDS => $data
-
- );
-
- $content = getContents($url, $header, $opts);
-
- $json = json_decode($content);
-
- if($json->total === 0) {
- return;
- }
-
- foreach($json->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;
- }
- }
-
- private function buildRequestJson() {
-
- $requestJson = new StdClass();
- $requestJson->owner_type = $this->getInput('owner');
- $requestJson->filters = new StdClass();
-
- $requestJson->filters->keywords = array(
- 'text' => $this->getInput('keywords')
- );
-
- if($this->getInput('region') != '') {
- $requestJson->filters->location['regions'] = array($this->getInput('region'));
- }
-
- if($this->getInput('department') != '') {
- $requestJson->filters->location['departments'] = array($this->getInput('department'));
- }
-
- if($this->getInput('cities') != '') {
-
- $requestJson->filters->location['city_zipcodes'] = array();
-
- foreach (explode(',', $this->getInput('cities')) as $zipcode) {
-
- $requestJson->filters->location['city_zipcodes'][] = array(
- 'zipcode' => trim($zipcode)
- );
- }
-
- }
-
- $requestJson->filters->category = array(
- 'id' => $this->getInput('category')
- );
-
- if($this->getInput('pricemin') != ''
- || $this->getInput('pricemax') != '') {
-
- $requestJson->filters->ranges->price = $this->getRange(
- 'price',
- $this->getInput('pricemin'),
- $this->getInput('pricemax')
- );
-
- }
-
- if($this->getInput('estate') != '') {
- $requestJson->filters->enums['real_estate_type'] = array($this->getInput('estate'));
- }
-
- if($this->getInput('roomsmin') != ''
- || $this->getInput('roomsmax') != '') {
-
- $requestJson->filters->ranges->rooms = $this->getRange(
- 'rooms',
- $this->getInput('roomsmin'),
- $this->getInput('roomsmax')
- );
-
- }
-
- if($this->getInput('squaremin') != ''
- || $this->getInput('squaremax') != '') {
-
- $requestJson->filters->ranges->square = $this->getRange(
- 'square',
- $this->getInput('squaremin'),
- $this->getInput('squaremax')
- );
-
- }
-
- if($this->getInput('mileagemin') != ''
- || $this->getInput('mileagemax') != '') {
-
- $requestJson->filters->ranges->mileage = $this->getRange(
- 'mileage',
- $this->getInput('mileagemin'),
- $this->getInput('mileagemax')
- );
-
- }
-
- if($this->getInput('yearmin') != ''
- || $this->getInput('yearmax') != '') {
-
- $requestJson->filters->ranges->regdate = $this->getRange(
- 'year',
- $this->getInput('yearmin'),
- $this->getInput('yearmax')
- );
-
- }
-
- if($this->getInput('cubiccapacitymin') != ''
- || $this->getInput('cubiccapacitymax') != '') {
-
- $requestJson->filters->ranges->cubic_capacity = $this->getRange(
- 'cubic_capacity',
- $this->getInput('cubiccapacitymin'),
- $this->getInput('cubiccapacitymax')
- );
-
- }
-
- if($this->getInput('fuel') != '') {
- $requestJson->filters->enums['fuel'] = array($this->getInput('fuel'));
- }
-
- $requestJson->limit = 30;
-
- return json_encode($requestJson);
-
- }
+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 = [
+ [
+ 'keywords' => ['name' => 'Mots-Clés'],
+ 'region' => [
+ 'name' => 'Région',
+ 'type' => 'list',
+ 'values' => [
+ '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'
+ ]
+ ],
+ 'department' => [
+ 'name' => 'Département',
+ 'type' => 'list',
+ 'values' => [
+ '' => '',
+ 'Ain' => '1',
+ 'Aisne' => '2',
+ 'Allier' => '3',
+ 'Alpes-de-Haute-Provence' => '4',
+ 'Hautes-Alpes' => '5',
+ 'Alpes-Maritimes' => '6',
+ 'Ardèche' => '7',
+ 'Ardennes' => '8',
+ 'Ariège' => '9',
+ 'Aube' => '10',
+ 'Aude' => '11',
+ 'Aveyron' => '12',
+ 'Bouches-du-Rhône' => '13',
+ 'Calvados' => '14',
+ 'Cantal' => '15',
+ 'Charente' => '16',
+ 'Charente-Maritime' => '17',
+ 'Cher' => '18',
+ 'Corrèze' => '19',
+ 'Corse-du-Sud' => '2A',
+ 'Haute-Corse' => '2B',
+ 'Côte-d\'Or' => '21',
+ 'Côtes-d\'Armor' => '22',
+ 'Creuse' => '23',
+ 'Dordogne' => '24',
+ 'Doubs' => '25',
+ 'Drôme' => '26',
+ 'Eure' => '27',
+ 'Eure-et-Loir' => '28',
+ 'Finistère' => '29',
+ 'Gard' => '30',
+ 'Haute-Garonne' => '31',
+ 'Gers' => '32',
+ 'Gironde' => '33',
+ 'Hérault' => '34',
+ 'Ille-et-Vilaine' => '35',
+ 'Indre' => '36',
+ 'Indre-et-Loire' => '37',
+ 'Isère' => '38',
+ 'Jura' => '39',
+ 'Landes' => '40',
+ 'Loir-et-Cher' => '41',
+ 'Loire' => '42',
+ 'Haute-Loire' => '43',
+ 'Loire-Atlantique' => '44',
+ 'Loiret' => '45',
+ 'Lot' => '46',
+ 'Lot-et-Garonne' => '47',
+ 'Lozère' => '48',
+ 'Maine-et-Loire' => '49',
+ 'Manche' => '50',
+ 'Marne' => '51',
+ 'Haute-Marne' => '52',
+ 'Mayenne' => '53',
+ 'Meurthe-et-Moselle' => '54',
+ 'Meuse' => '55',
+ 'Morbihan' => '56',
+ 'Moselle' => '57',
+ 'Nièvre' => '58',
+ 'Nord' => '59',
+ 'Oise' => '60',
+ 'Orne' => '61',
+ 'Pas-de-Calais' => '62',
+ 'Puy-de-Dôme' => '63',
+ 'Pyrénées-Atlantiques' => '64',
+ 'Hautes-Pyrénées' => '65',
+ 'Pyrénées-Orientales' => '66',
+ 'Bas-Rhin' => '67',
+ 'Haut-Rhin' => '68',
+ 'Rhône' => '69',
+ 'Haute-Saône' => '70',
+ 'Saône-et-Loire' => '71',
+ 'Sarthe' => '72',
+ 'Savoie' => '73',
+ 'Haute-Savoie' => '74',
+ 'Paris' => '75',
+ 'Seine-Maritime' => '76',
+ 'Seine-et-Marne' => '77',
+ 'Yvelines' => '78',
+ 'Deux-Sèvres' => '79',
+ 'Somme' => '80',
+ 'Tarn' => '81',
+ 'Tarn-et-Garonne' => '82',
+ 'Var' => '83',
+ 'Vaucluse' => '84',
+ 'Vendée' => '85',
+ 'Vienne' => '86',
+ 'Haute-Vienne' => '87',
+ 'Vosges' => '88',
+ 'Yonne' => '89',
+ 'Territoire de Belfort' => '90',
+ 'Essonne' => '91',
+ 'Hauts-de-Seine' => '92',
+ 'Seine-Saint-Denis' => '93',
+ 'Val-de-Marne' => '94',
+ 'Val-d\'Oise' => '95'
+ ]
+ ],
+ 'cities' => [
+ 'name' => 'Villes',
+ 'title' => 'Codes postaux séparés par des virgules'
+ ],
+ 'category' => [
+ 'name' => 'Catégorie',
+ 'type' => 'list',
+ 'values' => [
+ 'Toutes catégories' => '',
+ 'EMPLOI' => [
+ 'Emploi et recrutement' => '71',
+ 'Offres d\'emploi et jobs' => '33'
+ ],
+ 'VÉHICULES' => [
+ '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' => [
+ 'Tous' => '8',
+ 'Ventes immobilières' => '9',
+ 'Locations' => '10',
+ 'Colocations' => '11',
+ 'Bureaux & Commerces' => '13'
+ ],
+ 'VACANCES' => [
+ 'Tous' => '66',
+ 'Locations & Gîtes' => '12',
+ 'Chambres d\'hôtes' => '67',
+ 'Campings' => '68',
+ 'Hôtels' => '69',
+ 'Hébergements insolites' => '70'
+ ],
+ 'MULTIMÉDIA' => [
+ 'Tous' => '14',
+ 'Informatique' => '15',
+ 'Consoles & Jeux vidéo' => '43',
+ 'Image & Son' => '16',
+ 'Téléphonie' => '17'
+ ],
+ 'LOISIRS' => [
+ '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' => [
+ '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' => [
+ 'Tous' => '31',
+ 'Prestations de services' => '34',
+ 'Billetterie' => '35',
+ 'Événements' => '49',
+ 'Cours particuliers' => '36',
+ 'Covoiturage' => '65'
+ ],
+ 'MAISON' => [
+ 'Tous' => '18',
+ 'Ameublement' => '19',
+ 'Électromé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',
+ 'Équipement bébé' => '23',
+ 'Vêtements bébé' => '54',
+ ],
+ 'AUTRES' => '37'
+ ]
+ ],
+ 'pricemin' => [
+ 'name' => 'Prix min',
+ 'type' => 'number'
+ ],
+ 'pricemax' => [
+ 'name' => 'Prix max',
+ 'type' => 'number'
+ ],
+ 'estate' => [
+ 'name' => 'Type de bien',
+ 'type' => 'list',
+ 'values' => [
+ '' => '',
+ 'Maison' => '1',
+ 'Appartement' => '2',
+ 'Terrain' => '3',
+ 'Parking' => '4',
+ 'Autre' => '5'
+ ]
+ ],
+ 'roomsmin' => [
+ 'name' => 'Pièces min',
+ 'type' => 'number'
+ ],
+ 'roomsmax' => [
+ 'name' => 'Pièces max',
+ 'type' => 'number'
+ ],
+ 'squaremin' => [
+ 'name' => 'Surface min',
+ 'type' => 'number'
+ ],
+ 'squaremax' => [
+ 'name' => 'Surface max',
+ 'type' => 'number'
+ ],
+ 'mileagemin' => [
+ 'name' => 'Kilométrage min',
+ 'type' => 'number'
+ ],
+ 'mileagemax' => [
+ 'name' => 'Kilométrage max',
+ 'type' => 'number'
+ ],
+ 'yearmin' => [
+ 'name' => 'Année min',
+ 'type' => 'number'
+ ],
+ 'yearmax' => [
+ 'name' => 'Année max',
+ 'type' => 'number'
+ ],
+ 'cubiccapacitymin' => [
+ 'name' => 'Cylindrée min',
+ 'type' => 'number'
+ ],
+ 'cubiccapacitymax' => [
+ 'name' => 'Cylindrée max',
+ 'type' => 'number'
+ ],
+ 'fuel' => [
+ 'name' => 'Énergie',
+ 'type' => 'list',
+ 'values' => [
+ '' => '',
+ 'Essence' => '1',
+ 'Diesel' => '2',
+ 'GPL' => '3',
+ 'Électrique' => '4',
+ 'Hybride' => '6',
+ 'Autre' => '5'
+ ]
+ ],
+ 'owner' => [
+ 'name' => 'Vendeur',
+ 'type' => 'list',
+ 'values' => [
+ 'Tous' => '',
+ 'Particuliers' => 'private',
+ 'Professionnels' => 'pro'
+ ]
+ ]
+ ]
+ ];
+
+ public static $LBC_API_KEY = 'ba0c2dad52b3ec';
+
+ private function getRange($field, $range_min, $range_max)
+ {
+ if (
+ !is_null($range_min)
+ && !is_null($range_max)
+ && $range_min > $range_max
+ ) {
+ returnClientError('Min-' . $field . ' must be lower than max-' . $field . '.');
+ }
+
+ if (
+ !is_null($range_min)
+ && is_null($range_max)
+ ) {
+ returnClientError('Max-' . $field . ' is needed when min-' . $field . ' is setted (range).');
+ }
+
+ return [
+ 'min' => $range_min,
+ 'max' => $range_max
+ ];
+ }
+
+ public function collectData()
+ {
+ $url = 'https://api.leboncoin.fr/api/adfinder/v1/search';
+ $data = $this->buildRequestJson();
+
+ $header = [
+ 'User-Agent: LBC;Android;10;SAMSUNG;phone;0aaaaaaaaaaaaaaa;wifi;8.24.3.8;152437;0',
+ 'Content-Type: application/json',
+ 'X-LBC-CC: 7',
+ 'Accept: application/json,application/hal+json',
+ 'Content-Length: ' . strlen($data),
+ 'api_key: ' . self::$LBC_API_KEY
+ ];
+
+ $opts = [
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => $data
+
+ ];
+
+ $content = getContents($url, $header, $opts);
+
+ $json = json_decode($content);
+
+ if ($json->total === 0) {
+ return;
+ }
+
+ foreach ($json->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'] = [];
+
+ foreach ($element->images->urls as $image) {
+ $item['enclosures'][] = $image;
+ }
+ }
+
+ $this->items[] = $item;
+ }
+ }
+
+ private function buildRequestJson()
+ {
+ $requestJson = new StdClass();
+ $requestJson->owner_type = $this->getInput('owner');
+ $requestJson->filters = new StdClass();
+
+ $requestJson->filters->keywords = [
+ 'text' => $this->getInput('keywords')
+ ];
+
+ if ($this->getInput('region') != '') {
+ $requestJson->filters->location['regions'] = [$this->getInput('region')];
+ }
+
+ if ($this->getInput('department') != '') {
+ $requestJson->filters->location['departments'] = [$this->getInput('department')];
+ }
+
+ if ($this->getInput('cities') != '') {
+ $requestJson->filters->location['city_zipcodes'] = [];
+
+ foreach (explode(',', $this->getInput('cities')) as $zipcode) {
+ $requestJson->filters->location['city_zipcodes'][] = [
+ 'zipcode' => trim($zipcode)
+ ];
+ }
+ }
+
+ $requestJson->filters->category = [
+ 'id' => $this->getInput('category')
+ ];
+
+ if (
+ $this->getInput('pricemin') != ''
+ || $this->getInput('pricemax') != ''
+ ) {
+ $requestJson->filters->ranges->price = $this->getRange(
+ 'price',
+ $this->getInput('pricemin'),
+ $this->getInput('pricemax')
+ );
+ }
+
+ if ($this->getInput('estate') != '') {
+ $requestJson->filters->enums['real_estate_type'] = [$this->getInput('estate')];
+ }
+
+ if (
+ $this->getInput('roomsmin') != ''
+ || $this->getInput('roomsmax') != ''
+ ) {
+ $requestJson->filters->ranges->rooms = $this->getRange(
+ 'rooms',
+ $this->getInput('roomsmin'),
+ $this->getInput('roomsmax')
+ );
+ }
+
+ if (
+ $this->getInput('squaremin') != ''
+ || $this->getInput('squaremax') != ''
+ ) {
+ $requestJson->filters->ranges->square = $this->getRange(
+ 'square',
+ $this->getInput('squaremin'),
+ $this->getInput('squaremax')
+ );
+ }
+
+ if (
+ $this->getInput('mileagemin') != ''
+ || $this->getInput('mileagemax') != ''
+ ) {
+ $requestJson->filters->ranges->mileage = $this->getRange(
+ 'mileage',
+ $this->getInput('mileagemin'),
+ $this->getInput('mileagemax')
+ );
+ }
+
+ if (
+ $this->getInput('yearmin') != ''
+ || $this->getInput('yearmax') != ''
+ ) {
+ $requestJson->filters->ranges->regdate = $this->getRange(
+ 'year',
+ $this->getInput('yearmin'),
+ $this->getInput('yearmax')
+ );
+ }
+
+ if (
+ $this->getInput('cubiccapacitymin') != ''
+ || $this->getInput('cubiccapacitymax') != ''
+ ) {
+ $requestJson->filters->ranges->cubic_capacity = $this->getRange(
+ 'cubic_capacity',
+ $this->getInput('cubiccapacitymin'),
+ $this->getInput('cubiccapacitymax')
+ );
+ }
+
+ if ($this->getInput('fuel') != '') {
+ $requestJson->filters->enums['fuel'] = [$this->getInput('fuel')];
+ }
+
+ $requestJson->limit = 30;
+
+ return json_encode($requestJson);
+ }
}