diff --git a/bridges/AutoJMBridge.php b/bridges/AutoJMBridge.php index 25fb2cb8..b9825ca4 100644 --- a/bridges/AutoJMBridge.php +++ b/bridges/AutoJMBridge.php @@ -77,110 +77,69 @@ class AutoJMBridge extends BridgeAbstract { $model_url = self::URI . $this->getInput('url'); - // Get the session cookies and the form token - $this->getInitialParameters($model_url); + // Build the GET data + $get_data = 'form[energy]=' . $this->getInput('energy') . + '&form[transmission]=' . $this->getInput('transmission') . + '&form[priceMin]=' . $this->getInput('priceMin') . + '&form[priceMin]=' . $this->getInput('priceMin'); - // Build the form - $post_data = array( - 'form[energy]' => $this->getInput('energy'), - 'form[transmission]' => $this->getInput('transmission'), - 'form[priceMin]' => $this->getInput('priceMin'), - 'form[priceMin]' => $this->getInput('priceMin'), - 'form[_token]' => $this->token - ); - - // Set the Form request content type + // Set the header 'X-Requested-With' like the website does it $header = array( - 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8', - ); - - // Set the curl options (POST query and content, and session cookies - $curl_opts = array( - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => http_build_query($post_data), - CURLOPT_COOKIE => $this->cookies + 'X-Requested-With: XMLHttpRequest' ); // Get the JSON content of the form - $json = getContents($model_url, $header, $curl_opts) + $json = getContents($model_url . '?' . $get_data, $header) or returnServerError('Could not request AutoJM.'); // Extract the HTML content from the JSON result $data = json_decode($json); - $html = str_get_html($data->content); + $html = str_get_html($data->results); - // Go through every finisha of the model - $list = $html->find('h3'); - foreach ($list as $finish) { - $finish_name = $finish->plaintext; - $motorizations = $finish->next_sibling()->find('li'); - foreach ($motorizations as $element) { - $image = $element->find('div[class=block-product-image]', 0)->{'data-ga-banner'}; - $serie = $element->find('span[class=model]', 0)->plaintext; - $url = self::URI . substr($element->find('a', 0)->href, 1); - if ($element->find('span[class*=block-product-nbModel]', 0) != null) { - $availability = 'En Stock'; - } else { - $availability = 'Sur commande'; - } - $discount_html = $element->find('span[class*=tag--promo]', 0); - if ($discount_html != null) { - $discount = $discount_html->plaintext; - } else { - $discount = 'inconnue'; - } - $price = $element->find('span[class=price red h1]', 0)->plaintext; - $item = array(); - $item['title'] = $finish_name . ' ' . $serie; - $item['content'] = '

' - . $finish_name . ' ' . $serie . '

'; - $item['content'] .= ''; + // Go through every car of the model + $list = $html->find('div[class=car-card]'); + foreach ($list as $car) { - // Add a fictionnal anchor to the RSS element URL, based on the item content ; - // As the URL could be identical even if the price change, some RSS reader will not show those offers as new items - $item['uri'] = $url . '#' . md5($item['content']); - - $this->items[] = $item; + // Get the Finish name if this car is the first of a new finish + $prev_tag = $car->prev_sibling(); + if($prev_tag->tag == 'div' && $prev_tag->class == 'results-title') { + $finish_name = $prev_tag->plaintext; } - } - } - /** - * Gets the session cookie and the form token - * - * @param string $pageURL The URL from which to get the values - */ - private function getInitialParameters($pageURL) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $pageURL); - curl_setopt($ch, CURLOPT_HEADER, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - $data = curl_exec($ch); - - // Separate the response header and the content - $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); - $header = substr($data, 0, $headerSize); - $content = substr($data, $headerSize); - curl_close($ch); - - // Extract the cookies from the headers - $cookies = ''; - $http_response_header = explode("\r\n", $header); - foreach ($http_response_header as $hdr) { - if (strpos($hdr, 'Set-Cookie') !== false) { - $cLine = explode(':', $hdr)[1]; - $cLine = explode(';', $cLine)[0]; - $cookies .= ';' . $cLine; + // Get the info about the car offer + $image = $car->find('div[class=car-card__visual]', 0)->find('img', 0)->src; + $serie = $car->find('div[class=car-card__title]', 0)->plaintext; + $url = $car->find('a', 0)->href; + // Check if the car model is in stock or available only on order + if($car->find('span[class*=tag--dispo]', 0) != null) { + $availability = 'En Stock'; + } else { + $availability = 'Sur commande'; } - } - $this->cookies = trim(substr($cookies, 1)); + $discount_html = $car->find('span[class=promo]', 0); + // Check if there is any discount dsiplayed + if ($discount_html != null) { + $discount = $discount_html->plaintext; + } else { + $discount = 'inconnue'; + } + $price = $car->find('span[class=price]', 0)->plaintext; - // Get the token from the content - $html = str_get_html($content); - $token = $html->find('input[type=hidden][id=form__token]', 0); - $this->token = $token->value; + // Construct the new item + $item = array(); + $item['title'] = $finish_name . ' ' . $serie; + $item['content'] = '

' + . $finish_name . ' ' . $serie . '

'; + $item['content'] .= ''; + + // Add a fictionnal anchor to the RSS element URL, based on the item content ; + // As the URL could be identical even if the price change, some RSS reader will not show those offers as new items + $item['uri'] = $url . '#' . md5($item['content']); + + $this->items[] = $item; + } } }