LeBonCoinBridge.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. class LeBonCoinBridge extends BridgeAbstract {
  3. const MAINTAINER = '16mhz';
  4. const NAME = 'LeBonCoin';
  5. const URI = 'https://www.leboncoin.fr/';
  6. const DESCRIPTION = 'Returns most recent results from LeBonCoin for a
  7. region, and optionally a category and a keyword .';
  8. const PARAMETERS = array(
  9. array(
  10. 'k' => array('name' => 'Mot Clé'),
  11. 'r' => array(
  12. 'name' => 'Région',
  13. 'type' => 'list',
  14. 'values' => array(
  15. 'Toute la France' => 'ile_de_france/occasions',
  16. 'Alsace' => 'alsace',
  17. 'Aquitaine' => 'aquitaine',
  18. 'Auvergne' => 'auvergne',
  19. 'Basse Normandie' => 'basse_normandie',
  20. 'Bourgogne' => 'bourgogne',
  21. 'Bretagne' => 'bretagne',
  22. 'Centre' => 'centre',
  23. 'Champagne Ardenne' => 'champagne_ardenne',
  24. 'Corse' => 'corse',
  25. 'Franche Comté' => 'franche_comte',
  26. 'Haute Normandie' => 'haute_normandie',
  27. 'Ile de France' => 'ile_de_france',
  28. 'Languedoc Roussillon' => 'languedoc_roussillon',
  29. 'Limousin' => 'limousin',
  30. 'Lorraine' => 'lorraine',
  31. 'Midi Pyrénées' => 'midi_pyrenees',
  32. 'Nord Pas De Calais' => 'nord_pas_de_calais',
  33. 'Pays de la Loire' => 'pays_de_la_loire',
  34. 'Picardie' => 'picardie',
  35. 'Poitou Charentes' => 'poitou_charentes',
  36. 'Provence Alpes Côte d\'Azur' => 'provence_alpes_cote_d_azur',
  37. 'Rhône-Alpes' => 'rhone_alpes',
  38. 'Guadeloupe' => 'guadeloupe',
  39. 'Martinique' => 'martinique',
  40. 'Guyane' => 'guyane',
  41. 'Réunion' => 'reunion'
  42. )
  43. ),
  44. 'c' => array(
  45. 'name' => 'Catégorie',
  46. 'type' => 'list',
  47. 'values' => array(
  48. 'TOUS' => '',
  49. 'EMPLOI' => '_emploi_',
  50. 'VEHICULES' => array(
  51. 'Tous' => '_vehicules_',
  52. 'Voitures' => 'voitures',
  53. 'Motos' => 'motos',
  54. 'Caravaning' => 'caravaning',
  55. 'Utilitaires' => 'utilitaires',
  56. 'Équipement Auto' => 'equipement_auto',
  57. 'Équipement Moto' => 'equipement_moto',
  58. 'Équipement Caravaning' => 'equipement_caravaning',
  59. 'Nautisme' => 'nautisme',
  60. 'Équipement Nautisme' => 'equipement_nautisme'
  61. ),
  62. 'IMMOBILIER' => array(
  63. 'Tous' => '_immobilier_',
  64. 'Ventes immobilières' => 'ventes_immobilieres',
  65. 'Locations' => 'locations',
  66. 'Colocations' => 'colocations',
  67. 'Bureaux & Commerces' => 'bureaux_commerces'
  68. ),
  69. 'VACANCES' => array(
  70. 'Tous' => '_vacances_',
  71. 'Location gîtes' => 'locations_gites',
  72. 'Chambres d\'hôtes' => 'chambres_d_hotes',
  73. 'Campings' => 'campings',
  74. 'Hôtels' => 'hotels',
  75. 'Hébergements insolites' => 'hebergements_insolites'
  76. ),
  77. 'MULTIMEDIA' => array(
  78. 'Tous' => '_multimedia_',
  79. 'Informatique' => 'informatique',
  80. 'Consoles & Jeux vidéo' => 'consoles_jeux_video',
  81. 'Image & Son' => 'image_son',
  82. 'Téléphonie' => 'telephonie'
  83. ),
  84. 'LOISIRS' => array(
  85. 'Tous' => '_loisirs_',
  86. 'DVD / Films' => 'dvd_films',
  87. 'CD / Musique' => 'cd_musique',
  88. 'Livres' => 'livres',
  89. 'Animaux' => 'animaux',
  90. 'Vélos' => 'velos',
  91. 'Sports & Hobbies' => 'sports_hobbies',
  92. 'Instruments de musique' => 'instruments_de_musique',
  93. 'Collection' => 'collection',
  94. 'Jeux & Jouets' => 'jeux_jouets',
  95. 'Vins & Gastronomie' => 'vins_gastronomie'
  96. ),
  97. 'MATÉRIEL PROFESSIONNEL' => array(
  98. 'Tous' => '_materiel_professionnel_',
  99. 'Matériel Agricole' => 'mateiel_agricole',
  100. 'Transport - Manutention' => 'transport_manutention',
  101. 'BTP - Chantier - Gros-œuvre' => 'btp_chantier_gros_oeuvre',
  102. 'Outillage - Matériaux 2nd-œuvre' => 'outillage_materiaux_2nd_oeuvre',
  103. 'Équipements Industriels' => 'equipement_industriels',
  104. 'Restauration - Hôtellerie' => 'restauration_hotellerie',
  105. 'Fournitures de Bureau' => 'fournitures_de_bureau',
  106. 'Commerces & Marchés' => 'commerces_marches',
  107. 'Matériel médical' => 'materiel_medical'
  108. ),
  109. 'SERVICES' => array(
  110. 'Tous' => '_services_',
  111. 'Prestations de services' => 'prestations_de_services',
  112. 'Billetterie' => 'billetterie',
  113. 'Évènements' => 'evenements',
  114. 'Cours particuliers' => 'cours_particuliers',
  115. 'Covoiturage' => 'covoiturage'
  116. ),
  117. 'MAISON' => array(
  118. 'Tous' => '_maison_',
  119. 'Ameublement' => 'ameublement',
  120. 'Électroménager' => 'electromenager',
  121. 'Arts de la table' => 'arts_de_la_table',
  122. 'Décoration' => 'decoration',
  123. 'Linge de maison' => 'linge_de_maison',
  124. 'Bricolage' => 'bricolage',
  125. 'Jardinage' => 'jardinage',
  126. 'Vêtements' => 'vetements',
  127. 'Chaussures' => 'chaussures',
  128. 'Accessoires & Bagagerie' => 'accessoires_bagagerie',
  129. 'Montres & Bijoux' => 'montres_bijoux',
  130. 'Équipement bébé' => 'equipement_bebe',
  131. 'Vêtements bébé' => 'vetements_bebe'
  132. ),
  133. 'AUTRES' => 'autres'
  134. )
  135. )
  136. )
  137. );
  138. public function collectData(){
  139. $category = $this->getInput('c');
  140. if(empty($category)) {
  141. $category = 'annonces';
  142. }
  143. $html = getSimpleHTMLDOM(self::URI
  144. . $category
  145. . '/offres/'
  146. . $this->getInput('r')
  147. . '/?f=a&th=1&q='
  148. . urlencode($this->getInput('k')))
  149. or returnServerError('Could not request LeBonCoin.');
  150. $list = $html->find('.tabsContent', 0);
  151. if($list === null) {
  152. return;
  153. }
  154. $tags = $list->find('li');
  155. foreach($tags as $element) {
  156. $element = $element->find('a', 0);
  157. $item = array();
  158. $item['uri'] = $element->href;
  159. $title = html_entity_decode($element->getAttribute('title'));
  160. $content_image = $element->find('div.item_image', 0)->find('.lazyload', 0);
  161. if($content_image !== null) {
  162. $content = '<img src="' . $content_image->getAttribute('data-imgsrc') . '" alt="thumbnail">';
  163. } else {
  164. $content = '';
  165. }
  166. $date = $element->find('aside.item_absolute', 0)->find('p.item_sup', 0);
  167. $detailsList = $element->find('section.item_infos', 0);
  168. for($i = 0; $i <= 1; $i++) $content .= $detailsList->find('p.item_supp', $i)->plaintext;
  169. $price = $detailsList->find('h3.item_price', 0);
  170. $content .= $price === null ? '' : $price->plaintext;
  171. $item['title'] = $title;
  172. $item['content'] = $content . $date;
  173. $this->items[] = $item;
  174. }
  175. }
  176. }