From 0622fe142b6ad3e5bbb95b0ab4d88dd0333579b3 Mon Sep 17 00:00:00 2001 From: sysadminstory Date: Thu, 1 Mar 2018 18:10:34 +0100 Subject: [PATCH] Dealabs : Added Groupes Feeds and Feed name is set according to parameters (#630) * [DealabsBride] Added Groupes Feeds --- bridges/DealabsBridge.php | 299 ++++++++++++++++++++++++++++---------- 1 file changed, 225 insertions(+), 74 deletions(-) diff --git a/bridges/DealabsBridge.php b/bridges/DealabsBridge.php index cd020171..d2cab2f0 100644 --- a/bridges/DealabsBridge.php +++ b/bridges/DealabsBridge.php @@ -4,50 +4,120 @@ class DealabsBridge extends BridgeAbstract { const URI = 'https://www.dealabs.com/'; const DESCRIPTION = 'Return the Dealabs search result using keywords'; const MAINTAINER = 'sysadminstory'; - const PARAMETERS = array( array ( - 'q' => array( - 'name' => 'Mot(s) clé(s)', - 'type' => 'text', - 'required' => true + const PARAMETERS = array( + 'Recherche par Mot(s) clé(s)' => array ( + 'q' => array( + 'name' => 'Mot(s) clé(s)', + 'type' => 'text', + 'required' => true + ), + 'hide_expired' => array( + 'name' => 'Masquer les éléments expirés', + 'type' => 'checkbox', + 'required' => 'true' + ), + 'hide_local' => array( + 'name' => 'Masquer les deals locaux', + 'type' => 'checkbox', + 'title' => 'Masquer les deals en magasins physiques', + 'required' => 'true' + ), + 'priceFrom' => array( + 'name' => 'Prix minimum', + 'type' => 'text', + 'title' => 'Prix mnimum en euros', + 'required' => 'false', + 'defaultValue' => '' + ), + 'priceTo' => array( + 'name' => 'Prix maximum', + 'type' => 'text', + 'title' => 'Prix maximum en euros', + 'required' => 'false', + 'defaultValue' => '' + ), ), - 'hide_expired' => array( - 'name' => 'Masquer les éléments expirés', - 'type' => 'checkbox', - 'required' => 'true' - ), - 'hide_local' => array( - 'name' => 'Masquer les deals locaux', - 'type' => 'checkbox', - 'title' => 'Masquer les deals en magasins physiques', - 'required' => 'true' - ), - 'priceFrom' => array( - 'name' => 'Prix minimum', - 'type' => 'text', - 'title' => 'Prix mnimum en euros', - 'required' => 'false', - 'defaultValue' => '' - ), - 'priceTo' => array( - 'name' => 'Prix maximum', - 'type' => 'text', - 'title' => 'Prix maximum en euros', - 'required' => 'false', - 'defaultValue' => '' - ), - )); + + 'Deals par groupe' => array( + 'groupe' => array( + 'name' => 'Groupe', + 'type' => 'list', + 'required' => 'true', + 'title' => 'Groupe dont il faut afficher les deals', + 'values' => array( + 'Accessoires & gadgets' => 'accessoires-gadgets', + 'Alimentation & boissons' => 'alimentation-boissons', + 'Animaux' => 'animaux', + 'Applis & logiciels' => 'applis-logiciels', + 'Consoles & jeux vidéo' => 'consoles-jeux-video', + 'Culture & divertissement' => 'culture-divertissement', + 'Gratuit' => 'gratuit', + 'Image, son & vidéo' => 'image-son-video', + 'Informatique' => 'informatique', + 'Jeux & jouets' => 'jeux-jouets', + 'Maison & jardin' => 'maison-jardin', + 'Mode & accessoires' => 'mode-accessoires', + 'Santé & cosmétiques' => 'hygiene-sante-cosmetiques', + 'Services divers' => 'services-divers', + 'Sports & plein air' => 'sports-plein-air', + 'Téléphonie' => 'telephonie', + 'Voyages & sorties' => 'voyages-sorties-restaurants' + ) + ), + 'ordre' => array( + 'name' => 'Trier par', + 'type' => 'list', + 'required' => 'true', + 'title' => 'Ordre de tri des deals', + 'values' => array( + 'Du deal le plus Hot au moins Hot' => '', + 'Du deal le plus récent au plus ancien' => '-nouveaux', + 'Du deal le plus commentés au moins commentés' => '-commentes' + ) + ) + ) + ); const CACHE_TIMEOUT = 3600; public function collectData(){ + switch($this->queriedContext) { + case 'Recherche par Mot(s) clé(s)': + return $this->collectDataMotsCles(); + break; + case 'Deals par groupe': + return $this->collectDataGroupe(); + break; + } + } + + /** + * Get the Deal data from the choosen groupe in the choose order + */ + public function collectDataGroupe() + { + + $groupe = $this->getInput('groupe'); + $ordre = $this->getInput('ordre'); + + $url = self::URI + . '/groupe/' . $groupe . $ordre; + $this->collectDeals($url); + } + + /** + * Get the Deal data from the choosen keywords and parameters + */ + public function collectDataMotsCles() + { $q = $this->getInput('q'); $hide_expired = $this->getInput('hide_expired'); $hide_local = $this->getInput('hide_local'); $priceFrom = $this->getInput('priceFrom'); $priceTo = $this->getInput('priceFrom'); - /* Event if the original website uses POST with the search page, GET works too */ - $html = getSimpleHTMLDOM(self::URI + /* Even if the original website uses POST with the search page, GET works too */ + $url = self::URI . '/search/advanced?q=' . urlencode($q) . '&hide_expired='. $hide_expired @@ -59,52 +129,118 @@ class DealabsBridge extends BridgeAbstract { * sort_by : Sort the search by new deals * time_frame : Search will not be on a limited timeframe */ - . '&search_fields[]=1&search_fields[]=2&search_fields[]=3&sort_by=new&time_frame=0') + . '&search_fields[]=1&search_fields[]=2&search_fields[]=3&sort_by=new&time_frame=0'; + $this->collectDeals($url); + } + + /** + * Get the Deal data using the given URL + */ + public function collectDeals($url){ + $html = getSimpleHTMLDOM($url) or returnServerError('Could not request Dealabs.'); $list = $html->find('article'); - if($list === null) { - returnClientError('Your combination of parameters returned no results'); - } - foreach($list as $deal) { - $item = array(); - $item['uri'] = $deal->find('div[class=threadGrid-title]', 0)->find('a', 0)->href; - $item['title'] = $deal->find( - 'a[class=cept-tt thread-link linkPlain space--r-1 size--all-s size--fromW3-m]', 0 - )->plaintext; - $item['author'] = $deal->find('span.thread-username', 0)->plaintext; - $item['content'] = '

' - . $deal->find('a[class=cept-tt thread-link linkPlain space--r-1 size--all-s size--fromW3-m]', 0)->innertext - . '

' - . $this->getPrix($deal) - . $this->getReduction($deal) - . $this->getExpedition($deal) - . $this->getLivraison($deal) - . $this->getOrigine($deal) - . $deal->find( - 'div[class=cept-description-container overflow--wrap-break size--all-s size--fromW3-m]', 0 - )->innertext - . '
' - . $deal->find('div[class=flex flex--align-c flex--justify-space-between space--b-2]', 0)->children(0)->outertext - . '
'; - $dealDateDiv = $deal->find('div[class=size--all-s flex flex--wrap flex--justify-e flex--grow-1]', 0) - ->find('span[class=hide--toW3]'); - $itemDate = end($dealDateDiv)->plaintext; - if(substr( $itemDate, 0, 6 ) === 'il y a') { - $item['timestamp'] = $this->relativeDateToTimestamp($itemDate); - } else { - $item['timestamp'] = $this->parseDate($itemDate); + // Deal Image Link CSS Selector + $selectorImageLink = implode( + ' ', /* Notice this is a space! */ + array( + 'cept-thread-image-link', + 'imgFrame', + 'imgFrame--noBorder', + 'box--all-i', + 'thread-listImgCell', + ) + ); + + // Deal Link CSS Selector + $selectorLink = implode( + ' ', /* Notice this is a space! */ + array( + 'cept-tt', + 'thread-link', + 'linkPlain', + 'space--r-1', + 'size--all-s', + 'size--fromW3-m', + ) + ); + + // Deal Hotness CSS Selector + $selectorHot = implode( + ' ', /* Notice this is a space! */ + array( + 'flex', + 'flex--align-c', + 'flex--justify-space-between', + 'space--b-2', + ) + ); + + // Deal Description CSS Selector + $selectorDescription = implode( + ' ', /* Notice this is a space! */ + array( + 'cept-description-container', + 'overflow--wrap-break', + 'size--all-s', + 'size--fromW3-m', + ) + ); + + // Deal Date CSS Selector + $selectorDate = implode( + ' ', /* Notice this is a space! */ + array( + 'size--all-s', + 'flex', + 'flex--wrap', + 'flex--justify-e', + 'flex--grow-1', + ) + ); + + // If there is no results, we don't parse the content because it display some random deals + $noresult = $html->find('h3[class=size--all-l size--fromW2-xl size--fromW3-xxl]', 0); + if($noresult != null && $noresult->plaintext == 'Il n'y a rien à afficher pour le moment :(') { + $this->items = array(); + } else { + foreach($list as $deal) { + $item = array(); + $item['uri'] = $deal->find('div[class=threadGrid-title]', 0)->find('a', 0)->href; + $item['title'] = $deal->find('a[class='. $selectorLink .']', 0 + )->plaintext; + $item['author'] = $deal->find('span.thread-username', 0)->plaintext; + $item['content'] = '

' + . $deal->find('a[class='. $selectorLink .']', 0)->innertext + . '

' + . $this->getPrix($deal) + . $this->getReduction($deal) + . $this->getExpedition($deal) + . $this->getLivraison($deal) + . $this->getOrigine($deal) + . $deal->find('div[class='. $selectorDescription .']', 0)->innertext + . '
' + . $deal->find('div[class='. $selectorHot .']', 0)->children(0)->outertext + . '
'; + $dealDateDiv = $deal->find('div[class='. $selectorDate .']', 0) + ->find('span[class=hide--toW3]'); + $itemDate = end($dealDateDiv)->plaintext; + if(substr( $itemDate, 0, 6 ) === 'il y a') { + $item['timestamp'] = $this->relativeDateToTimestamp($itemDate); + } else { + $item['timestamp'] = $this->parseDate($itemDate); + } + $this->items[] = $item; } - $this->items[] = $item; } - } /** @@ -320,4 +456,19 @@ class DealabsBridge extends BridgeAbstract { return $date->getTimestamp(); } + public function getName(){ + switch($this->queriedContext) { + case 'Recherche par Mot(s) clé(s)': + return self::NAME . ' - Recherche : '. $this->getInput('q'); + break; + case 'Deals par groupe': + $values = self::PARAMETERS['Deals par groupe']['groupe']['values']; + $groupe = array_search($this->getInput('groupe'), $values); + return self::NAME . ' - Groupe : '. $groupe; + break; + default: // Return default value + return self::NAME; + } + } + }