LeBonCoinBridge.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. class LeBonCoinBridge extends BridgeAbstract {
  3. const MAINTAINER = 'jacknumber';
  4. const NAME = 'LeBonCoin';
  5. const URI = 'https://www.leboncoin.fr/';
  6. const DESCRIPTION = 'Returns most recent results from LeBonCoin';
  7. const PARAMETERS = array(
  8. array(
  9. 'k' => array('name' => 'Mot Clé'),
  10. 'r' => array(
  11. 'name' => 'Région',
  12. 'type' => 'list',
  13. 'values' => array(
  14. 'Toute la France' => '',
  15. 'Alsace' => '1',
  16. 'Aquitaine' => '2',
  17. 'Auvergne' => '3',
  18. 'Basse Normandie' => '4',
  19. 'Bourgogne' => '5',
  20. 'Bretagne' => '6',
  21. 'Centre' => '7',
  22. 'Champagne Ardenne' => '8',
  23. 'Corse' => '9',
  24. 'Franche Comté' => '10',
  25. 'Haute Normandie' => '11',
  26. 'Ile de France' => '12',
  27. 'Languedoc Roussillon' => '13',
  28. 'Limousin' => '14',
  29. 'Lorraine' => '15',
  30. 'Midi Pyrénées' => '16',
  31. 'Nord Pas De Calais' => '17',
  32. 'Pays de la Loire' => '18',
  33. 'Picardie' => '19',
  34. 'Poitou Charentes' => '20',
  35. 'Provence Alpes Côte d\'Azur' => '21',
  36. 'Rhône-Alpes' => '22',
  37. 'Guadeloupe' => '23',
  38. 'Martinique' => '24',
  39. 'Guyane' => '25',
  40. 'Réunion' => '26'
  41. )
  42. ),
  43. 'cities' => array('name' => 'Ville'),
  44. 'c' => array(
  45. 'name' => 'Catégorie',
  46. 'type' => 'list',
  47. 'values' => array(
  48. 'Toutes catégories' => '',
  49. 'EMPLOI' => array(
  50. 'Emploi et recrutement' => '71',
  51. 'Offres d\'emploi et jobs' => '33'
  52. ),
  53. 'VEHICULES' => array(
  54. 'Tous' => '1',
  55. 'Voitures' => '2',
  56. 'Motos' => '3',
  57. 'Caravaning' => '4',
  58. 'Utilitaires' => '5',
  59. 'Equipement Auto' => '6',
  60. 'Equipement Moto' => '44',
  61. 'Equipement Caravaning' => '50',
  62. 'Nautisme' => '7',
  63. 'Equipement Nautisme' => '51'
  64. ),
  65. 'IMMOBILIER' => array(
  66. 'Tous' => '8',
  67. 'Ventes immobilières' => '9',
  68. 'Locations' => '10',
  69. 'Colocations' => '11',
  70. 'Bureaux & Commerces' => '13'
  71. ),
  72. 'VACANCES' => array(
  73. 'Tous' => '66',
  74. 'Locations & Gîtes' => '12',
  75. 'Chambres d\'hôtes' => '67',
  76. 'Campings' => '68',
  77. 'Hôtels' => '69',
  78. 'Hébergements insolites' => '70'
  79. ),
  80. 'MULTIMEDIA' => array(
  81. 'Tous' => '14',
  82. 'Informatique' => '15',
  83. 'Consoles & Jeux vidéo' => '43',
  84. 'Image & Son' => '16',
  85. 'Téléphonie' => '17'
  86. ),
  87. 'LOISIRS' => array(
  88. 'Tous' => '24',
  89. 'DVD / Films' => '25',
  90. 'CD / Musique' => '26',
  91. 'Livres' => '27',
  92. 'Animaux' => '28',
  93. 'Vélos' => '55',
  94. 'Sports & Hobbies' => '29',
  95. 'Instruments de musique' => '30',
  96. 'Collection' => '40',
  97. 'Jeux & Jouets' => '41',
  98. 'Vins & Gastronomie' => '48'
  99. ),
  100. 'MATERIEL PROFESSIONNEL' => array(
  101. 'Tous' => '56',
  102. 'Matériel Agricole' => '57',
  103. 'Transport - Manutention' => '58',
  104. 'BTP - Chantier Gros-oeuvre' => '59',
  105. 'Outillage - Matériaux 2nd-oeuvre' => '60',
  106. 'Équipements Industriels' => '32',
  107. 'Restauration - Hôtellerie' => '61',
  108. 'Fournitures de Bureau' => '62',
  109. 'Commerces & Marchés' => '63',
  110. 'Matériel Médical' => '64'
  111. ),
  112. 'SERVICES' => array(
  113. 'Tous' => '31',
  114. 'Prestations de services' => '34',
  115. 'Billetterie' => '35',
  116. 'Evénements' => '49',
  117. 'Cours particuliers' => '36',
  118. 'Covoiturage' => '65'
  119. ),
  120. 'MAISON' => array(
  121. 'Tous' => '18',
  122. 'Ameublement' => '19',
  123. 'Electroménager' => '20',
  124. 'Arts de la table' => '45',
  125. 'Décoration' => '39',
  126. 'Linge de maison' => '46',
  127. 'Bricolage' => '21',
  128. 'Jardinage' => '52',
  129. 'Vêtements' => '22',
  130. 'Chaussures' => '53',
  131. 'Accessoires & Bagagerie' => '47',
  132. 'Montres & Bijoux' => '42',
  133. 'Equipement bébé' => '23',
  134. 'Vêtements bébé' => '54',
  135. ),
  136. 'AUTRES' => '37'
  137. )
  138. ),
  139. 'o' => array(
  140. 'name' => 'Vendeur',
  141. 'type' => 'list',
  142. 'values' => array(
  143. 'Tous' => '',
  144. 'Particuliers' => 'private',
  145. 'Professionnels' => 'pro',
  146. )
  147. )
  148. )
  149. );
  150. public function collectData(){
  151. $params = array(
  152. 'text' => $this->getInput('k'),
  153. 'region' => $this->getInput('r'),
  154. 'cities' => $this->getInput('cities'),
  155. 'category' => $this->getInput('c'),
  156. 'owner_type' => $this->getInput('o'),
  157. );
  158. $url = self::URI . 'recherche/?' . http_build_query($params);
  159. $html = getContents($url)
  160. or returnServerError('Could not request LeBonCoin. Tried: ' . $url);
  161. if(!preg_match('/^<script>window.FLUX_STATE[^\r\n]*/m', $html, $matches)) {
  162. returnServerError('Could not parse JSON in page content.');
  163. }
  164. $clean_match = str_replace(
  165. array('</script>', '<script>window.FLUX_STATE = '),
  166. array('', ''),
  167. $matches[0]
  168. );
  169. $json = json_decode($clean_match);
  170. if($json->adSearch->data->total === 0) {
  171. return;
  172. }
  173. foreach($json->adSearch->data->ads as $element) {
  174. $item['title'] = $element->subject;
  175. $item['content'] = $element->body;
  176. $item['date'] = $element->index_date;
  177. $item['timestamp'] = strtotime($element->index_date);
  178. $item['uri'] = $element->url;
  179. $item['ad_type'] = $element->ad_type;
  180. $item['author'] = $element->owner->name;
  181. if(isset($element->location->city)) {
  182. $item['city'] = $element->location->city;
  183. $item['content'] .= ' -- ' . $element->location->city;
  184. }
  185. if(isset($element->location->zipcode)) {
  186. $item['zipcode'] = $element->location->zipcode;
  187. }
  188. if(isset($element->price)) {
  189. $item['price'] = $element->price[0];
  190. $item['content'] .= ' -- ' . current($element->price) . '€';
  191. }
  192. if(isset($element->images->urls)) {
  193. $item['thumbnail'] = $element->images->thumb_url;
  194. $item['enclosures'] = array();
  195. foreach($element->images->urls as $image) {
  196. $item['enclosures'][] = $image;
  197. }
  198. }
  199. $this->items[] = $item;
  200. }
  201. }
  202. }