1, 'Второй' => 2, 'Третий' => 3, 'Четвертый' => 4, 'Пятый' => 5, 'Шестой' => 6, 'Седьмой' => 7, 'Восьмой' => 8, 'Девятый' => 9, 'Десятый' => 10, 'Одиннадцатый' => 11, 'Двенадцатый' => 12, 'Тринадцатый' => 13, 'Четырнадцатый' => 14, 'Пятнадцатый' => 15, 'Шестнадцатый' => 16, 'Семнадцатый' => 17, 'Восемнадцатый' => 18, 'Девятнадцатый' => 19, 'Двадцатый' => 20 ); // abstract, trash public function create_url($urlsfx, $p = 1) { // TODO: Implement create_url() method. } public function getPages($url, $n = 0) { // TODO: Implement getPages() method. } public $timeout = 30; public $check_olditems = TRUE; public function __construct($site_id) { parent::__construct($site_id); $this->numUncorrectObjOnPage = 0; } public $cityinurl = ""; public function grab() { $this->get_url_youla(); $categories = array( 'prodaja-kvartiri' => 'prodam', // 'prodaja-komnati' => 'prodam', // 'arenda-kvartiri' => 'sdam', // 'arenda-komnati' => 'sdam', // 'prodaja-doma' => 'prodam', // 'prodaja-uchastka' => 'prodam', // 'prochie-stroeniya' => 'prodam', // 'arenda-doma' => 'sdam', ); //TODO: Это костыль для работы обновлено, правильное решение здесь будет оверрайдить метод create_url и get_pages и адаптировать решение чтобы использовать стандартный метод grab $costulDlyaCategories = array( 'prodaja-kvartiri' => 'kvartiry', // 'prodaja-komnati' => 'komnaty', // 'arenda-kvartiri' => 'kvartiry', // 'arenda-komnati' => 'komnaty', // 'prodaja-doma' => 'doma_dachi_kottedzhi', // 'prodaja-uchastka' => 'zemelnye_uchastki', // 'prochie-stroeniya' => 'kommercheskaya_nedvizhimost', // 'arenda-doma' => 'doma_dachi_kottedzhi', ); $arr = [ tomsk => "Томск", // tomskaya_oblast_svetlyy => "Светлый", // bogashevo => "Богашёво", // zonalnaya_stantsiya => "Зональная станция", // loskutovo => "Лоскутово", // moryakovskiy_zaton => "Моряковский Затон", // samus => "Самусь", // seversk => "Северск", ]; foreach($arr as $code => $name){ $this->cityinurl = $code; $url = 'https://youla.ru/' . $this->cityinurl . '/nedvijimost/'; foreach ($categories as $category => $dealType) { $page = 0; $this->items = []; $limit = $this->limit; $this->city = $this->cityinurl; $this->deal_type = $dealType; $this->category = $costulDlyaCategories[$category]; while ( $page < $this->page_limit) { $page++; $items = $this->getItems($url . $category . '?attributes%5Bsobstvennik_ili_agent%5D%5B0%5D=10705&attributes%5Bsort_field%5D=date_published&page=' . $page); if (empty($items)) { break; } foreach ($items as $item) { //var_dump($item); if ($this->checkYoulaItem($item)) { $limit = $this->limit; $item->deal_type = $dealType; $this->items[$item->id] = $item; } else { $limit--; } if (!$limit) { break 2; } } } $this->__log("\n\n=========\n ITEMS FOUND: " . $category . ' - ' . count($this->items) . "\n=========\n\n"); foreach (array_reverse($this->items) as $item) { //var_dump($item->id); if (!$this->getItem($item)) $this->saveUrl($item); } } } @unlink("{$_ENV[ROOT]}/../pids/{$this->site->code_alias}.pid"); } final public function checkYoulaItem($item) { $olditem = mysql_fetch_object(mysql_query("SELECT * FROM objects WHERE site_id = '{$this->site->id}' AND id = '{$item->id}'")); if(!$this->check_olditems) return $olditem ? 0 : 1; if( !$olditem ) return 1; if( !$olditem->display || $olditem->is_agency == 1 || $olditem->category != $this->category || $olditem->deal_type != $this->deal_type ) return 0; $olditem->price = __floatval(preg_replace('/[^\d.,]+/', '', $olditem->price)); $this->olditems[$item->id] = $olditem; return 1; } private $uncorrectedObjectLimit = 50; public function getItems($url, $n = 0) { sleep(mt_rand(4,5)); $items = array(); if($n){ $err = "getItems({$url}) - error receiving data"; $this->update_proxy(1, -1, $err); if($n > $this->fails){ $this->__log($err); return []; } } var_dump($url); $data = $this->get_url_youla($url, FALSE); $tmp = json_decode($data, true); $tmp_items = ($tmp["data"]['feed']['items']); //var_dump($tmp_items[1]); die(); for($i = 1; $i < count($tmp_items); $i++) { if($tmp_items[$i]["product"]){ $items[] = (object) array( 'id' => $this->getMappedId($tmp_items[$i]["product"]["id"] ), //'date' => $this->get_date($tmp[6], $tmp[5]), 'title' => $tmp_items[$i]["product"]["name"], 'url' => "https://youla.ru".$tmp_items[$i]["product"]["url"], 'price' => $tmp_items[$i]["product"]["price"]["origPrice"]["price"], ); } } //var_dump($items); //die(); /* $tmp = preg_split('/]+class="product_list[^>]+">/ismU',$tmp); $tmp = preg_split('/<\/ul>/ismU',$tmp[1]); if (!$tmp[0]) { if(!preg_match("/alert_message__title/ismU", $data)){ return $this->getItems($url, $n + 1); }else{ return $items; }} */ // if (!preg_match('/]+class="product_list[^\"]+_board_items">(.+)<\/ul>/ismU', $data, $blockMatch)) { // if(!preg_match("/alert_message__title/ismU", $data)){ // return $this->getItems($url, $n + 1); // }else{ // return $items; // } // } // $this->__log($tmp[0]); //Get items // $rgxp = ']+class="product_item[^>]+>((?!<\/li>).)*<\/li>'; // if (!preg_match_all('{' . $rgxp . '}ism', $tmp[0], $matches)) { // return $items; // } //Get data //$rgxp= ']*[^h]*hidden-xs\">([^<]*)[^\"]*\"visible-xs\">([^<]+)'; // $rgxp = ']*>\s*cityinurl . '[^"]+)"\s+title="([^"]+)"\s*>\s*' // . '.+>([^><]+).+\s*' // . '([^<]+)<\/span>([^<]+)<'; /* foreach($matches[0] as $item_parsed){ if($this->numUncorrectObjOnPage == $this->uncorrectedObjectLimit ) { break; } if(preg_match('{' . $rgxp . '}ism', $item_parsed, $tmp)){ $fl = preg_match('/nedvijimost/', $tmp[2]); if($fl == 0 ){ $this->numUncorrectObjOnPage++; print_r("Unccorrected link\n".$tmp[2]); continue; } $this->numUncorrectObjOnPage = 0; //Является ли полученное объявление с правильной ссылкой $items[$tmp[1]] = (object) array( 'id' => $this->getMappedId($tmp[1]), 'date' => $this->get_date($tmp[6], $tmp[5]), 'title' => trim($tmp[3]), 'url' => 'https://youla.ru' . $tmp[2], 'price' => preg_replace('/\D+/', '', trim(html_entity_decode(strip_tags($tmp[4])))), ); } } foreach($items as $item){ $this->__log("Item url {$item->url} | id {$item->k} | date {$item->date}"); } */ // // if (!preg_match_all('{' . $rgxp . '}ism', $blockMatch[1], $matches)) { // if (!preg_match_all('{' . $rgxp . '}ism', $tmp[0], $matches)) { // return $items; // } // foreach (array_keys($matches[0]) as $key) { // $items[$matches[1][$key]] = (object) array( // 'id' => $this->getMappedId($matches[1][$key]), // 'date' => $this->get_date($matches[6][$key], $matches[5][$key]), // 'title' => $matches[3][$key], // 'url' => 'https://youla.ru' . $matches[2][$key], // 'price' => preg_replace('/\D+/', '', trim(html_entity_decode(strip_tags($matches[4][$key])))), // ); // } return $items; } public function get_date($date, $time = "") { $time = preg_match('/(\d\d\:\d\d)/', $time, $match) ? $match[1] : '00:00'; $dateObj = date_create_from_format('d.m.Y H:i', $date . ' ' . $time); return $dateObj->format('Y-m-d H:i'); } public function getItem($item, $n = 0) { $item->is_agency = 0; if($n){ $err = "getItem({$item->id}) - error receiving data"; $this->update_proxy(1, -1, $err); if($n > $this->fails) return $this->__log($err); } //$item->url = "https://youla.ru/tomsk/nedvijimost/prodaja-kvartiri/kvartira-3-komnaty-767-m2-619cf43059a68332073f0763"; $data = $this->get_url($item->url, FALSE); /* if (!preg_match("/
    /ismU", $data, $tmp)) { return $this->getItem($item, $n + 1); }*/ /* $file1 = fopen("fdata.html", "a+"); fwrite($file1, $data); fclose($file1); */ /* if (preg_match_all('/дата размещения:\s+([^\s]+)/ism', $data, $arr_date_object)) { if (!empty($arr_date_object[0])) { $item->date = $arr_date_object[0]; } else { $item->date = "1900-01-01"; } } */ if (!preg_match('{window.__YOULA_STATE__ =([^\n]+)}', $data, $tmp)) { return $this->__log("getItem({$item->id}) - error parsing JSON"); } $json = json_decode(trim(trim($tmp[1]), ';'), TRUE); $jsonProduct = $json['entities']['products'][0]; /* $file = fopen("data.json", "a+"); fwrite($file, json_encode($jsonProduct)); fclose($file); // var_dump($jsonProduct); die(); */ $item->phone = $jsonProduct['owner']['displayPhoneNum']; if (empty($item->phone)) { $item->phone = "Нет телефона"; // $this->__log("error receiving phone"); // return; } else{ $tmpphone = preg_replace("/^7/sm","8",$item->phone); mysql_query("UPDATE grabber.objects SET phone = '{$tmpphone}' WHERE url = '{$item->url}' AND phone = 'Нет телефона'"); mysql_query("UPDATE grabber.objects_links SET phone = REPLACE(phone,'23:\"Нет телефона','11:\"{$tmpphone}') WHERE url = '{$item->url}' AND phone LIKE '%Нет телефона%'"); } // Nope from URL -> see categories in DB $this->_getObjectType($item->url, $item); $this->_getAgency($data, $item); $item->seller = $jsonProduct['owner']['name']; $item->title = $jsonProduct['name']; $item->address = $jsonProduct['location']['description']; $item->description = $jsonProduct['description']; $item->display = 1;//$this->checkPhone($item->phone); $item->distance = is_null($jsonProduct['distance']) ? '' : $jsonProduct['distance']; $this->_getParams($jsonProduct['attributes'], $item); $this->_getImages($jsonProduct['images'], $item); $dt = new DateTime(); //$dt->setTimezone(new DateTimeZone($jsonProduct['datePublished']['timezone']['name'])); $dt->setTimestamp($jsonProduct['datePublished']['timestamp']); $item->date = date_create_from_format('d.m.Y H:i:s', $dt->format('d.m.Y H:i:s'))->format('Y-m-d H:i:s'); isset($this->olditems[$item->id]) ? $this->updateItem($item) : $this->saveItem($item); var_dump($item); return $item; } private function _getObjectType($data, $item) { if (preg_match('/(arenda|prodaja)\-doma/i', $data)) { $item->category = 'doma_dachi_kottedzhi'; } elseif (preg_match('/prochie\-stroeniya/i', $data)) { $item->category = 'kommercheskaya_nedvizhimost'; } elseif (preg_match('/(arenda|prodaja)\-komnati/i', $data)) { $item->category = 'komnaty'; } elseif (preg_match('/(arenda|prodaja)\-kvartiri/i', $data)) { $item->category = 'kvartiry'; } elseif (preg_match('/prodaja\-uchastka/i', $data)) { $item->category = 'zemelnye_uchastki'; } } private function _getParams($data, $item) { $paramNames = array( 'realty_etaj' => 'Этаж', 'balkon' => 'Балкон', 'realty_infrastructure' => 'Инфраструктура', 'lift' => 'Лифт', 'realty_etajnost_doma' => 'Этажность', 'tip_doma' => 'Тип дома', 'sobstvennik_ili_agent' => 'Собственник или агент', 'komnat_v_kvartire' => 'Количество комнат', 'remont' => 'Ремонт', 'sanuzli' => 'Санузел', 'let_v_sobstvennosti' => 'Лет в собственности', 'realty_obshaya_ploshad' => 'Общая площадь', 'realty_ploshad_kuhni' => 'Площадь кухни', ); $item->raion = ''; $item->land = 0.0; $params = array(); foreach ($data as $attribute) { switch ($attribute['slug']) { case 'realty_etaj': $item->level = $this->_getLevel($attribute['rawValue']); break; case 'realty_etajnost_doma': $item->levels = is_numeric($attribute['rawValue']) ? $attribute['rawValue'] : 0; break; case 'tip_doma': $item->material = empty($attribute['rawValue']) ? '' : $attribute['rawValue']; break; case 'sobstvennik_ili_agent': if ($attribute['rawValue'] != 'Собственник') { $item->is_agency = 1; } break; case 'komnat_v_kvartire': $item->rooms = $this->_getRooms($attribute['rawValue']); break; case 'realty_obshaya_ploshad': $item->s = $attribute['rawValue'] / 100; break; case 'realty_ploshad_kuhni': $params[] = $paramNames['realty_ploshad_kuhni'] . ': ' . ($attribute['rawValue'] / 100); break; default: $params[] = ( isset($paramNames[$attribute['slug']]) ? $paramNames[$attribute['slug']] : $attribute['slug'] ) . ': ' . $attribute['rawValue']; break; } } $item->params = implode('; ', $params); } private function _getLevel($value) { if (is_numeric($value)) { return $value; } elseif (isset($this->level[$value])) { return $this->level[$value]; } return 0; } private function _getRooms($value) { $res = preg_replace('/\D+/', '', $value); return is_numeric($res) ? $res : 0; } private function _getAgency($data, $item) { if (preg_match('{(.+)}ismU', $data, $matches) && (trim($matches[1]) != 'Собственник') ) { $item->is_agency = 1; } } private function _getImages($data, $item) { $item->images = array(); foreach ($data as $image) { $item->images[] = $image['url']; } $item->images = implode("\n", $item->images); } protected function error($err) { die($this->__log($err)); } public function cron() { $logfile = "{$_ENV[ROOT]}/../logs/{$this->site->code_alias}.log"; $pidfile = "{$_ENV[ROOT]}/../pids/{$this->site->code_alias}.pid"; if (is_file($pidfile)) { $pid = file_get_contents($pidfile); shell_exec("kill -9 {$pid} > /dev/null 2>&1"); } $cmd = "php {$_ENV[ROOT]}/grabber.php {$this->site->code_alias} > {$logfile} & echo $!"; // echo "[", date("Y-M-d H:i:s"), "] ", $cmd, "\n"; $pid = shell_exec($cmd); file_put_contents($pidfile, $pid); } public function get_pkey($id, $t) { $t = preg_split("/[^0-9a-f]+/", $t); $t = implode("", $id % 2 ? $t : array_reverse($t)); $t = str_split($t); $r = ''; for ($i = 0; $i < count($t); ++$i) { if ($i % 3 === 0) { $r .= $t[$i]; } } return $r; } public function isValidItemHtml($html, $item) { return preg_match("/\bavito\.item\.phone\s*=\s*['\"]([^'\"]+)['\"]/ismU", $html); } /* public function get_proxy($proxy = "", $reset = 0) { $this->__proxy = (object) [ip => "", port => ""]; $this->proxy = "10.0.0.1:8800"; list($this->__proxy->ip, $this->__proxy->port) = explode(":", $this->proxy); return $this->proxy; } */ protected function getMappedId($value) { if (preg_match('/^\d+$/', $value)) return $value; $value = mysql_real_escape_string($value); list($key) = mysql_fetch_array(mysql_query("SELECT `key` FROM objects_id_map WHERE site_id = '{$this->site_id}' AND `value` = '{$value}'")); if ($key) return $key; list($key) = mysql_fetch_array(mysql_query("SELECT MAX(`key`) + 1 FROM objects_id_map WHERE site_id = '{$this->site_id}'")); if (!$key) $key = 1; mysql_query("INSERT INTO objects_id_map(`site_id`, `key`, `value`) VALUES('{$this->site_id}', '{$key}', '{$value}')") or $this->error(mysql_error()); return $key; } //Переписываем метод get_url [curl] public function get_url_youla(/*$url, $proxy = true, $opts = [], $n = 1*/) { /* if(!$url || !preg_match("/^https?[:]\/\//",$url)) return $this->error("get_url_yula: incorrect url = {$url}"); if ($this->http_tunnel || !$proxy && $n > 2) { $this->http_tunnel = true; return $this->__get_url($url, $opts, "GET"); } */ $api = "https://api-gw.youla.io/federation/graphql"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $api); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); /* $headers = array( "Connection: keep-alive", "sec-ch-ua: \" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\"", "x-app-id: web/3", "sec-ch-ua-mobile: ?0", "x-uid: 61e2560749d2a", "authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2NDM3MTU5NDksImlzcyI6InlvdWxhLmlvIiwiYXVkIjoiaHR0cHM6XC9cL3lvdWxhLmlvXC8iLCJzdWIiOiI2MDc2YmI2YTEzY2VhNjdjZDYwNDg3M2IiLCJ5b3VsYV9pZCI6IjYwNzZiYjYwMTE0NDIzMWMxMzM3NTA0OCIsInZrX2lkIjo2MzYyNjU2MTAsInBob25lIjoiNzkyOTMwNzY5NTUiLCJmaXJzdF9uYW1lIjoiXHUwNDFlXHUwNDNiXHUwNDRjXHUwNDMzXHUwNDMwIiwibGFzdF9uYW1lIjoiXHUwNDE4IiwiZXhwIjoxNjQzNzE2MTI5fQ.Z41a1w_cIxKPdSE2oPXF94kF_nn2M7RK3iM3y7XtrbIWFVDS9izIlUIp4X0b96ZaGZxken8dPHYqE7uaDYeEKZjZG4mb8VZ-f2vaR3ECEPqD3EPLWClorZum93CFMk0E1s9p5lE8e6WjiA6UrE3FVdlrLORwzxZDNx3Pe3yd6jY", "content-type: application/json", "x-youla-splits: 8a=4|8b=4|8c=6|8m=5|8v=0|8z=8|16a=0|16b=0|64a=3|64b=0|100a=41|100b=48|100c=7|100d=34|100m=81", "accept: /*", "uid: 61e2560749d2a", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36", "appId: web/3", "sec-ch-ua-platform: \"Windows\"", "Origin: https://youla.ru", "Sec-Fetch-Site: cross-site", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://youla.ru/tomsk/nedvijimost", "Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7", ); */ $headers = array( "Connection: keep-alive", "Pragma: no-cache", "Cache-Control: no-cache", "sec-ch-ua: \" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\"", "x-app-id: web/3", "sec-ch-ua-mobile: ?0", "x-uid: 61ae0d1f14b6b", "authorization: ", "content-type: application/json", "x-youla-splits: 8a=7|8b=1|8c=0|8m=0|8v=0|8z=0|16a=0|16b=0|64a=8|64b=0|100a=84|100b=9|100c=0|100d=0|100m=0", "accept: */*", "uid: 61ae0d1f14b6b", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36", "appId: web/3", "sec-ch-ua-platform: \"Windows\"", "Origin: https://youla.ru", "Sec-Fetch-Site: cross-site", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://youla.ru/tomsk/nedvijimost/prodaja-kvartiri", // https://youla.ru/tomsk/nedvijimost/prodaja-kvartiri?attributes%5Bsobstvennik_ili_agent%5D%5B0%5D=10705&attributes%5Bsort_field%5D=date_published&page=143",//.$url, // https://youla.ru/tomsk/nedvijimost "Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $data = '{"operationName":"catalogProductsBoard","variables":{"sort":"DEFAULT","location":{"latitude":null,"longitude":null,"city":"576d0619d53f3d80945f9805","distanceMax":null},"search":"","cursor":""},"query":"query catalogProductsBoard($sort: Sort, $attributes: [AttributeItem\u0021], $location: LocationInput, $cursor: Cursor\u0021, $search: String, $datePublished: DateInput) {\\n feed(input: {sort: $sort, attributes: $attributes, location: $location, search: $search, datePublished: $datePublished}, after: $cursor) {\\n items {\\n ... on BannerItem {\\n type\\n banner {\\n title\\n description\\n buttonTitle\\n imageURL\\n __typename\\n }\\n __typename\\n }\\n ...PromotedProductBoardCard\\n ...ProductBoardCard\\n __typename\\n }\\n pageInfo {\\n cursor\\n hasNextPage\\n personalSearchId\\n productsAnalytics {\\n searchId\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\\nfragment PromotedProductBoardCard on PromotedProductItem {\\n product: productPromoted {\\n ...ProductCardFragment\\n __typename\\n }\\n productAnalytics {\\n promotionType\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ProductCardFragment on Product {\\n id\\n categoryId: category\\n subcategoryId: subcategory\\n price {\\n origPrice {\\n price\\n __typename\\n }\\n realPrice {\\n price\\n __typename\\n }\\n realPriceText\\n discount\\n __typename\\n }\\n url\\n images {\\n id\\n num\\n url\\n __typename\\n }\\n name\\n location {\\n cityName\\n city\\n addressText\\n description\\n latitude\\n longitude\\n __typename\\n }\\n isPromoted\\n favorite {\\n enabled\\n __typename\\n }\\n deliveryAvailable\\n paymentAvailable\\n branding {\\n imageUrl\\n rating\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ProductBoardCard on ProductItem {\\n product {\\n ...ProductCardFragment\\n __typename\\n }\\n productAnalytics {\\n promotionType\\n __typename\\n }\\n __typename\\n}\\n"}'; /* $data = '{"operationName":"catalogProductsBoard","variables":{"sort":"DEFAULT","location":{"latitude":null,"longitude":null,"city":"576d0619d53f3d80945f9805","distanceMax":null},"search":"","cursor":""},"query":"query catalogProductsBoard($sort: Sort, $attributes: [AttributeItem\u0021], $location: LocationInput, $cursor: Cursor\u0021, $search: String, $datePublished: DateInput) {\\n feed(input: {sort: $sort, attributes: $attributes, location: $location, search: $search, datePublished: $datePublished}, after: $cursor) {\\n items {\\n ... on BannerItem {\\n type\\n banner {\\n title\\n description\\n buttonTitle\\n imageURL\\n __typename\\n }\\n __typename\\n }\\n ...PromotedProductBoardCard\\n ...ProductBoardCard\\n __typename\\n }\\n pageInfo {\\n cursor\\n hasNextPage\\n personalSearchId\\n productsAnalytics {\\n searchId\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\\nfragment PromotedProductBoardCard on PromotedProductItem {\\n product: productPromoted {\\n ...ProductCardFragment\\n __typename\\n }\\n productAnalytics {\\n promotionType\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ProductCardFragment on Product {\\n id\\n categoryId: category\\n subcategoryId: subcategory\\n price {\\n origPrice {\\n price\\n __typename\\n }\\n realPrice {\\n price\\n __typename\\n }\\n realPriceText\\n discount\\n __typename\\n }\\n url\\n images {\\n id\\n num\\n url\\n __typename\\n }\\n name\\n location {\\n cityName\\n city\\n addressText\\n description\\n latitude\\n longitude\\n __typename\\n }\\n isPromoted\\n favorite {\\n enabled\\n __typename\\n }\\n deliveryAvailable\\n paymentAvailable\\n branding {\\n imageUrl\\n rating\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ProductBoardCard on ProductItem {\\n product {\\n ...ProductCardFragment\\n __typename\\n }\\n productAnalytics {\\n promotionType\\n __typename\\n }\\n __typename\\n}\\n"}'; */ /*$data = '{"operationName":"catalogProductsBoard","variables":{"sort":"DEFAULT","attributes":[{"slug":"price","value":null,"from":null,"to":null},{"slug":"categories","value":["nedvijimost"],"from":null,"to":null}],"datePublished":null,"location":{"latitude":null,"longitude":null,"city":"576d0619d53f3d80945f9805","distanceMax":null},"search":"","cursor":""},"query":"query catalogProductsBoard($sort: Sort, $attributes: [AttributeItem\u0021], $location: LocationInput, $cursor: Cursor\u0021, $search: String, $datePublished: DateInput) {\n feed(input: {sort: $sort, attributes: $attributes, location: $location, search: $search, datePublished: $datePublished}, after: $cursor) {\n items {\n ... on BannerItem {\n type\n banner {\n title\n description\n buttonTitle\n imageURL\n __typename\n }\n __typename\n }\n ...PromotedProductBoardCard\n ...ProductBoardCard\n __typename\n }\n pageInfo {\n cursor\n hasNextPage\n personalSearchId\n productsAnalytics {\n searchId\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PromotedProductBoardCard on PromotedProductItem {\n product: productPromoted {\n ...ProductCardFragment\n __typename\n }\n productAnalytics {\n promotionType\n __typename\n }\n __typename\n}\n\nfragment ProductCardFragment on Product {\n id\n categoryId: category\n subcategoryId: subcategory\n price {\n origPrice {\n price\n __typename\n }\n realPrice {\n price\n __typename\n }\n realPriceText\n discount\n __typename\n }\n url\n images {\n id\n num\n url\n __typename\n }\n name\n location {\n cityName\n city\n addressText\n description\n latitude\n longitude\n __typename\n }\n isPromoted\n favorite {\n enabled\n __typename\n }\n deliveryAvailable\n paymentAvailable\n branding {\n imageUrl\n rating\n __typename\n }\n __typename\n}\n\nfragment ProductBoardCard on ProductItem {\n product {\n ...ProductCardFragment\n __typename\n }\n productAnalytics {\n promotionType\n __typename\n }\n __typename\n}\n"}'; */ curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //for debug only! curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); curl_close($curl); //$resp = encodejson_decode($resp); $file = fopen("data143.json", "a+"); fwrite($file, $resp); fclose($file); //var_dump($resp); die(); return $resp; } }