From 4a512697128f082ea9c8f0f8079d5cdb6fd39433 Mon Sep 17 00:00:00 2001 From: Jaroslav Drzik Date: Tue, 13 Feb 2024 06:06:14 +0100 Subject: [PATCH] Bug in process Request --- .../Controllers/CountryCompareController.php | 219 +++++++++--------- lang/id.json | 3 +- 2 files changed, 111 insertions(+), 111 deletions(-) diff --git a/app/Http/Controllers/CountryCompareController.php b/app/Http/Controllers/CountryCompareController.php index 0d83b4d..d8626a8 100644 --- a/app/Http/Controllers/CountryCompareController.php +++ b/app/Http/Controllers/CountryCompareController.php @@ -10,8 +10,103 @@ use Illuminate\Http\Client\Pool; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; +class CountryCompareController extends Controller +{ + private $countries = []; + private $cHash = []; + private $dom = null; + public function __construct() + { + $countries = []; + $cHash = []; + CountryCode::active('Y')->each(function ($country) use (&$countries, &$cHash) { + $countries[] = $country; + $cHash[$country->country_name] = $country->country_code; + }); -function parseJson($json_raw, $country) + $this->countries = collect($countries); + $this->cHash = collect($cHash); + $this->dom = new DOMDocument(); + } + 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)->withUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36')->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) + { + $code = $code[0]; + $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); + } + + public function parseJson($json_raw, $country) { $json_values = array(); Log::info('{json_raw} {country}', [$json_raw, $country]); @@ -40,12 +135,12 @@ function parseJson($json_raw, $country) return $json_values; } - function parseJson_TR($body,$country) + public function parseJson_TR($body,$country) { //echo "country: " . $country . ", code: " . $code . "
"; - $dochtml = new DOMDocument("1.0", "UTF-8"); - @$dochtml->loadHTML( $body); + $dochtml = new DOMDocument(); + @$dochtml->loadHTML( $body,LIBXML_NOERROR); @$xpath = new DOMXpath($dochtml); $price = null; @@ -67,14 +162,14 @@ function parseJson($json_raw, $country) return $json_values; } - function parseJson_CY_GR_BG($code, $body , $country) + 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"); libxml_use_internal_errors(true); $dochtml = new DOMDocument(); - @$dochtml->loadHTML($body); + @$dochtml->loadHTML($body,LIBXML_NOERROR); @$xpath = new DOMXpath($dochtml); $price = null; @@ -97,11 +192,11 @@ function parseJson($json_raw, $country) return $json_values; } - function parseJson_EE_LT_LV($code, $body, $country) + public function parseJson_EE_LT_LV($code, $body, $country) { //echo "country: " . $country . ", code: " . $code . "
"; - $dochtml = new DOMDocument("1.0", "UTF-8"); + $dochtml = new DOMDocument(); @$dochtml->loadHTML( $body); @$xpath = new DOMXpath($dochtml); @@ -145,30 +240,27 @@ function parseJson($json_raw, $country) return $json_values; } - function parseJson_IS($code, $body, $country) + 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("1.0", "UTF-8"); + $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; + @$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemNormalPrice revamp_price price"]/span/span')->item(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; + @$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemBTI display-6 revamp_price price"]/span/span')->item(0)->nodeValue; } - @$url_product = "https://www.ikea.is" . $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue; + $url_product = "https://www.ikea.is" . $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue; //echo "url_product: " . $url_product . "
"; @@ -192,98 +284,5 @@ function parseJson($json_raw, $country) } - -class CountryCompareController extends Controller -{ - private $countries = []; - private $cHash = []; - - public function __construct() - { - $countries = []; - $cHash = []; - CountryCode::active('Y')->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] = parseJson_CY_GR_BG($code, (string) $response, $country); - break; - case "IS": - $prices[$country] = parseJson_IS($code,(string) $response, $country); - break; - case "TR": - $prices[$country] = parseJson_TR((string) $response, $country); - break; - case "EE": - case "LT": - case "LV": - $prices[$country] = parseJson_EE_LT_LV($code, (string) $response, $country); - break; - default: - $prices[$country] = 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" }, diff --git a/lang/id.json b/lang/id.json index 33ef3ac..62220aa 100644 --- a/lang/id.json +++ b/lang/id.json @@ -125,5 +125,6 @@ "referenceerror: ccountry is not defined": "ReferenceError: ccountry is not defined", "typeerror: invalid assignment to const 'response'": "TypeError: invalid assignment to const 'response'", "error: request aborted": "Error: Request aborted", - "typeerror: can't access property \"code\", form.country is null": "TypeError: can't access property \"code\", form.country is null" + "typeerror: can't access property \"code\", form.country is null": "TypeError: can't access property \"code\", form.country is null", + "error: request failed with status code 504": "Error: Request failed with status code 504" } \ No newline at end of file