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;
}
}