each(function ($country) use (&$countries, &$cHash) { $countries[] = $country; $cHash[$country->country_name] = $country->country_code; }); $this->countries = collect($countries); $this->cHash = collect($cHash); } public function search(Request $request) { $itemCodes = $request->input("item_codes"); $ta_codes = explode(' ', str_replace('.', '', trim($itemCodes))); $requests = $this->makeRequests($ta_codes[0]); return $this->processResponse($requests,$ta_codes[0]); } public function compare($countries, $cHash, $aCodes){ $requests = $this->makeRequests($aCodes); return $this->processResponse($requests, $aCodes); } public function makeRequests($ta_code) { $requests = Http::pool(fn (Pool $pool) => [ $this->countries->each(function ($country) use ($pool, $ta_code) { Log::info('Getting page {url}', [ 'url' => $country->search_url . $ta_code[0] ] ); return $pool->as($country->country_code)->get($country->search_url . $ta_code[0] ); }) ]); return $requests; } public function makeRequest($ta_code, $country) { $country = CountryCode::where('country_name', $country)->first(); return Http::pool(fn (Pool $pool) => [ $pool->as($country->country_name)->get($country->search_url . $ta_code) ]); } public function processResponse($responses, $code) { $prices = []; foreach ($this->countries as $c) { $country = $c->country_code; if ($responses[$country] instanceof \Illuminate\Http\Client\Response && $responses[$country]->ok()) { // dd($responses); $response = (string) $responses[$country]->body(); //dd($response) switch ($country) { case "BG": case "CY": case "GR": $prices[$country] = $this->parseJson_CY_GR_BG($code, (string) $response, $country); break; case "IS": $prices[$country] = $this->parseJson_IS($code,(string) $response, $country); break; case "TR": $prices[$country] = $this->parseJson_TR((string) $response, $country); break; case "EE": case "LT": case "LV": $prices[$country] = $this->parseJson_EE_LT_LV($code, (string) $response, $country); break; default: $prices[$country] = $this->parseJson((string) $response, $country); } } } $products = []; collect($prices)->each(function ($price) use (&$products) { if (count($price)) $products[] = $price; }); return collect($products); } // { "country": "AT", "code": "50161321", "url": "https://www.ikea.com/at/de/p/hol-aufbewahrungstisch-akazie-50161321/", "name": "HOL", "typeName": "Aufbewahrungstisch", "mainImageUrl": "https://www.ikea.com/at/de/images/products/hol-aufbewahrungstisch-akazie__0104310_pe251255_s5.jpg", "itemNoGlobal": "50161321", "salesPrice": "80.99", "tag": "FAMILY_PRICE", "last_mod": "2023-12-03 16:44:24" }, public function parseJson($json_raw, $country) { $json_values = array(); Log::info('{json_raw} {country}', [$json_raw, $country]); $json_decoded = json_decode($json_raw, true); $searchResultPage = $json_decoded["searchResultPage"]; $products = $searchResultPage["products"]; $main = $products["main"]; $items = $main["items"]; foreach ($items as $item) { $product = $item["product"]; $salesPrice = $product["salesPrice"]; $numeral = $salesPrice["numeral"]; $json_values = array( 'url' => $product['pipUrl'], 'tag' => $product['tag'], 'country' => $country, 'salesPrice' => $numeral, ); break; } return $json_values; } public function parseJson_TR($body,$country) { //echo "country: " . $country . ", code: " . $code . "
"; $dochtml = new \DOMDocument(); @$dochtml->loadHTML( $body); @$xpath = new \DOMXpath($dochtml); $price = null; //$c = ltrim($code, "0"); $json_values = array(); $url_product = $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue; $price = $xpath->query('/html/head/meta[(@property="og:price:amount")]/@content')[0]->nodeValue; $price = floatval(trim(str_replace('.', '', $price))); $json_values = array( 'url' => $url_product, 'tag' => null, 'salesPrice' => floatval($price), 'country' => $country, ); return $json_values; } public function parseJson_CY_GR_BG($code, $body , $country) { //echo "country: " . $country . ", code: " . $code . "
"; //Log::info('{country},{body},{code}',[$country, $body, $code]); //$body = file_get_contents("https://www.ikea.bg/search-results/?query=80366284"); $dochtml = new \DOMDocument(); @$dochtml->loadHTML($body); @$xpath = new \DOMXpath($dochtml); $price = null; $c = ltrim($code, "0"); $json_values = array(); @$price = $xpath->query('//*/div[(@class="yotpo yotpo-main-widget" and @data-product-id="' . $code . '")]/@data-price')[0]->nodeValue; @$url_product = $xpath->query('//*/div[(@class="yotpo yotpo-main-widget" and @data-product-id="' . $code . '")]/@data-url')[0]->nodeValue; $price = floatval($price); $json_values = array( 'url_product' => $url_product, 'tag' => null, 'salesPrice' => floatval($price), 'country' => $country, ); return $json_values; } public function parseJson_EE_LT_LV($code, $body, $country) { //echo "country: " . $country . ", code: " . $code . "
"; $dochtml = new \DOMDocument(); @$dochtml->loadHTML( $body); @$xpath = new \DOMXpath($dochtml); $price = null; $c = ltrim($code, "0"); $json_values = array(); @$price = $xpath->query('//*/div[(@class="itemPriceBox" and @data-item="' . $c . '")]//p[@class="itemNormalPrice display-6"]/span')[0]->nodeValue; if (is_null($price) || empty($price)) { @$price = $xpath->query('//*/div[(@class="itemPriceBox" and @data-item="' . $c . '")]//div[@class="itemBTI display-6"]/span')[0]->nodeValue; } switch ($country) { case "EE": $url_product = "https://www.ikea.ee" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue; break; case "LT": $url_product = "https://www.ikea.lt" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue; break; case "LV": $url_product = "https://www.ikea.lv" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue; break; default: $url_product = null; } if (is_null($price) || empty($price)) { $url_product = null; } $price = floatval(trim(str_replace(' ', '', str_replace(',', '.', str_replace(array('€'), '', $price))))); $json_values = array( 'url' => $url_product, 'tag' => null, 'salesPrice' => $price, 'country' => $country, ); return $json_values; } public function parseJson_IS($code, $body, $country) { //echo "country: " . $country . ", code: " . $code . "
"; //$body = file_get_contents("https://ikea.is/is/search/?q=80366284"); // $client = new \GuzzleHttp\Client(); // $res = $client->request('GET', 'https://ikea.is/is/search/?q=80366284'); // $body= $res->getBody()->getContents(); $dochtml = new \DOMDocument(); @$dochtml->loadHTML( $body); @$xpath = new \DOMXpath($dochtml); $price = null; $c = ltrim($code, "0"); $json_values = array(); // try { @$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemNormalPrice revamp_price price"]/span/span')[0]->nodeValue; if (is_null($price) || empty($price)) { @$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemBTI display-6 revamp_price price"]/span/span')[0]->nodeValue; } @$url_product = "https://www.ikea.is" . $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue; //echo "url_product: " . $url_product . "
"; if (is_null($price) || empty($price)) { $url_product = null; } //} catch (\Exception $e) { // return []; //} $price = floatval(trim(str_replace(' ', '', str_replace(',', '.', str_replace('.', '', str_replace(array('€'), '', $price)))))); $json_values = array( 'url' => $url_product, 'tag' => null, 'salesPrice' => $price, 'country' => $country, ); return $json_values; } }