LeBonCoinBridge.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <?php
  2. class LeBonCoinBridge extends BridgeAbstract{
  3. public function loadMetadatas() {
  4. $this->maintainer = "16mhz";
  5. $this->name = "LeBonCoin";
  6. $this->uri = "http://www.leboncoin.fr";
  7. $this->description = "Returns most recent results from LeBonCoin for a region, and optionally a category and a keyword .";
  8. $this->update = "2016-05-02";
  9. $this->parameters[] =
  10. '[
  11. {
  12. "name" : "Mot Clé",
  13. "identifier" : "k"
  14. },
  15. {
  16. "name" : "Région",
  17. "identifier" : "r",
  18. "type" : "list",
  19. "values" : [
  20. {
  21. "name" : "Alsace",
  22. "value" : "alsace"
  23. },
  24. {
  25. "name" : "Aquitaine",
  26. "value" : "aquitaine"
  27. },
  28. {
  29. "name" : "Auvergne",
  30. "value" : "auvergne"
  31. },
  32. {
  33. "name" : "Basse Normandie",
  34. "value" : "basse_normandie"
  35. },
  36. {
  37. "name" : "Bourgogne",
  38. "value" : "bourgogne"
  39. },
  40. {
  41. "name" : "Bretagne",
  42. "value" : "bretagne"
  43. },
  44. {
  45. "name" : "Centre",
  46. "value" : "centre"
  47. },
  48. {
  49. "name" : "Champagne Ardenne",
  50. "value" : "champagne_ardenne"
  51. },
  52. {
  53. "name" : "Corse",
  54. "value" : "corse"
  55. },
  56. {
  57. "name" : "Franche Comté",
  58. "value" : "franche_comte"
  59. },
  60. {
  61. "name" : "Haute Normandie",
  62. "value" : "haute_normandie"
  63. },
  64. {
  65. "name" : "Ile de France",
  66. "value" : "ile_de_france"
  67. },
  68. {
  69. "name" : "Languedoc Roussillon",
  70. "value" : "languedoc_roussillon"
  71. },
  72. {
  73. "name" : "Limousin",
  74. "value" : "limousin"
  75. },
  76. {
  77. "name" : "Lorraine",
  78. "value" : "lorraine"
  79. },
  80. {
  81. "name" : "Midi Pyrénées",
  82. "value" : "midi_pyrenees"
  83. },
  84. {
  85. "name" : "Nord Pas De Calais",
  86. "value" : "nord_pas_de_calais"
  87. },
  88. {
  89. "name" : "Pays de la Loire",
  90. "value" : "pays_de_la_loire"
  91. },
  92. {
  93. "name" : "Picardie",
  94. "value" : "picardie"
  95. },
  96. {
  97. "name" : "Poitou Charentes",
  98. "value" : "poitou_charentes"
  99. },
  100. {
  101. "name" : "Provence Alpes Côte d\'Azur",
  102. "value" : "provence_alpes_cote_d_azur"
  103. },
  104. {
  105. "name" : "Rhône-Alpes",
  106. "value" : "rhone_alpes"
  107. },
  108. {
  109. "name" : "Guadeloupe",
  110. "value" : "guadeloupe"
  111. },
  112. {
  113. "name" : "Martinique",
  114. "value" : "martinique"
  115. },
  116. {
  117. "name" : "Guyane",
  118. "value" : "guyane"
  119. },
  120. {
  121. "name" : "Réunion",
  122. "value" : "reunion"
  123. }
  124. ]
  125. },
  126. {
  127. "name" : "Catégorie",
  128. "identifier" : "c",
  129. "type" : "list",
  130. "values" : [
  131. { "name" : "---- Select ----", "value" : "" },
  132. { "name" : "", "value" : "" },
  133. { "name" : "EMPLOI", "value" : "_emploi_" },
  134. { "name" : "", "value" : "" },
  135. { "name" : "VEHICULES", "value" : "_vehicules_" },
  136. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Voitures", "value" : "voitures" },
  137. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Motos", "value" : "motos" },
  138. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Caravaning", "value" : "caravaning" },
  139. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Utilitaires", "value" : "utilitaires" },
  140. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Equipement Auto", "value" : "equipement_auto" },
  141. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Equipement Moto", "value" : "equipement_moto" },
  142. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Equipement Caravaning", "value" : "equipement_caravaning" },
  143. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Nautisme", "value" : "nautisme" },
  144. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Equipement Nautisme", "value" : "equipement_nautisme" },
  145. { "name" : "", "value" : "" },
  146. { "name" : "IMMOBILIER", "value" : "_immobilier_" },
  147. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Ventes immobilieres", "value" : "ventes_immobilieres" },
  148. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Locations", "value" : "locations" },
  149. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Colocations", "value" : "colocations" },
  150. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Bureaux &amp; Commerces", "value" : "bureaux_commerces" },
  151. { "name" : "", "value" : "" },
  152. { "name" : "VACANCES", "value" : "_vacances_" },
  153. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Locations gites", "value" : "locations_gites" },
  154. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Chambres d\'hôtes", "value" : "chambres_d_hotes" },
  155. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Campings", "value" : "campings" },
  156. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Hôtels", "value" : "hotels" },
  157. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Hébergements insolites", "value" : "hebergements_insolites" },
  158. { "name" : "", "value" : "" },
  159. { "name" : "MULTIMEDIA", "value" : "_multimedia_" },
  160. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Informatique", "value" : "informatique" },
  161. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Consoles & Jeux vidéo", "value" : "consoles_jeux_video" },
  162. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Image & Son", "value" : "image_son" },
  163. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Téléphonie", "value" : "telephonie" },
  164. { "name" : "", "value" : "" },
  165. { "name" : "LOISIRS", "value" : "_loisirs_" },
  166. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;DVD / Films", "value" : "dvd_films" },
  167. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;CD / Musique", "value" : "cd_musique" },
  168. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Livres", "value" : "livres" },
  169. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Animaux", "value" : "animaux" },
  170. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Vélos", "value" : "velos" },
  171. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Sports & Hobbies", "value" : "sports_hobbies" },
  172. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Instruments de musique", "value" : "instruments_de_musique" },
  173. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Collection", "value" : "collection" },
  174. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Jeux & Jouets", "value" : "jeux_jouets" },
  175. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Vins & Gastronomie", "value" : "vins_gastronomie" },
  176. { "name" : "", "value" : "" },
  177. { "name" : "MATERIEL PROFESSIONNEL", "value" : "_materiel_professionnel_" },
  178. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Materiel Agricole", "value" : "materiel_agricole" },
  179. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Transport - Manutention", "value" : "transport_manutention" },
  180. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;BTP - Chantier - Gros-oeuvre", "value" : "btp_chantier_gros_oeuvre" },
  181. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Outillage - Materiaux 2nd-oeuvre", "value" : "outillage_materiaux_2nd_oeuvre" },
  182. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Equipements Industriels", "value" : "equipements_industriels" },
  183. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Restauration - Hôtellerie", "value" : "restauration_hotellerie" },
  184. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Fournitures de Bureau", "value" : "fournitures_de_bureau" },
  185. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Commerces & Marchés", "value" : "commerces_marches" },
  186. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Matériel médical", "value" : "materiel_medical" },
  187. { "name" : "", "value" : "" },
  188. { "name" : "SERVICES", "value" : "_services_" },
  189. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Prestations de services", "value" : "prestations_de_services" },
  190. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Billetterie", "value" : "billetterie" },
  191. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Evénements", "value" : "evenements" },
  192. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Cours particuliers", "value" : "cours_particuliers" },
  193. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Covoiturage", "value" : "covoiturage" },
  194. { "name" : "", "value" : "" },
  195. { "name" : "MAISON", "value" : "_maison_" },
  196. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Ameublement", "value" : "ameublement" },
  197. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Electroménager", "value" : "electromenager" },
  198. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Arts de la table", "value" : "arts_de_la_table" },
  199. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Décoration", "value" : "decoration" },
  200. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Linge de maison", "value" : "linge_de_maison" },
  201. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Bricolage", "value" : "bricolage" },
  202. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Jardinage", "value" : "jardinage" },
  203. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Vêtements", "value" : "vetements" },
  204. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Chaussures", "value" : "chaussures" },
  205. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Accessoires & Bagagerie", "value" : "accessoires_bagagerie" },
  206. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Montres & Bijoux", "value" : "montres_bijoux" },
  207. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Equipement bébé", "value" : "equipement_bebe" },
  208. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Vêtements bébé", "value" : "vetements_bebe" },
  209. { "name" : "", "value" : "" },
  210. { "name" : "AUTRES", "value" : "autres" }
  211. ]
  212. }
  213. ]';
  214. }
  215. public function collectData(array $param){
  216. $html = '';
  217. if (empty($param['c'])) {
  218. $link = 'http://www.leboncoin.fr/annonces/offres/' . $param['r'] . '/?f=a&th=1&q=' . urlencode($param['k']);
  219. }
  220. else {
  221. $link = 'http://www.leboncoin.fr/' . $param['c'] . '/offres/' . $param['r'] . '/?f=a&th=1&q=' . urlencode($param['k']);
  222. }
  223. $html = $this->file_get_html($link) or $this->returnError('Could not request LeBonCoin.', 404);
  224. $list = $html->find('.tabsContent', 0);
  225. if($list === NULL) {
  226. return;
  227. }
  228. $tags = $list->find('li');
  229. foreach($tags as $element) {
  230. $element = $element->find('a', 0);
  231. $item = new \Item();
  232. $item->uri = $element->href;
  233. $title = html_entity_decode($element->getAttribute('title'));
  234. $content_image = $element->find('div.item_image', 0)->find('.lazyload', 0);
  235. if($content_image !== NULL) {
  236. $content = '<img src="' . $content_image->getAttribute('data-imgsrc') . '" alt="thumbnail">';
  237. } else {
  238. $content = "";
  239. }
  240. $date = $element->find('aside.item_absolute', 0)->find('p.item_sup', 0);
  241. $detailsList = $element->find('section.item_infos', 0);
  242. for($i = 0; $i <= 1; $i++) $content .= $detailsList->find('p.item_supp', $i)->plaintext;
  243. $price = $detailsList->find('h3.item_price', 0);
  244. $content .= $price === NULL ? '' : $price->plaintext;
  245. $item->title = $title;
  246. $item->content = $content . $date;
  247. $this->items[] = $item;
  248. }
  249. }
  250. public function getName(){
  251. return 'LeBonCoin';
  252. }
  253. public function getURI(){
  254. return 'http://www.leboncoin.fr';
  255. }
  256. public function getCacheDuration(){
  257. return 3600; // 1 hour
  258. }
  259. }