File: //home/temp/yarustone.ru/ysearch.php
<?php
function pareser_log($data) {
	//file_put_contents('pareser_log.txt', $data . "\n", FILE_APPEND);
}
pareser_log($_SERVER['QUERY_STRING']);
class Punycode {
    const BASE = 36;
    const TMIN = 1;
    const TMAX = 26;
    const SKEW = 38;
    const DAMP = 700;
    const INITIAL_BIAS = 72;
    const INITIAL_N = 128;
    const PREFIX = 'xn--';
    const DELIMITER = '-';
    protected static $_encodeTable = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',);
    protected static $_decodeTable = array('a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5, 'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, 'm' => 12, 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17, 's' => 18, 't' => 19, 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23, 'y' => 24, 'z' => 25, '0' => 26, '1' => 27, '2' => 28, '3' => 29, '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34, '9' => 35);
    protected $encoding;
    public function __construct($encoding = 'UTF-8') {
        $this->encoding = $encoding;
    }
    public function encode($input) {
        $parts = explode('.', $input);
        foreach ($parts as &$part) {
            $part = $this->_encodePart($part);
        }
        return implode('.', $parts);
    }
    protected function _encodePart($input) {
        $codePoints = $this->_codePoints($input);
        $n = self::INITIAL_N;
        $bias = self::INITIAL_BIAS;
        $delta = 0;
        $h = $b = count($codePoints['basic']);
        $output = '';
        foreach ($codePoints['basic'] as $code) {
            $output .= $this->_codePointToChar($code);
        }
        if ($input === $output) {
            return $output;
        }
        if ($b > 0) {
            $output .= self::DELIMITER;
        }
        $codePoints['nonBasic'] = array_unique($codePoints['nonBasic']);
        sort($codePoints['nonBasic']);
        $i = 0;
        $length = mb_strlen($input, $this->encoding);
        while ($h < $length) {
            $m = $codePoints['nonBasic'][$i++];
            $delta = $delta + ($m - $n) * ($h + 1);
            $n = $m;
            foreach ($codePoints['all'] as $c) {
                if ($c < $n || $c < self::INITIAL_N) {
                    $delta++;
                }
                if ($c === $n) {
                    $q = $delta;
                    for ($k = self::BASE; ; $k += self::BASE) {
                        $t = $this->_calculateThreshold($k, $bias);
                        if ($q < $t) {
                            break;
                        }
                        $code = $t + (($q - $t) % (self::BASE - $t));
                        $output .= self::$_encodeTable[$code];
                        $q = ($q - $t) / (self::BASE - $t);
                    }
                    $output .= self::$_encodeTable[$q];
                    $bias = $this->_adapt($delta, $h + 1, ($h === $b));
                    $delta = 0;
                    $h++;
                }
            }
            $delta++;
            $n++;
        }
        return self::PREFIX . $output;
    }
    public function decode($input) {
        $parts = explode('.', $input);
        foreach ($parts as &$part) {
            if (strpos($part, self::PREFIX) !== 0) {
                continue;
            }
            $part = substr($part, strlen(self::PREFIX));
            $part = $this->_decodePart($part);
        }
        return implode('.', $parts);
    }
    protected function _decodePart($input) {
        $n = self::INITIAL_N;
        $i = 0;
        $bias = self::INITIAL_BIAS;
        $output = '';
        $pos = strrpos($input, self::DELIMITER);
        if ($pos !== false) {
            $output = substr($input, 0, $pos++);
        } else {
            $pos = 0;
        }
        $outputLength = strlen($output);
        $inputLength = strlen($input);
        while ($pos < $inputLength) {
            $oldi = $i;
            $w = 1;
            for ($k = self::BASE; ; $k += self::BASE) {
                $digit = self::$_decodeTable[$input[$pos++]];
                $i = $i + ($digit * $w);
                $t = $this->_calculateThreshold($k, $bias);
                if ($digit < $t) {
                    break;
                }
                $w = $w * (self::BASE - $t);
            }
            $bias = $this->_adapt($i - $oldi, ++$outputLength, ($oldi === 0));
            $n = $n + (int)($i / $outputLength);
            $i = $i % ($outputLength);
            $output = mb_substr($output, 0, $i, $this->encoding) . $this->_codePointToChar($n) . mb_substr($output, $i, $outputLength - 1, $this->encoding);
            $i++;
        }
        return $output;
    }
    protected function _calculateThreshold($k, $bias) {
        if ($k <= $bias + self::TMIN) {
            return self::TMIN;
        } elseif ($k >= $bias + self::TMAX) {
            return self::TMAX;
        }
        return $k - $bias;
    }
    protected function _adapt($delta, $numPoints, $firstTime) {
        $delta = (int)(($firstTime) ? $delta / self::DAMP : $delta / 2);
        $delta += (int)($delta / $numPoints);
        $k = 0;
        while ($delta > ((self::BASE - self::TMIN) * self::TMAX) / 2) {
            $delta = (int)($delta / (self::BASE - self::TMIN));
            $k = $k + self::BASE;
        }
        $k = $k + (int)(((self::BASE - self::TMIN + 1) * $delta) / ($delta + self::SKEW));
        return $k;
    }
    protected function _codePoints($input) {
        $codePoints = array('all' => array(), 'basic' => array(), 'nonBasic' => array(),);
        $length = mb_strlen($input, $this->encoding);
        for ($i = 0; $i < $length; $i++) {
            $char = mb_substr($input, $i, 1, $this->encoding);
            $code = $this->_charToCodePoint($char);
            if ($code < 128) {
                $codePoints['all'][] = $codePoints['basic'][] = $code;
            } else {
                $codePoints['all'][] = $codePoints['nonBasic'][] = $code;
            }
        }
        return $codePoints;
    }
    protected function _charToCodePoint($char) {
        $code = ord($char[0]);
        if ($code < 128) {
            return $code;
        } elseif ($code < 224) {
            return (($code - 192) * 64) + (ord($char[1]) - 128);
        } elseif ($code < 240) {
            return (($code - 224) * 4096) + ((ord($char[1]) - 128) * 64) + (ord($char[2]) - 128);
        } else {
            return (($code - 240) * 262144) + ((ord($char[1]) - 128) * 4096) + ((ord($char[2]) - 128) * 64) + (ord($char[3]) - 128);
        }
    }
    protected function _codePointToChar($code) {
        if ($code <= 0x7F) {
            return chr($code);
        } elseif ($code <= 0x7FF) {
            return chr(($code >> 6) + 192) . chr(($code & 63) + 128);
        } elseif ($code <= 0xFFFF) {
            return chr(($code >> 12) + 224) . chr((($code >> 6) & 63) + 128) . chr(($code & 63) + 128);
        } else {
            return chr(($code >> 18) + 240) . chr((($code >> 12) & 63) + 128) . chr((($code >> 6) & 63) + 128) . chr(($code & 63) + 128);
        }
    }
}
class GoogleTopVisorParser {
    private $api_key;
    public $api_url = 'https://api.topvisor.ru/';
    function __construct($api_key) {
        $this->api_key = $api_key;
    }
    private function generateUrl($params) {
        $url = $this->api_url . '?api_key=' . $this->api_key;
        foreach($params as $key=>$value) {
            $_tmp = preg_replace('/\ +/u', '%20', $value);
            $url .= '&' . $key . '=' . $_tmp;
        }
        return $url;
    }
    public function executeResponse($params, $post = array()) {
		pareser_log(var_export($params, true));
		pareser_log(var_export($post, true));
        $url = $this->generateUrl($params);
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		if(!empty($post)) {
			curl_setopt($curl, CURLOPT_POST, 1);
			curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
		}
        $response = curl_exec($curl);
        curl_close($curl);
		pareser_log($response);
        $result = json_decode($response);
        return $result;
    }
    public function getProjectList() {
        $params = array(
            'oper' => 'get',
            'module' => 'mod_projects'
        );
        return $this->executeResponse($params);
    }
    public function getProject($name) {
        $params = array(
            'oper' => 'get',
            'module' => 'mod_projects',
			'func' => 'v2'
            //'method' => 'full',
			
        );
		$post = array(
			'search_str' => $name
		);
        $projects =  $this->executeResponse($params, $post);
        $_project = false;
        if(!empty($projects)) {
            foreach($projects as $project) {
                if($project->name == $name) {
                    $_project = $project;
                }
            }
        }
        return $_project;
    }
    public function getResponseList($filters, $_project = false) {
        if(isset($filters->domain) && !empty($filters->domain)) {
            $project = ($_project !== false) ? $_project : $this->getProject($filters->domain);
            if (isset($project->id)) {
                $params = array(
                    'oper' => 'get',
                    'module' => 'mod_keywords',
                    'post[project_id]' => $project->id
                );
                $response = $this->executeResponse($params);
                return $response;
            }
            return 0;
        }
        return 0;
    }
    public function addPhrase($filters) {
        if(isset($filters->domain) && !empty($filters->domain) ||
            isset($filters->phrase) && !empty($filters->phrase)) {
            $project = $this->getProject($filters->domain);
            if (isset($project->id)) {
                $params = array(
                    'oper' => 'add',
                    'module' => 'mod_keywords',
                    'post[project_id]' => $project->id,
                    'post[phrase]' => $filters->phrase
                );
                return $this->executeResponse($params);
            }
            return 0;
        }
        return 0;
    }
    public function startReposition($filters) {
        if(isset($filters->domain) && !empty($filters->domain)) {
            $project = $this->getProject($filters->domain);
            if (isset($project->id)) {
                $params = array(
                    'oper' => 'edit',
                    'module' => 'mod_keywords',
                    'method' => 'parse_task',
                    'post[id]' => $project->id
                );
                return $this->executeResponse($params);
            }
            return 0;
        }
        return 0;
    }
    private function getCodeCity($city) {
        $cities = array(
            // KZ
            'алматы' => array(
                'region_key' => '162',
                'region_lang' => 'en' ),
            'актобе' => array(
                'region_key' => '20273',
                'region_lang' => 'en' ),
            'астана' => array(
                'region_key' => '163',
                'region_lang' => 'en' ),
            'караганда' => array(
                'region_key' => '164',
                'region_lang' => 'en' ),
            'шымкент' => array(
                'region_key' => '221',
                'region_lang' => 'en' ),
            'костанайская область' => array(
                'region_key' => '29412',
                'region_lang' => 'en' ),
            'шимкент' => array(
                'region_key' => '221',
                'region_lang' => 'en' ),
            'уральск' => array(
                'region_key' => '10305',
                'region_lang' => 'en' ),
            'западно-казахстанская область' => array(
                'region_key' => '29410',
                'region_lang' => 'en' ),
            'павлодар'       => array(
				'region_key' => '190',
                'region_lang' => 'en' ),
            'талдыкорган'       => array(
				'region_key' => '10303',
                'region_lang' => 'en' ),
            'усть-каменогорск'       => array(
				'region_key' => '10306',
                'region_lang' => 'en' ),
            'актау'       => array(
				'region_key' => '29575',
                'region_lang' => 'en' ),
            'актобе'       => array(
				'region_key' => '20273',
                'region_lang' => 'en' ),
            'казахстан'       => array(
				'region_key' => '159',
                'region_lang' => 'en' ),
			'атырау'       => array(
				'region_key' => '10291',
                'region_lang' => 'en' ),
			'кокшетау'       => array(
				'region_key' => '20809',
                'region_lang' => 'en' ),
            // RU
            'белогорск'          => array('region_key' => '11374'),
            'омск'          => array('region_key' => '66'),
            'томск'          => array('region_key' => '67'),
            'москва'        => array('region_key' => '213'),
            'калининград'        => array('region_key' => '22'),
            'краснодар'        => array('region_key' => '35'),
            'кемерово'        => array('region_key' => '64'),
            'саратов'        => array('region_key' => '194'),
            'воронеж'        => array('region_key' => '193'),
            'красноярск'    => array('region_key' => '62'),
            'пенза'    => array('region_key' => '49'),
            'комсомольск-на-амуре'    => array('region_key' => '11453'),
            'самара'    => array('region_key' => '51'),
            'иркутск'       => array('region_key' => '63'),
            'пермь'       => array('region_key' => '50'),
            'ижевск'       => array('region_key' => '44'),
            'волгоград'       => array('region_key' => '38'),
            'сургут'        => array('region_key' => '973'),
            'оренбург'   => array('region_key' => '48'),
            'новосибирск'   => array('region_key' => '65'),
            'владивосток'   => array('region_key' => '75'),
            'тюмень'        => array('region_key' => '55'),
            'сочи'          => array('region_key' => '239'),
            'хабаровск'     => array('region_key' => '76'),
            'белгород'      => array('region_key' => '4'),
            'якутск'      => array('region_key' => '74'),
            'челябинск'     => array('region_key' => '56'),
            'ярославль'     => array('region_key' => '16'),
            'тверь'         => array('region_key' => '14'),
            'екатеринбург'        => array('region_key' => '54'),
            'новокузнецк'   => array('region_key' => '237'),
            'уфа'           => array('region_key' => '172'),
            'приморский край'           => array('region_key' => '11409'),
            'артем'           => array('region_key' => '11409'),
            'артём'           => array('region_key' => '11409'),
            'чебоксары'           => array('region_key' => '45'),
            'нижний новгород'           => array('region_key' => '47'),
            'вологда'           => array('region_key' => '21'),
            'казань'           => array('region_key' => '43'),
            'санкт-петербург'           => array('region_key' => '2'),
            'ростов-на-дону'           => array('region_key' => '39'),
            'бор'           => array('region_key' => '20037'),
            'саров'           => array('region_key' => '11083'),
            'нефтеюганск'           => array('region_key' => '11184'),
            'нижневартовск'           => array('region_key' => '1091'),
            'ноябрьск'           => array('region_key' => '11231'),
            'нягань'           => array('region_key' => '11186'),
            'ханты-мансийск'           => array('region_key' => '57'),
            'липецк'           => array('region_key' => '9'),
            'псков'           => array('region_key' => '25'),
			'барнаул'           => array('region_key' => '197'),
			'улан-удэ'           => array('region_key' => '198'),
			'новый уренгой'           => array('region_key' => '11230'),
			'чита'           => array('region_key' => '68'),
			'киров'           => array('region_key' => '46'),
			'салехард'           => array('region_key' => '58'),
			'благовещенск'           => array('region_key' => '11112'),
			'абакан'           => array('region_key' => '1095'),
			'братск'           => array('region_key' => '976'),
			'южно-сахалинск'           => array('region_key' => '80'),
			'магадан'           => array('region_key' => '79'),
			'петропавловск-камчатский'           => array('region_key' => '78'),
			'тольятти'           => array('region_key' => '240'),
			'амурск'           => array('region_key' => '11451'),
			'тула'           => array('region_key' => '15'),
			'калуга'           => array('region_key' => '6'),
			'рязань'           => array('region_key' => '11'),
			'владимир'           => array('region_key' => '192'),
			'мурманск'           => array('region_key' => '23'),
			'москва и московская область'           => array('region_key' => '1'),
			'саранск'           => array('region_key' => '42'),
			'новороссийск'           => array('region_key' => '970'),
			'киселёвск'           => array('region_key' => '11283'),
			'междуреченск'           => array('region_key' => '118792'),
			'новокузнецк'           => array('region_key' => '237'),
			'прокопьевск'           => array('region_key' => '11291'),
			'нижний тагил'           => array('region_key' => '11168'),
			'златоуст'           => array('region_key' => '11202'),
			'каменск-уральский'           => array('region_key' => '11164'),
			'курган'           => array('region_key' => '53'),
			'миасс'           => array('region_key' => '11212'),
			'новоуральск'           => array('region_key' => '11170'),
			'первоуральск'           => array('region_key' => '11171'),
			'уссурийск'           => array('region_key' => '11426'),
			'переславль-залесский'           => array('region_key' => '10837'),
			'рыбинск'           => array('region_key' => '10839'),
			'астрахань'           => array('region_key' => '37'),
			'россия'           => array('region_key' => '225'),
			'норильск'           => array('region_key' => '11311'),
			'свердловская область'           => array('region_key' => '11162'),
			'ханты-мансийский автономный округ'           => array('region_key' => '11193'),
			'ульяновск'           => array('region_key' => '195'),
			'стерлитамак'           => array('region_key' => '11116'),
			'ставрополь'           => array('region_key' => '36'),
			'армавир'           => array('region_key' => '10987'),
			'кисловодск'           => array('region_key' => '11062'),
			'невинномысск'           => array('region_key' => '11064'),
			'пятигорск'           => array('region_key' => '11067'),
			'иваново'           => array('region_key' => '5'),
			'йошкар-ола'           => array('region_key' => '41'),
			'кострома'           => array('region_key' => '7'),
			'жигулевск'           => array('region_key' => '120862'),
			'сызрань'           => array('region_key' => '11139'),
			'бийск'           => array('region_key' => '975'),
			'сарапул'           => array('region_key' => '11152'),
			'омская область'           => array('region_key' => '11318'),
        );
        $local = (isset($_GET['local'])) ? false : true;
        if ($local) {
            $city = iconv('cp1251', 'utf-8', $city);
        }
        $city = mb_convert_case($city, MB_CASE_LOWER, "UTF-8");
        foreach($cities as $key=>$_c) {
            if($key == $city) {
                return $cities[$key];
            }
        }
        return 0;
    }
    private function createProject($filters) {
        if(isset($filters->domain) && !empty($filters->domain)) {
            $params = array(
                'oper' => 'add',
                'module' =>  'mod_projects',
                'post[site]' =>  $filters->domain
            );
            return $this->executeResponse($params);
        }
    }
    public function addSearcher($filters, $_project = false) {
        $_project = ($_project !== false) ? $_project : $this->getProject($filters->domain);
        if($_project !== false) {
            $project_id = $_project->id;
            $city = $this->getCodeCity($filters->city);
            $region = $city['region_key'] . ':1:';
            $region .= (isset($city['region_lang'])) ? $city['region_lang'] : 'ru';
            $params = array(
                'oper' => 'add',
                'module' => 'mod_projects',
                'method' => 'searcher',
                'post[project_id]' => $project_id,
                'post[searcher]' => 1,
                'post[regions][]' => $region
            );
            $search = $this->executeResponse($params);
            if($search->error == true) {
                $empty = true;
                $sid = 1;
                foreach($_project->searchers as $search) {
                    $sid = $search->id;
                    foreach($search->regions as $r) {
                        if($r->key == $city['region_key']) {
                            $empty = false;
                        }
                    }
                }
                if($empty) {
                    $params = array(
                        'oper' => 'add',
                        'module' => 'mod_projects',
                        'method' => 'searcher_region',
                        'post[searcher_id]' => $sid,
                        'post[region]' => $city['region_key']
                    );
                    $response = $this->executeResponse($params);
                    return $response;
                }
                return 0;
            }
            return $search;
        }
        return 0;
    }
    public function deleteDomain($filters) {
        if(isset($filters->domain) && !empty($filters->domain)) {
            $_project = $this->getProject($filters->domain);
            if($_project === false) {
                return 0;
            } else {
                $project_id = $_project->id;
            }
            $params = array(
                'oper' => 'del',
                'module' => 'mod_projects',
                'post[id]' => $project_id,
            );
            $status = $this->executeResponse($params);
            return $status;
        }
    }
    public function checkDomain($filters) {
        if(isset($filters->domain) && !empty($filters->domain)) {
            $_project = $this->getProject($filters->domain);
            if($_project === false) {
                if($_project->error == true) {
                    die('-1');
                }
                $project = $this->createProject($filters);
                if($project->error === false) {
                    $project_id = $project->result;
                } else {
                    echo 'Project add fail: ' . $project->message;
                    exit();
                }
                $_project = $this->getProject($filters->domain);
                $project_id = $_project->id;
            } else {
                $project_id = $_project->id;
            }
            $params = array(
                'oper' => 'get',
                'module' => 'mod_keywords',
                'func' => 'percent_of_parse',
                'post[project_ids][]' => $project_id,
            );
            $status = $this->executeResponse($params);
            return $status;
        } else {
            return false;
        }
    }
    public function getCountPos($filters) {
        if(isset($filters->domain) && !empty($filters->domain)) {
            $_project = $this->getProject($filters->domain);
            if($_project === false) {
                die('-1');
            } else {
                $project_id = $_project->id;
            }
            $date = new DateTime('now');
            $city = $this->getCodeCity($filters->city);
            $params = array(
                'oper' => 'get',
                'module' => 'mod_keywords',
                'method' => 'history',
                'post[project_id]' => $project_id,
                'post[rows]' => 1000,
                'post[page]' => 1,
                'post[searcher]' => 1,
                'post[region_key]' => $city['region_key'],
                'post[group_id]' => -1,
                'post[region_lang]' => (isset($city['region_lang'])) ? $city['region_lang'] : 'ru',
                'post[date2]' => $date->format('Y-m-d'),
                'post[date1]' => $date->format('Y-m-d'),
                'post[type_range]' => 2
            );
            $phrases = $this->executeResponse($params);
            if(isset($phrases->phrases) && !empty($phrases->phrases)) {
                echo count((array)$phrases->phrases);
                die();
            } else {
                echo 0;
                die();
            }
        }
    }
    public function googleAllPos($filters) {
        if(isset($filters->domain) && !empty($filters->domain) ||
            isset($filters->phrases) && !empty($filters->phrases)) {
            $_project = $this->getProject($filters->domain);
            if($_project === false) {
                if($_project->error == true) {
                    die('-1');
                }
                $project = $this->createProject($filters);
                if($project->error === false) {
                    $project_id = $project->result;
                } else {
                    echo 'Project add fail: ' . $project->message;
                    exit();
                }
                $_project = $this->getProject($filters->domain);
                $project_id = $_project->id;
            } else {
                $project_id = $_project->id;
            }
            $aReturn = array();
            foreach($filters->phrases as $queries) {
                $filters->city = $queries->city;
                $this->addSearcher($filters, $_project);
                $respons = $this->getResponseList($filters, $_project);
                $local = (isset($_GET['local'])) ? false : true;
                $aQueries = array();
                $newQueries = array();
                foreach($queries->queries as $query) {
                    if ($local) {
                        $query->Name = iconv('cp1251', 'utf-8', mb_strtolower($query->Name));
                    }
                    $query->Name = mb_convert_case($query->Name, MB_CASE_LOWER, "UTF-8");
                    $exist = FALSE;
                    foreach ($respons as $respon) {
                        if ($respon->phrase == $query->Name) {
                            $exist = true;
                        }
                    }
                    if ($exist === FALSE) {
                        $filters->phrase = $query->Name;
                        $newQueries[$query->Id] = $query->Name;
                        //$this->addPhrase($filters);
                    } else {
                        $aQueries[$query->Id] = $query->Name;
                    }
                }
                if(!empty($newQueries)) {
                    $chunks = array_chunk($newQueries, 10, true);
                    foreach($chunks as $item) {
                        $params = array(
                            'oper' => 'add',
                            'module' => 'mod_keywords',
                            'method' => 'import',
                            'post[project_id]' => $project_id,
                            'post[phrases]' => implode('|||', $item)
                        );
                        $this->executeResponse($params);
                        foreach ($item as $_id => $_phrase) {
                            $aQueries[$_id] = $_phrase;
                        }
                    }
                }
                $date = new DateTime('now');
                $city = $this->getCodeCity($filters->city);
                $params = array(
                    'oper' => 'get',
                    'module' => 'mod_keywords',
                    'method' => 'history',
                    'post[project_id]' => $project_id,
                    'post[rows]' => 1000,
                    'post[page]' => 1,
                    'post[searcher]' => 1,
                    'post[region_key]' => $city['region_key'],
                    'post[group_id]' => -1,
                    'post[region_lang]' => (isset($city['region_lang'])) ? $city['region_lang'] : 'ru',
                    'post[date2]' => $date->format('Y-m-d'),
                    'post[date1]' => $date->format('Y-m-d'),
                    'post[type_range]' => 2
                );
                $phrases = $this->executeResponse($params);
                if(isset($phrases->phrases) && !empty($phrases->phrases)) {
                    foreach($phrases->phrases as $phrase) {
                        if(in_array($phrase->phrase, $aQueries)) {
                            $key = array_search($phrase->phrase, $aQueries);
                            $aReturn[$key] = $phrase;
                        }
                    }
                }
            }
            return $aReturn;
        }
    }
    public function googlePos($filters) {
        if(isset($filters->domain) && !empty($filters->domain) ||
            isset($filters->phrase) && !empty($filters->phrase)) {
            $local = (isset($_GET['local'])) ? false : true;
            if ($local) {
                $filters->phrase = iconv('cp1251', 'utf-8', $filters->phrase);
            }
            $filters->phrase = mb_convert_case($filters->phrase, MB_CASE_LOWER, "UTF-8");
            $_project = $this->getProject($filters->domain);
            if($_project === false) {
                if($_project->error == true) {
                    die('-1');
                }
                $project = $this->createProject($filters);
                if($project->error === false) {
                    $project_id = $project->result;
                } else {
                    echo 'Project add fail: ' . $project->message;
                    exit();
                }
                $project_id = $_project->id;
            } else {
                $project_id = $_project->id;
            }
            $searcher = $this->addSearcher($filters);
            $respons = $this->getResponseList($filters);
            $_phrase = false;
            foreach($respons as $respon) {
                if($respon->phrase == $filters->phrase) {
                    $_phrase = $respon->phrase;
                }
            }
            if($_phrase === false) {
                $phrase_id = $this->addPhrase($filters);
            }
            $date = new DateTime('now');
            $city = $this->getCodeCity($filters->city);
            $params = array(
                'oper' => 'get',
                'module' => 'mod_keywords',
                'method' => 'history',
                'post[project_id]' => $project_id,
                'post[rows]' => 1000,
                'post[page]' => 1,
                'post[searcher]' => 1,
                'post[region_key]' => $city['region_key'],
                'post[group_id]' => -1,
                'post[region_lang]' => (isset($city['region_lang'])) ? $city['region_lang'] : 'ru',
                'post[date2]' => $date->format('Y-m-d'),
                'post[date1]' => $date->format('Y-m-d'),
                'post[type_range]' => 2
            );
            usleep(100000);
            $phrases = $this->executeResponse($params);
            if(isset($phrases->phrases) && !empty($phrases->phrases)) {
                foreach($phrases->phrases as $phrase) {
                    if($phrase->phrase == $filters->phrase) {
                        return $phrase;
                    }
                }
            }
        }
    }
    public function getPosition($filters) {
        if(isset($filters->domain) && !empty($filters->domain) ||
            isset($filters->phrase) && !empty($filters->phrase)) {
            //$respons = $this->getResponseList($filters);
            $project = $this->getProject($filters->domain);
            $_project = false;
            if(!empty($project)) {
                foreach($project as $p) {
                    if($p->name == $filters->domain) {
                        $_project = $p;
                    }
                }
            }
            if ($_project !== false) {
                $project = $_project;
                /*if(empty($respons)) {
                    $id = $this->addPhrase($filters);
                }
                $respons = current($respons);*/
                $date = new DateTime('now');
                $city = $this->getCodeCity($filters->city);
                $params = array(
                    'oper' => 'get',
                    'module' => 'mod_keywords',
                    'method' => 'history',
                    'post[project_id]' => $project->id,
                    'post[rows]' => 1000,
                    'post[page]' => 1,
                    'post[searcher]' => 1,
                    'post[region_key]' => $city['region_key'],
                    'post[group_id]' => -1,
                    'post[region_lang]' => $city['region_lang'],
                    'post[date2]' => $date->format('Y-m-d'),
                    'post[date1]' => $date->format('Y-m-d'),
                    'post[type_range]' => 2
                );
                $phrases = $this->executeResponse($params);
                if(isset($phrases->phrases) && !empty($phrases->phrases)) {
                    foreach($phrases->phrases as $phrase) {
                        if($phrase->phrase == $filters->phrase) {
                            return $phrase;
                        }
                    }
                }
            }
            return 0;
        }
        return 0;
    }
}
abstract class Parse {
    protected $_query;
    protected $_lang;
    protected $_topage;
    protected $_g_city;
    protected $_site;
    protected $_sites;
    protected $_action;
    protected $_messages = array();
    const DEBUG = false;
    public function __construct($action, $site, $sites, $query, $topage) {
        $this->_query = $query;
        $this->_topage = $topage;
        $this->_site = $site;
        $this->_sites = $sites;
        $this->_action = $action;
        if (!empty($_GET['debug']) && !empty($_GET['local'])) {
            $this->DEBUG = true;
        }
    }
    //Функция подключение к интернет-странице методос cUrl
    protected function getContent($url, $filename, $cookies, $g_cookie = null) {
        if (DEBUG && (bool)$_GET['d_url']) {
            echo $url;
            die;
        }
        $agent = getUserAgent();
        $dirname = dirname($_SERVER['SCRIPT_FILENAME']) . '/';
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HEADER, 1);
        //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 2);
        curl_setopt($curl, CURLOPT_TIMEOUT, 250);
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        if (!file_exists($dirname . $filename)) {
            $f = fopen($dirname . $filename, 'w+');
            if ($f) {
                fclose($f);
            }
        }
        if ($filename) {
            curl_setopt($curl, CURLOPT_COOKIEJAR, $dirname . $filename);
        }
        if ($cookies) {
            curl_setopt($curl, CURLOPT_COOKIEFILE, $dirname . $cookies);
        }
        if ($g_cookie) {
            if (DEBUG && (bool)$_GET['d_cookie']) {
                echo $g_cookie;
                die;
            }
            curl_setopt($curl, CURLOPT_COOKIE, $g_cookie);
        }
        $response = curl_exec($curl);
        if (!empty($_GET['d_resp'])) {
            print_r($response);
            die;
        }
        $err = curl_error($curl);
        curl_close($curl);
        return $response;
    }
    protected function url($params) {
        $str = array();
        foreach ($params as $key => $value) {
            $str[] = $key . '=' . $value;
        }
        return '/search?' . implode('&', $str);
    }
    abstract public function run();
    protected function fatalError($message) {
        echo $message;
        if (!$this->DEBUG) {
            die;
        }
    }
    protected function showDebug() {
        echo '<hr>';
        foreach ($this->_messages as $key => $message) {
            echo '<b>' . $key . ':</b> ' . $message . '<br>';
        }
        echo '<hr>';
        die;
    }
}
class GoogleParse extends Parse {
    private $_banlist = array();
    const TIME_BAN = 21600;   // 6 hours = 6*60*60 sec
    private function getCookieCityByNameForGoogle($city) {
        $cities = array(
            // RU
            'омск'          => '10L7QvNGB0Lo',
            'москва'        => '10LzQvtGB0LrQstCw',
            'красноярск'    => '10LrRgNCw0YHQvdC-0Y_RgNGB0Lo',
            'иркутск'       => '10LjRgNC60YPRgtGB0Lo',
            'новосибирск'   => '10L3QvtCy0L7RgdC40LHQuNGA0YHQug',
            'владивосток'   => '10LLQu9Cw0LTQuNCy0L7RgdGC0L7Qug',
            'тюмень'        => '10YLRjtC80LXQvdGM',
            'сочи'          => '10YHQvtGH0Lg',
            'хабаровск'     => '10YXQsNCx0LDRgNC-0LLRgdC6',
            'белгород'      => '10LHQtdC70LPQvtGA0L7QtA',
            'челябинск'     => '10YfQtdC70Y_QsdC40L3RgdC6',
            'ярославль'     => '10Y_RgNC-0YHQu9Cw0LLQu9GM',
            'артем'         => '10LDRgNGC0LXQvA',
            'артём'         => '10LDRgNGC0LXQvA',
            'тверь'         => '10KLQstC10YDRjA',
            'новокузнецк'   => '10L3QvtCy0L7QutGD0LfQvdC10YbQug',
            'уфа'           => '10YPRhNCw',
            // KZ
            'астана'        => '10LDRgdGC0LDQvdCw',
            'алматы'        => '10LDQu9C80LDRgtGL',
            'павлодар'      => '10L_QsNCy0LvQvtC00LDRgA',
        );
        if ((bool)$_GET['local'] === false) {
            $city = iconv('cp1251', 'utf-8', $city);
        }
        $city = mb_convert_case($city, MB_CASE_LOWER, "UTF-8");
        if (!array_key_exists($city, $cities)) {
            $this->fatalError('NOT_FOUND_CITY');
        }
        $this->_messages['city'] = $city;
        $this->_messages['cityHash'] = $cities[$city];
        return $cities[$city];
    }
    private function getCookieForGoogle($cityCode) {
        switch ($this->_lang) {
            case 'ru':
                $ID = '70eb3af64c12cbf7';
                $U = '7ea96d9864ea3f9d';
                $TM = '1429773793';
                $LM = '1429776410';
                break;
            case 'kz':
                $ID = 'ef9b22325a8ff8d4';
                $U = 'af6ce88c48dd228a';
                $TM = '';
                $LM = '1429787830';
                break;
        }
        return 'PREF=ID=' . $ID . ':U=' . $U . ':FF=0:LD=' . $this->_lang . ':NR=10:NW=1:TM=' . $TM . ':LM=' . $LM . ':L=' . $cityCode . ':SG=1:S=7hYbppwO4E0wV36F';
    }
    protected function url() {
        $params = $this->{'url_'.$this->_lang}();
        return parent::url($params);
    }
    private function url_ru() {
        $params = new stdClass();
        $params->ie     = 'UTF-8';
        $params->q      = $this->_query;
        $params->oq     = $this->_query;
        $params->num    = $this->_topage;
        $params->start  = 0;
        $params->hl     = $this->_lang;
        $params->lr     = 'lang_' . $this->_lang;
        $params->cr     = 'country' . strtoupper($this->_lang);
        return $params;
    }
    private function url_kz() {
        $params = new stdClass();
        $params->ie     = 'UTF-8';
        $params->q      = $this->_query;
        $params->oq     = $this->_query;
        $params->num    = $this->_topage;
        $params->start  = 0;
        $params->hl     = $this->_lang;
        $params->lr     = 'lang_' . $this->_lang;
        return $params;
    }
    private function anonymousList() {
        switch ($this->_lang) {
            case 'ru':
                return array(
                    'http://0s.o53xo.m5xw6z3mmuxhe5i.cmle.ru',      // http://cameleo.ru - Хамелеон
                    'http://0s.o53xo.m5xw6z3mmuxhe5i.nblu.ru',      // http://noblock.ru - Анонимайзер NoBlock
//                    'http://sss.lnbbb.gnlttlqj.cnwz.prxs.ru',       // http://www.seogadget.ru/anonymizer
//                    'https://alu5.ejy63jwa.owl.e.s55.ru.wbprx.com', // http://hideme.ru
//                    'http://sss.lgccc.ggmuumrk.cgxa.fineseven.ru',  // http://instaway.ru
                    'http://0s.o53xo.m5xw6z3mmuxhe5i.dresk.ru',      // http://dostyp.ru
                    'https://www.google.ru',                        // google original
                );
            case 'kz':
                return array(
                    'http://0s.o53xo.m5xw6z3mmuxgw6q.cmle.ru',      // http://cameleo.ru - Хамелеон
//                    'https://alu5.ejy63jwa.tz1.e.s55.ru.wbprx.com', // http://hideme.ru
//                    'http://sss.lgccc.ggmuumrk.cgqf.fineseven.ru',  // http://instaway.ru
                    'http://sss.leaaa.geksskpi.ceod.saariselka.ru',    // http://anonymizer.ru
                    'http://sss.ljxxx.gjhpphmf.cjla.golovavpeske.ru',   // http://timp.cohula.ru
                    'http://0s.o53xo.m5xw6z3mmuxgw6q.dresk.ru',         // http://dostyp.ru
                    'https://www.google.kz',                        // google original
                );
        }
    }
    private function chooseServer() {
        $list = array_diff($this->anonymousList(), $this->_banlist);
        $index = array_rand($list);
        return isset($index) ? $list[$index] : false;
    }
    private function getBanFilePath() {
        return dirname(__FILE__) . '/tmp/.ban';
    }
    private function checkBanList() {
        $this->_banlist = $this->readBanList();
        // @TODO временное решение
        if (!count($this->_banlist)) {
            @unlink($this->getBanFilePath());
            return true;
        }
        foreach ($this->_banlist as $key => $item) {
            $time = trim($key, '_');
            if ($time + self::TIME_BAN < time()) {
                unset($this->_banlist[$key]);
            }
        }
        if (!count($this->_banlist)) {
            unlink($this->getBanFilePath());
            return true;
        }
        $this->writeBanList($this->_banlist);
    }
    private function readBanList() {
        return is_file($this->getBanFilePath()) ? array_filter(unserialize(file_get_contents($this->getBanFilePath()))) : array();
    }
    private function writeBanList($data) {
        if (!file_exists('tmp')) {
            mkdir(dirname(__FILE__) . '/tmp');
        }
        file_put_contents($this->getBanFilePath(), serialize($data));
    }
    private function addBanList($row) {
        $list = array_merge($this->readBanList(), $row);
        $this->writeBanList($list);
    }
    private function search() {
        $this->_lang = !empty($_GET['g_country']) ? $_GET['g_country'] : 'ru';
        $g_city = !empty($_GET['g_city']) ? $this->getCookieCityByNameForGoogle($_GET['g_city']) : '';
        if (!$g_city) {
            $this->fatalError('Enter City');
        }
        $g_cookie = $this->getCookieForGoogle($g_city);
        $this->_messages['query'] = $this->_query;
        if ((bool) $_GET['local'] === false) {
            $this->_query = iconv('cp1251', 'utf-8', $this->_query);
        }
        $this->_messages['site'] = $this->_site;
//        $this->_query = urlencode($this->_query);
        $this->checkBanList();
        if (!$server = $this->chooseServer()) {
            $this->fatalError('BAN');
            $this->_messages['ban-list'] = implode('<br>', $this->_banlist);
            $this->showDebug();
        }
        $URL = $server . $this->url();
        $this->_messages['url'] = '<a target="_blank" href="' . $URL . '">URL</a>';
//        print_r($URL);die;
        $content = $this->getContent($URL, false, false, $g_cookie);
//        print_r($content);
        preg_match_all("/<a href=\"\/url\?q=([^\"]*)\"/si", $content, $result);
        $result[1] = array_unique($result[1]);
        if (!count($result[1])) {
            $this->addBanList(array('_'.time() => $server));
            $this->search();
        }
        $this->_messages['links'] = implode('<br>', $result[1]);
        $this->_messages['content'] = iconv('cp1251', 'utf-8', $content);
        return $result[1];
    }
    public function run() {
        $result = $this->search();
        if (!$this->DEBUG) {
            @ob_clean();
        }
        foreach ($result as $key => $value) {
            $value = strip_tags($value);
            preg_match("/http[s]?:\/\/(([^\/]*)[^&]*)/si", $value, $domain);
            if (($this->_site) && (in_array(strtoupper($domain[2]), $this->_sites))) {
                echo($key + 1);
                if ($this->_action == 'googleposurl') {
                    echo "\n", urldecode($domain[1]);
                }
                exit;
            }
        }
        if ($this->DEBUG) {
            $this->showDebug();
        }
        $this->fatalError('1000');
    }
}
//ini_set('display_errors', 0);
//error_reporting(E_ALL ^ E_NOTICE);
//ini_set('display_errors', 1);
//error_reporting(E_ALL);
$filepath = dirname(__FILE__);
define('DEBUG', !empty($_GET['debug']));
set_time_limit(600);
//header("Content-Type: text/html; charset=utf-8") ;
$agent = $_uAgent[0];
$fuid01 = $_uAgent[1];
$cookie = $_uAgent[2];
function getUserAgent() {
    $numReg = isset($_GET['nr']) ? $_GET['nr'] : 1;
    $userAgents = array(// Chrome Олег wwwwmaster
        array('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36', '', 'yandexuid=1520537971382499386; yabs-frequency=/4/0000000000000000/lZImSBmN9zipi72y5qV45Azml1TkziznSBmNNFBMht2y5w7Ppt5ml1SX-JAmSBmNH_Woi72i5oV7Ch1mh1Tk/; Session_id=2:1393579399.0.5.105589048.8:1393579399000:1536207396:80.0.1.1.0.106623.119694.fe5f4aa332424174bb0da94a1ed367c8; yp=1401114504.mu.0#1708939399.udn.d3d3d21hc3Rlcg%3D%3D; ys=udn.d3d3d21hc3Rlcg%3D%3D; L=ZwEMU2hYB2xtfWtlV1N+cHhJdGd7RlVdGzkAJREPUBg+U08AWXg7FEM/RRoNFk0MOCUtODVVBFY4VRscNlcZNg==.1393579399.10292.270273.ef05299add811309d95bf118d48938e8; yandex_login=wwwwmaster; my=YzYBAQA='), // Опера Олег itbcom9
        // itbcom9
        array('Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.16', '517762645f874a5b.BOs1ABVIw1--HSVeDydTqCnR59kXFibBgmj-h7YFp97bpBYtJkSZy_-eP4P8ZihGEsXGYyvL6rc2cyGJ8Zjn_PbPQgQOkxc5TJpX8MS3phoJviuSmGkFGgy3L2BV60zg', 'ys=udn.aXRiY29tOQ%3D%3D#translate.opera.1.0.87; yandexuid=4678711951366778442; fuid01=517762645f874a5b.BOs1ABVIw1--HSVeDydTqCnR59kXFibBgmj-h7YFp97bpBYtJkSZy_-eP4P8ZihGEsXGYyvL6rc2cyGJ8Zjn_PbPQgQOkxc5TJpX8MS3phoJviuSmGkFGgy3L2BV60zg; _ym_visorc_1028356=b; yabs-frequency=/4/0G000DC-iL400000/1ZImSBmN9yGKht2y5oxorgzml1SXziznSBmNFC4oi72y5oV7Ch1ml1Sk/; Session_id=2:1393579621.0.5.138899851.8:1393579621000:1536207396:80.0.1.1.0.106623.249217.597c4e1fbde1c3c4377b63b944d4b86c; yp=1708939621.udn.aXRiY29tOQ%3D%3D; ys=udn.aXRiY29tOQ%3D%3D; L=YAECBWtYB2pufWNmW1Nxe3VNcGF9RF1fW2dKKhoRAAQrF1QdAn0rDkUhRhUPClRQJ30kdWwJBBI8TE4cdlJeIQ==.1393579621.10292.232770.83d1a732c53894ea2ea24dea0b95e7ef; yandex_login=itbcom9; my=YzYBAQA='),
        // FireFox Олег itbcom8
        array(' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0', '517762645f874a5b.BOs1ABVIw1--HSVeDydTqCnR59kXFibBgmj-h7YFp97bpBYtJkSZy_-eP4P8ZihGEsXGYyvL6rc2cyGJ8Zjn_PbPQgQOkxc5TJpX8MS3phoJviuSmGkFGgy3L2BV60zg', 'yandexuid=2187910801366264148; fuid01=517762645f874a5b.BOs1ABVIw1--HSVeDydTqCnR59kXFibBgmj-h7YFp97bpBYtJkSZy_-eP4P8ZihGEsXGYyvL6rc2cyGJ8Zjn_PbPQgQOkxc5TJpX8MS3phoJviuSmGkFGgy3L2BV60zg; yabs-frequency=/4/0G0007CojL400000/o3AmSBmN9ySoi72y5oxorgzml1T1sSznSBmN8Ruqi72y5oV45Azml1SkziznS80NN000/; yp=1708939859.sp.nd%3A50%3And%3A50%3And%3A50%3And%3A50%3Aundefined#1708939923.udn.aXRiY29tOA%3D%3D; my=YzYBAQA=; L=YwENBWxRD2lsdGFtW115cnVPdmR9Q1VaDmZVeBEPD0Q0AFoICD0uCV08UBQDCAEQeXolMTEBClYgW0tCJkMAZQ==.1393579923.10292.252570.dd44176f73d795a7aeae325d87cbd4fd; ys=udn.aXRiY29tOA%3D%3D; Session_id=2:1393579923.0.5.138861087.8:1393579923000:1536207396:80.0.1.1.0.106623.735671.b834866332210f531a22f8422a2f9197; yandex_login=itbcom8'),
        // itbcom7 (chrome) Алексей Червов
        array('Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36', '', 'yandexuid=2562684431384683784; __utma=190882677.249318743.1393268796.1393268796.1393268796.1; __utmc=190882677; __utmz=190882677.1393268796.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); yabs-frequency=/4/3W0008Qblb800000/4YEmSBWN8G00/; Session_id=2:1393580864.0.5.138860237.8:1393580864000:1536207396:34.0.1.1.0.106623.7960.45ee8c77e0e5211165d0ad1a5590dd55; yp=1708940864.udn.aXRiY29tNw%3D%3D; ys=udn.aXRiY29tNw%3D%3D; L=bgFaBWFQBWhocGZgUlhwentIc2N4Q1RdASBRLBoaAUViD00RVCp6VwwkSgRVFAgfLSIzJG1VBQo4AxMGMggNJQ==.1393580864.10292.284273.832f784b885656199b403f09e7776c3a; yandex_login=itbcom7; my=YzYBAQA='),
        // itbcom6 (ff) Алексей Червов
        array('Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0', '52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I', 'yandexuid=1694049311384420022; yp=1708941036.udn.aXRiY29tNg%3D%3D; my=YzYBAQA=; L=ZAFaBWpRBmpgfWRlU1J+c35Kcmh6SV5bASBRLBoaAB04WwgJDnc/Bg1xBh0CCABfeSUwLzpSBQ8oQ09BcFwTKw==.1393581036.10292.288901.ee72f8683af7f7d7d5fb38cba33f53fc; fuid01=52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I; yabs-frequency=/4/0000000000000000/bekVPvWN8G00/; ys=udn.aXRiY29tNg%3D%3D; Session_id=2:1393581036.0.5.138860096.8:1393581036000:1536207396:51.0.1.1.0.106623.219.eeae20c5229c7a5a4a5889a21a90c8c3; yandex_login=itbcom6'),
        // itbcom5 (opera) Алексей Червов
        array('Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68', '52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I', 'yandexuid=2368242411389365614; fuid01=52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I; Session_id=2:1393581179.0.5.138859677.8:1393581179000:1536207396:34.0.1.1.0.106623.2670.bebd9b14e57d7542a657e3dc05ab0e3e; yp=1708941179.udn.aXRiY29tNQ%3D%3D; ys=udn.aXRiY29tNQ%3D%3D; L=bwEYBWlYAGxvc2ZtUVp7enVNeGZ4R15ZCSMGJwUbA0BrDgoOXjw6UQx9V0QYC0kGJSVjKy1TCgw3ARJCLABaYw==.1393581179.10292.247162.fbb860a460a7abece8566bf610beeab7; yandex_login=itbcom5; my=YzYBAQA='),
        // itbcom7 (ie11) Алексей Червов
        array('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko', '52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I', 'yandexuid=942668921393581303; fuid01=52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I; Session_id=2:1393581341.0.5.138860237.8:1393581341000:1536207396:51.0.1.1.0.106623.8584.9cd09ee5c5709752f53f4e7673843476; yp=1708941341.udn.aXRiY29tNw%3D%3D; ys=udn.aXRiY29tNw%3D%3D; L=ZAFTBWlbBmpgfWRlUVh/dXtPdWV5Q15eHzxaOkAVUwAtCk0GDiAlVFknAQQHFk8MfT9kJWgEDloiB0pIK0EOKQ==.1393581341.10292.284114.2bb6576ab340374fa707663e720139cd; yandex_login=itbcom7; my=YzYBAQA='),
        // itbcom6 (safari) Алексей Червов
        array('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2', '52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I', 'L=YwEfBW1dBWxtdGFtW114cnROdWV4RFxTHTFDNgYaDhs3FQldVXggDkZ4CwUIU09ReiU7KTJIABc4Vxcdc1AcNQ==.1393581639.10292.268735.9ccda107291bfef02bf1767c20cc33c2; my=YzYBAQA=; yandex_login=itbcom6; yp=1708941639.udn.aXRiY29tNg%3D%3D; ys=udn.aXRiY29tNg%3D%3D; fuid01=52e8b50655dc1fce.NKrjdYLP_t46xcHhW_A6DS-CtAwimFKVml-WdHsToqNiseWXi728A3g-9qshJRftgOSsSpJFO1F-y7vNhT7ilod1drt-xWTPA0cvbVMCacnLS4UAZxPpMVxaVS5oxI0I; yandexuid=1406068591423468388'),
        // incognito (Chrome Cannary incognito) Евгений Ляшенко
        array('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2292.0 Safari/537.36',  // navigator.userAgent
            '54d867655b533530.pwxwvvuiGe_nt__vY-oYHJF1JMroIUCvkNvriCNoJxJKOdpG3IFcHYIjKlNn-GTnNAntdcOl7Y65iM-9oiJIcZHM99RfTLeO6y6-FGuluWEH0RRbhNfLO_yRuK1OMysC',    // fuid
            'fuid01=54d867655b533530.pwxwvvuiGe_nt__vY-oYHJF1JMroIUCvkNvriCNoJxJKOdpG3IFcHYIjKlNn-GTnNAntdcOl7Y65iM-9oiJIcZHM99RfTLeO6y6-FGuluWEH0RRbhNfLO_yRuK1OMysC; ys=wprid.1423468409201284-1346232221082392270805482-10-027; yandexuid=1652017091411610884'),);
    $count = count($userAgents);
    return $userAgents[$numReg % $count];
}
function getCountPosition($text) {
    preg_match('/ (\d+) показ[^\s]* в месяц/si', $text, $intermediateResult);
    return intval(@$intermediateResult[1]);
}
function clearHTML($text, $start_tag, $end_tag, $grab = true) {
//        $text = $t;
    $pos = 1;
    if ($start_tag == false AND $end_tag) {
        $pos_end = stripos($text, $end_tag, 0);
        if ($pos_end !== false) {
            if ($grab) {
                $pos_end += strlen($end_tag);
            }
            $text = substr_replace($text, '', 0, $pos_end - $pos);
        }
    } else {
        while ($pos !== false) {
            $pos = stripos($text, $start_tag, $pos);
            if ($pos !== false) {
                if ($end_tag == false) {
                    $text = substr_replace($text, '', $pos);
                } else {
                    $pos_end = stripos($text, $end_tag, $pos);
                    if ($pos_end !== false) {
                        if ($grab) {
                            $pos_end += strlen($end_tag);
                        }
                        $text = substr_replace($text, '', $pos, $pos_end - $pos);
                    }
                }
            }
        }
    }
    return $text;
}
/*
function getCountPosition($query){
    $URL = "http://wordstat.yandex.ru/?cmd=words&page=1&t=$query";
    $response = getContent($URL,false,"ycookie.txt");
    //
    preg_match('/( )\d+ показов в месяц/si',$response,$intermediateResult);
    preg_match('/\d+/',$intermediateResult[0],$countView);
    echo $countView[0];
}
*/
function excludeOfResult ($result, $exclude) {
    
    $lengthResult = count($result);
    $result = clearSite($result);
    $Punycode = new Punycode();
    for ($i=0; $i < $lengthResult; $i++) {
        $iSite = $Punycode->decode(mb_strtolower($result[$i]));
        $iSite = explode('.', $iSite);
        $iSite = implode(array_slice($iSite, -2), '.');
        if (in_array($iSite, $exclude)) {
            unset($result[$i]);
        }
    }
    return $result;
}
function clearSite ($listSite) {
    $clearArray = array();
    foreach ($listSite as $key => $site) {
        $temp = explode('.', $site);
        if (array_search('www', $temp)) {
            $clearArray[] = implode(array_slice($temp, -2), '.');
        } else {
            $clearArray[] = implode($temp, '.');
        }
    }
    return $clearArray;
}
function wwwExcludeSite ($excludeSite) {
    $wwwExcludeSite = array();
    foreach ($excludeSite as $key => $site) {
        $wwwExcludeSite[$key] = "www." . $site;
    }
    return $wwwExcludeSite;
}
function toLowerCaseArray ($array) {
    $lowerArray = array();
    foreach ($array as $key => $item) {
        $lowerArray[] = mb_strtolower($item);
    }
    return $lowerArray;
}
function shortenDomain ($array) {
    $resArray = array();
    foreach ($array as $key => $item) {
        $item = explode('.', $item);
        $resArray[] = implode(array_slice($item, -2), '.');
    }
    return $resArray;
}
//Определение переменных
$data = (isset($_POST['json'])) ? json_decode($_POST['json']) : array();
$queries = array();
if(!empty($data)) {
    $data = current($data->data);
    $_GET['action'] = (isset($data->action)) ? $data->action : $_GET['action'];
    $_GET['site'] = (isset($data->site)) ? $data->site : $_GET['site'];
    $queries_by_cities = $data->data;
	
	file_put_contents('data.txt', json_encode($data), FILE_APPEND);
}
$type = @$_GET['type'];
$query = @$_GET['query'];
$page = (@$_GET['page']) ? @$_GET['page'] : 0;      // Страница выдачи
$topage = (@$_GET['topage']) ? @$_GET['topage'] : 100;
$action = strtolower($_GET['action']);
$arr_exception_site = array(
    1 => "vk.com",
    2 => "facebook.com",
    3 => "yandex.ru",
    4 => "mail.ru",
    5 => "wikipedia.org",
    6 => "wikipedia.com",
    7 => "youtube.com",
    8 => "avito.ru",
    9 => "blizko.ru",
    10 => "tiu.ru",
    11 => "zoon.ru",
    12 => "pulscen.ru",
    13 => "farpost.ru",
    14 => "irr.ru",
    15 => "auto.ru",
    16 => "drom.ru",
    17 => "avtopoisk.ru",
    18 => "cto.ru",
    19 => "avtotochki.ru",
    20 => "spravker.ru",
    21 => "2gis.ru",
    22 => "autotrw.ru", 
    23 => "narule.ru",    
	24 => "antiplagiat.ru",
	25 => "text.ru",
	26 => "flagma.ru",
	27 => "regmarkets.ru",	
	28 => "urban3p.ru",
	29 => "price.ru"
    );
$arr_action = array(
    "yandexsnippet",
    "googleallpos",
    "allgooglepos",
    "googleposurlall",
    "yandexpospage",
    "yandexpos",
    "yandexposurl",
    "parseyandexpos",
    "parseyandexposurl",
    "googlepos",
    "repositiongooglepos",
    "googleposurl",
    "textnonunic",
    "update",
    "countpos",
    "wordstat",
    "getversion",
    "getalllimit",
    "getlimittoday",
    "getremainedlimit",
    "deletedomain",
    "checkdomain",
    "yandexgetall"
);
if ((!$action) || (!in_array($action, $arr_action))) {
    echo "action don't exist or isn't correct";
}
$local = (isset($_GET['local'])) ? TRUE : FALSE;
$Punycode = new Punycode();
$site = !empty($_GET['site']) ? $_GET['site'] : NULL;
if (!$local
    /*|| $action == 'googlepos'
    || $action == 'googleposurl'
    || $action == 'repositiongooglepos'
    || $action == 'googleallpos'
    || $action == 'checkdomain'
    || $action == 'deletedomain'*/) {
    $site = iconv('cp1251', 'utf-8', $site);
}
$site = $Punycode->encode($site);
$site = str_replace("www.", "", $site);
/* for manager.exe bug with domain like 123456.xn--p1ai*/
$sites = array(strtoupper($site));
if (strpos($site, 'XN--') === 0) {
    $sites[] = strtoupper(substr($site, 4));
}
$sites[] = 'WWW.' . strtoupper($site);
$query = @$_GET['query'];
/*if ($local) {
    $query = iconv('cp1251', 'utf-8',$query);
}*/
$user = @$_GET['user'];                            // пользователь
$key = @$_GET['key'];                            // ключ яндекса
$region = (@$_GET['lr']) ? @$_GET['lr'] : '';        // регион
$rstr = (@$_GET['rstr']) ? @$_GET['rstr'] : ''; // регион
$onlyregion = (@$_GET['onlyregion']) ? @$_GET['onlyregion'] : ''; // регион
$count = (@$_GET['count']) ? @$_GET['count'] : 500;
switch ($action) {
    case "yandexgetall":
    if(!$local) {
            $query = iconv('cp1251', 'utf-8', $query);
        }
        $doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
    <query>$query</query>
    <page>$page</page>
    <groupings><groupby attr="d" mode="deep" groups-on-page="$count"  docs-in-group="1" /></groupings>
</request>
DOC;
        $context = stream_context_create(array(
            'http' => array('method' => "POST", 'header' => "Content-type: application/xml", 'content' => $doc
            )));
        //exit;
        //$region .= '&rstr=-66';
        $regiontext = '&lr=' . $region;
        if ($onlyregion) $regiontext .= '&rstr=-' . $region;
        if ($rstr) $regiontext .= '&rstr=' . $rstr;
        $response = @file_get_contents('https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext, false, $context);
        if (!$response) {
            $curl = @curl_init();
            curl_setopt($curl, CURLOPT_URL, 'https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $doc);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            $response = @curl_exec($curl);
            $err = @curl_error($curl);
            @curl_close($curl);
        }
        if (!$response) {
            echo 0;
            die();
        }
        preg_match_all("/<domain>([^<]+)<\/domain>/m", $response, $result);
        preg_match_all("/<url>([^<]+)<\/url>/si", $response, $urls);
        preg_match("/<error[^>]*>([^<]+)<\/error>/si", $response, $error);
        if (count($error)) {
            if($error[1] == 'имит запросов исчерпан') $error[1] = "Лимит запросов исчерпан";
            echo $error[1];
            die();
        }
        if (!count($result[1])) {
            echo '0' . "\n" . 'result is empty';
            die();
        }
        $json = Array();
        // К нижему регистру
        $result[1] = toLowerCaseArray($result[1]);
        $site = mb_strtolower($site);
        //$result[1] = excludeOfResult($result[1], $arr_exception_site);
        $wwwsite = 'www.' . $site;
        if (in_array($site, $result[1]) || in_array($wwwsite, $result[1])) {
            $pSite = array_search($site, $result[1]);
            $pWSite = array_search($wwwsite, $result[1]);
            if (!is_bool($pSite)) {
                $posTop100 = $pSite + 1;
            } elseif (!is_bool($pWSite)) {
                $posTop100 = $pWSite + 1;
            } else {
                $posTop100 = "1000";
            }
        } else {
            $posTop100 = "1000";
        }
        //$url = (int)$posTop100 <= 100 && isset($urls[1][$posTop100 - 1])  ? $urls[1][$posTop100 - 1] : "";
    
        /*$json['site'] = Array(
            'position' => $posTop100,
            'url' => $url
        );*/
        //$xml = simplexml_load_string($response);
        $xml = $response;
        $xml = str_replace("<hlword>", "", $xml);
        $xml = str_replace("</hlword>", "", $xml);
        $xml = str_replace("<passage>", "", $xml);
        $xml = str_replace("</passage>", "", $xml);
        $xml = str_replace("</passage>", "", $xml);
        $xml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        $Punycode = new Punycode();
        
        $position = 1;
        foreach ($xml->response->results->grouping->group as $key => $item) {
            $fragmanets = parse_url($item->doc->url);
            $domain = strip_tags($fragmanets['host']);
            $domain = preg_replace("/^m\./", "", $domain);
            $domain = preg_replace("/^mobile\./", "", $domain);
            $domain = preg_replace("/^www\./", "", $domain);
            $json['sites'][] = Array(
                'domain' => $Punycode->decode(mb_strtolower($domain)),
                //'position' => $position++,
                'snippet' => Array(
                    'title' => $item->doc->title->__toString(),
                    'head' => (!$item->doc->passages) ?
                                $item->doc->headline->__toString() :
                                $item->doc->passages->__toString(),
                    //'url' => utf8_encode(urldecode($item->doc->url->__toString()))
                    'url' => ($item->doc->url->__toString())
                )
            );
        }
        
        
        $xml = simplexml_load_string($response);
        $index = $keys = $count = 0;
        foreach($xml->response->results->grouping->group as $i => $item) {
            $fragmanets = parse_url($item->doc->url);
            $list = explode('.', $fragmanets['host']);
            if(in_array($fragmanets['path'], array('/', '/index.php')) && (count($list) <= 2 || ($list[0] == 'www' && count($list) == 3))) $index++;
            
            $calc = 0;
            $words = preg_split ('/\s+/' , $query);
            foreach($words as $i => $word) {
                if($local) $word = iconv("utf-8", "cp1251", $word);
                $words[$i] = mb_strtolower($word, $local ? "cp1251" : "utf-8");
            }
            $hlwords = array();
            foreach($item->doc->title->hlword as $word) {
                if($local) $word = iconv("utf-8", "cp1251", $word);
                $hlwords[] = mb_strtolower($word, $local ? "cp1251" : "utf-8");
            }
            foreach($words as $i => $word) {
                foreach($hlwords as $i => $hlword) {
                
                    if(mb_stripos($hlword, $word, 0,  $local ? "cp1251" : "utf-8") === 0) $calc++;
                }
            }
        
            if($calc >= count($words)) $keys++;
    
            $count++;
            if ($count >= 10) break;
        }
        $json['additional'] = Array(
            'PagesMainSearch' => $index,
            'PagesKeyTitle' => $keys
        );
        function json_unescape ($matches) {
            return mb_convert_encoding(pack('H*',$matches[1]),'UTF-8','UTF-16');
        }
        /*$return = preg_replace_callback(
            '/\\\\u([0-9a-zA-Z]{4})/',
            'json_unescape',
            json_encode($json)
        );*/
        //echo $return; // 256 - JSON_UNESCAPED_UNICODE
        echo json_encode($json); // 256 - JSON_UNESCAPED_UNICODE
        exit;
        break;
    case "textnonunic":
        $items = 0;
        $doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
    <query>$query</query>
     <sortby>rlv</sortby>
    <groupings><groupby attr="d" mode="deep" groups-on-page="11"  docs-in-group="0" /></groupings>
</request>
DOC;
        $context = stream_context_create(array(
            'http' => array('method' => "POST", 'header' => "Content-type: application/xml", 'content' => $doc
            )));
        $response = @file_get_contents('https://yandex.ru/search/xml?&q=Создание&user=' . $user . '&key=' . $key, false, $context);
        preg_match_all("/(?<=<group>)(.*)(?=<\/group>)/siU", $response, $result);
        //print_r($result[0]);
        $i = 0;
        foreach ($result[0] as $site) {
            preg_match_all("/(?<=<domain>)(.*)(?=<\/domain>)/siU", $site, $sites_url);
            preg_match_all("/(?<=<passages>)(.*)(?=<\/passages>)/siU", $site, $sites_passage);
            $sites_url_result[] = $sites_url[0][0];
            $length = 0;
            $length_of_current_q = 0;
            foreach ($sites_passage[0] as $site_hlword) {
                preg_match_all("/(?<=<hlword>)(.*)(?=<\/hlword>)/siU", $site_hlword, $hlword);
                $site_hlword = str_replace("<hlword>", "", $site_hlword);
                $site_hlword = str_replace("</hlword>", "", $site_hlword);
                $site_hlword = str_replace("<passage>", "", $site_hlword);
                $site_hlword = str_replace("</passage>", "", $site_hlword);
                $len_each_word = explode(" ", $site_hlword);
                foreach ($len_each_word as $var) {
                    $var = str_replace(".", "", $var);
                    $var = str_replace("..", "", $var);
                    $var = str_replace("...", "", $var);
                    $var = str_replace(",", "", $var);
                    $var = str_replace("?", "", $var);
                    $var = str_replace("!", "", $var);
                    $var = str_replace(":", "", $var);
                    $var = str_replace(";", "", $var);
                    $var = str_replace("\"", "", $var);
                    $var = str_replace("'", "", $var);
                    $var_final_result[] = $var;
                    if (strlen($var) > 4) {
                        $var = trim($var);
                        $length_of_current_q = $length_of_current_q + strlen($var);
                    }
                }
                $hlword_final_result = null;
                foreach ($hlword[0] as $word) {
                    $word = str_replace(".", "", $word);
                    $word = str_replace("..", "", $word);
                    $word = str_replace("...", "", $word);
                    $word = str_replace(",", "", $word);
                    $word = str_replace("?", "", $word);
                    $word = str_replace("!", "", $word);
                    $word = str_replace(":", "", $word);
                    $word = str_replace(";", "", $word);
                    $word = str_replace("\"", "", $word);
                    $word = str_replace("'", "", $word);
                    if (strlen($word) > 4) {
                        $word = trim($word);
                        $length = $length + strlen($word);
                        $hlword_final_result[] = $word;
                    }
                }
                $textnonunic = $length / ($length_of_current_q / 100);
                $textnonunic = round($textnonunic);
                $latest_array[$sites_url_result[$i]] = $textnonunic;
                $i++;
            }
        }
        arsort($latest_array);
        foreach ($latest_array as $key => $var) {
            echo $var . " " . $key . "\n";
            $items++;
        }
        break;
    case "yandexpospage":
    // New Action
        if(!$local) {
            $query = iconv('cp1251', 'utf-8', $query);
        }
        $doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
    <query>$query</query>
    <page>$page</page>
    <groupings><groupby attr="d" mode="deep" groups-on-page="$count"  docs-in-group="1" /></groupings>
</request>
DOC;
        $context = stream_context_create(array(
            'http' => array('method' => "POST", 'header' => "Content-type: application/xml", 'content' => $doc
            )));
        //exit;
        //$region .= '&rstr=-66';
        $regiontext = '&lr=' . $region;
        if ($onlyregion) $regiontext .= '&rstr=-' . $region;
        if ($rstr) $regiontext .= '&rstr=' . $rstr;
        $response = @file_get_contents('https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext, false, $context);
        if (!$response) {
            $curl = @curl_init();
            curl_setopt($curl, CURLOPT_URL, 'https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $doc);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            $response = @curl_exec($curl);
            $err = @curl_error($curl);
            @curl_close($curl);
        }
        if (!$response) {
            echo 0;
            die();
        }
        preg_match_all("/<domain>([^<]+)<\/domain>/m", $response, $result);
        preg_match_all("/<url>([^<]+)<\/url>/si", $response, $urls);
        preg_match("/<error[^>]*>([^<]+)<\/error>/si", $response, $error);
        if (count($error)) {
            if($error[1] == 'имит запросов исчерпан') $error[1] = "Лимит запросов исчерпан";
            echo $error[1];
            die();
        }
        if (!count($result[1])) {
            echo '0' . "\n" . 'result is empty';
            die();
        }
        // К нижему регистру
        $result[1] = toLowerCaseArray($result[1]);
        $site = mb_strtolower($site);
        $result[1] = excludeOfResult($result[1], $arr_exception_site);
        //@ob_clean();
        $wwwsite = 'www.' . $site;
        // var_dump($result[1]);
        if (in_array($site, $result[1]) || in_array($wwwsite, $result[1])) {
            $pSite = array_search($site, $result[1]);
            $pWSite = array_search($wwwsite, $result[1]);
            if (!is_bool($pSite)) {
                $posTop100 = $pSite + 1;
            } elseif (!is_bool($pWSite)) {
                $posTop100 = $pWSite + 1;
            } else {
                $posTop100 = "1000";
            }
        } else {
            $posTop100 = "1000";
        }
        
        $resTop10 = array_slice($result[1], 0, 10);
        $resTop10 = shortenDomain($resTop10);
        $url = (int)$posTop100 <= 100 && isset($urls[1][$posTop100 - 1])  ? "|" . $urls[1][$posTop100 - 1] : "";
        echo $posTop100 . $url . "\r\n";
        
        foreach ($resTop10 as $key => $value) {
            $value = str_replace("www.", "", strip_tags($value));
            echo $Punycode->decode($value) . "\r\n";
        }
		
		
		$xml = simplexml_load_string($response);
		$index = $keys = $count = 0;
		foreach($xml->response->results->grouping->group as $i => $item) {
			$fragmanets = parse_url($item->doc->url);
			$list = explode('.', $fragmanets['host']);
			if(in_array($fragmanets['path'], array('/', '/index.php')) && (count($list) <= 2 || ($list[0] == 'www' && count($list) == 3))) $index++;
			
			$calc = 0;
			$words = preg_split ('/\s+/' , $query);
			foreach($words as $i => $word) {
				if($local) $word = iconv("utf-8", "cp1251", $word);
				$words[$i] = mb_strtolower($word, $local ? "cp1251" : "utf-8");
			}
			$hlwords = array();
			foreach($item->doc->title->hlword as $word) {
				if($local) $word = iconv("utf-8", "cp1251", $word);
				$hlwords[] = mb_strtolower($word, $local ? "cp1251" : "utf-8");
			}
			foreach($words as $i => $word) {
				foreach($hlwords as $i => $hlword) {
				
					if(mb_stripos($hlword, $word, 0,  $local ? "cp1251" : "utf-8") === 0) $calc++;
				}
			}
		
			if($calc >= count($words)) $keys++;
	
			$count++;
			if ($count >= 10) break;
		}
		echo $index . "\r\n";
		echo $keys . "\r\n";
        break;
    // End
	case "getalllimit":
	    $context = stream_context_create(array(
            'http' => array('method' => "GET", 'header' => "Content-type: application/xml" )));
        $response = @file_get_contents('https://yandex.ru/search/xml?action=limits-info&user=' . $user . '&key=' . $key , false, $context);
        echo $response;
		break;
    case "yandexpos":
    case "yandexposurl":
        if(!$local)
            $query = iconv('cp1251', 'utf-8', $query);
        $doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
    <query>$query</query>
    <page>$page</page>
    <groupings><groupby attr="d" mode="deep" groups-on-page="$count"  docs-in-group="1" /></groupings>
</request>
DOC;
        $context = stream_context_create(array(
            'http' => array('method' => "POST", 'header' => "Content-type: application/xml", 'content' => $doc
            )));
        //exit;
        //$region .= '&rstr=-66';
        $regiontext = '&lr=' . $region;
        if ($onlyregion) $regiontext .= '&rstr=-' . $region;
        if ($rstr) $regiontext .= '&rstr=' . $rstr;
        $response = @file_get_contents('https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext, false, $context);
        if (!$response) {
            $curl = @curl_init();
            curl_setopt($curl, CURLOPT_URL, 'https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $doc);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            $response = @curl_exec($curl);
            $err = @curl_error($curl);
            @curl_close($curl);
        }
        if (!$response) {
            echo 0;
            die();
        }
        //echo $response;
        preg_match_all("/<domain>([^<]+)<\/domain>/m", $response, $result);
        preg_match_all("/<url>([^<]+)<\/url>/si", $response, $urls);
        preg_match("/<error[^>]*>([^<]+)<\/error>/si", $response, $error);
        if (count($error)) {
            if($error[1] == 'имит запросов исчерпан') $error[1] = "Лимит запросов исчерпан";
            echo $error[1];
            die();
        }
        if (!count($result[1])) {
            echo '0' . "\n" . 'result is empty';
            die();
        }
        if(isset($_GET['d'])) {
            $_site = !empty($_GET['site']) ? $_GET['site'] : NULL;
            $_tsite = $Punycode->encode($_site);
            echo '<pre>';
            var_dump($query);
            var_dump($_site);
            var_dump($_tsite);
            var_dump($sites);
            var_dump($result);
            echo '</pre>';
        }
        @ob_clean();
        foreach ($result[1] as $key => $value) {
            $value = strip_tags($value);
            if (($site) && (in_array(strtoupper($value), $sites))) {
                echo $key + 1, "\r\n";
                if ($action == 'yandexposurl') {
                    echo "\n" . @$urls[1][$key];
                }
                exit;
            }
        }
        die('1000');
        //var_dump($response->response->results->grouping->group);  die;
        if ($response->response->error) {
            die('error ' . $response->response->error . '');
        }
        $i = 1;
        foreach ($response->response->results->grouping->group As $item) {
            $domain = $item->doc->domain;
            if ((strtolower($site) == strtolower($domain)) or (strtolower('www.' . $site) == strtolower($domain))) {
                echo $i;
                die;
            }
            $i++;
        }
        die('0');
    case "yandexsnippet":
        $query = iconv('cp1251', 'utf-8', $query);
        $doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
    <query>$query</query>
    <page>$page</page>
    <groupings><groupby attr="d" mode="deep" groups-on-page="$count"  docs-in-group="1" /></groupings>
</request>
DOC;
        $context = stream_context_create(array(
            'http' => array('method' => "POST", 'header' => "Content-type: application/xml", 'content' => $doc
            )));
        //exit;
        //$region .= '&rstr=-66';
        $regiontext = '&lr=' . $region;
        if ($onlyregion) $regiontext .= '&rstr=-' . $region;
        if ($rstr) $regiontext .= '&rstr=' . $rstr;
        $response = @file_get_contents('https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext, false, $context);
        if (!$response) {
            $curl = @curl_init();
            curl_setopt($curl, CURLOPT_URL, 'https://yandex.ru/search/xml?user=' . $user . '&key=' . $key . $regiontext);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $doc);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            $response = @curl_exec($curl);
            $err = @curl_error($curl);
            @curl_close($curl);
        }
        if (!$response) {
            echo 0;
            die();
        }
        preg_match_all("/<domain>([^<]+)<\/domain>/m", $response, $result);
        preg_match_all("/<url>([^<]+)<\/url>/si", $response, $urls);
        preg_match("/<error[^>]*>([^<]+)<\/error>/si", $response, $error);
        if (count($error)) {
            if($error[1] == 'имит запросов исчерпан') $error[1] = "Лимит запросов исчерпан";
            echo $error[1];
            die();
        }
        if (!count($result[1])) {
            echo '0' . "\n" . 'result is empty';
            die();
        }
        @ob_clean();
        foreach ($result[1] as $key => $value) {
            //print_r($value);
            $value = strip_tags($value);
            //print_r($value);
            if (($site) && (in_array(strtoupper($value), $sites))) {
                echo $key + 1, "\r\n";
                echo "---\r\n";
                preg_match_all("/(?<=<hlword>)(.*)(?=<\/hlword>)/siU", $response, $hlword);
                $response = str_replace("<hlword>", "", $response);
                $response = str_replace("</hlword>", "", $response);
                $response = str_replace("<passage>", "", $response);
                $response = str_replace("</passage>", "", $response);
                $response = str_replace("</passage>", "", $response);
                //print_r($response);
                $response = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
                $a = str_replace("www.", "", $response->response->results->grouping->group[$key]->doc->domain);
                $array = json_decode(json_encode($response), TRUE);
                $b = $array[response][results][grouping][group][$key][doc][snippets][adresa];
                echo "<pre>";
                //print_r($r);
                echo "</pre>";
                //вывод
                echo $response->response->results->grouping->group[$key]->doc->title, "\r\n";
                echo "---\r\n";
                echo "</br>";
                if (!$response->response->results->grouping->group[$key]->doc->passages) {
                    echo $response->response->results->grouping->group[$key]->doc->headline, "\r\n";
                } else {
                    echo $response->response->results->grouping->group[$key]->doc->passages, "\r\n";
                }
                echo "---\r\n";
                if ($response->response->results->grouping->group[$key]->doc->snippets->adresa->item) {
                    $r = $response->response->results->grouping->group[$key]->doc->snippets->adresa->item->attributes();
                    echo "</br>";
                    echo '' . $r[time] . ' ' . $r[phone] . '', "\r\n";
                    echo $r[address];
                    echo "\r\n";
                }
                echo "---\r\n";
                if ($action == 'yandexsnippet') {
                    if (substr($urls[1][$key], -1) == '/') {
                        $urls[1][$key] = substr($urls[1][$key], 0, -1);
                        echo @$urls[1][$key];
                    } else {
                        echo @$urls[1][$key];
                    }
                }
                //конец вывода
                exit;
            }
        }
        die('1000');
        //var_dump($response->response->results->grouping->group);  die;
        if ($response->response->error) {
            die('error ' . $response->response->error . '');
        }
        $i = 1;
        foreach ($response->response->results->grouping->group As $item) {
            $domain = $item->doc->domain;
            if ((strtolower($site) == strtolower($domain)) or (strtolower('www.' . $site) == strtolower($domain))) {
                echo $i;
                die;
            }
            $i++;
        }
        die('0');
    case "wordstat":
        /*
        * Ильин Олег
        * 27.08.2013
        * запрос к яндексу на WordStat
        */
        $_uAgent = getUserAgent();
        $agent = $_uAgent[0];
        $fuid01 = $_uAgent[1];
        $cookie = $_uAgent[2];
        $word = isset($_GET['words']) ? $_GET['words'] : "";
        $fields_string = array();
        $fields_string[] = "words=" . $word;
        $fields_string[] = "page_type=words";
        $fields_string[] = "map=world";
        $fields_string[] = "type=list";
        $fields_string[] = "page=1";
        if (isset($_GET['unban_wordstat'])) {
            $fields_string[] = "captcha_value=" . $_GET['captcha_value'];
            $fields_string[] = "captcha_key=" . $_GET['captcha_key'];
        }
        $paramIsOk = true;
        switch ($type) {
            case 'left':
            case 'right':
                $url = 'http://wordstat.yandex.ru/stat/words/';
                break;
            case 'count':
                $url = 'http://wordstat.yandex.ru/stat/regions/';
                break;
            default:
                $paramIsOk = false;
                break;
        }
        if (!paramIsOk) {
            echo "error param";
            exit();
        }
        /*
        https://passport.yandex.ru/passport?mode=auth&
        https://passport.yandex.ru/passport?mode=auth&msg=&retpath=http://wordstat.yandex.ru/
        retpath:http://wordstat.yandex.ru/
        */
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $fields_string));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        curl_setopt($ch, CURLOPT_REFERER, "http://wordstat.yandex.ru/");
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        $result = curl_exec($ch);
        curl_close($ch);
        $yResponse = json_decode($result);
        if ($yResponse) {
            if ($yResponse->captcha) {
                if (isset($_GET['people']) && $_GET['people'] == 1) {
                    header("Content-Type:text/html; charset=utf-8");
                    ?>
                    <form>
                        <img src='<?php echo $yResponse->captcha->url; ?>'/>
                        <br>
                        <input name='captcha_value'>
                        <input type='hidden' value='<?php echo $word; ?>' name='words'>
                        <input type='hidden' value='<?php echo isset($_GET['nr']) ? $_GET['nr'] : 1; ?>' name='nr'>
                        <input type='hidden' value='<?php echo $type; ?>' name='type'>
                        <input type='hidden' value='wordstat' name='action'>
                        <input type='hidden' value='<?php echo $yResponse->captcha->key; ?>' name='captcha_key'>
                        <input type='submit' value='unlock' name='unban_wordstat'>
                    </form>
                    <?php
                } else {
                    echo "error capcha";
                    echo $result;
                }
            } elseif ($yResponse->blocked) echo "error block";
            else if ($yResponse->data && $yResponse->key) {
                echo $agent . "\n";
                echo $fuid01 . "\n";
                echo $yResponse->key . "\n";
                echo base64_encode($yResponse->data);
            } else
                echo "error not data";
        } else {
            echo "error not decode";
        }
        exit();
        break; //--- /WordStat ---//
    case "deletedomain":
        $api_key = '32a3dbe79f1edbcdb9c5';
        $parser = new GoogleTopVisorParser($api_key);
        $filters = new stdClass();
        $s = $_GET['site'];
        $s = $Punycode->decode($s);
        $filters->domain = $s;
        $response = $parser->deleteDomain($filters);
        if($response && !empty($response)) {
            echo $response->result;
        } else {
            echo 0;
        }
        break;
    case "countpos":
        $api_key = '32a3dbe79f1edbcdb9c5';
        $parser = new GoogleTopVisorParser($api_key);
        $filters = new stdClass();
        $s = $_GET['site'];
        $s = $Punycode->decode($s);
        $filters->domain = $s;
        $filters->city = (isset($_GET['city'])) ? $_GET['city'] : '';
        if(empty($filters->city) && isset($_GET['g_city'])) {
            $filters->city = $_GET['g_city'];
        }
        
        $response = $parser->getCountPos($filters);
        break;
    case "checkdomain":
        $api_key = '32a3dbe79f1edbcdb9c5';
        $parser = new GoogleTopVisorParser($api_key);
        $filters = new stdClass();
        $s = $_GET['site'];
        $s = $Punycode->decode($s);
        $filters->domain = $s;
        $response = $parser->checkDomain($filters);
        if($response && !empty($response) && isset($response[0])) {
            echo $response[0]->percent;
        } else {
            echo '-1';
        }
        break;
    case "repositiongooglepos":
        $api_key = '32a3dbe79f1edbcdb9c5';
        $parser = new GoogleTopVisorParser($api_key);
        $filters = new stdClass();
        $s = $_GET['site'];
        $s = $Punycode->decode($s);
        $filters->domain = $s;
        $response = $parser->startReposition($filters);
        if($response->result && $response->error === false) {
            echo 'Position update started';
        } else if($response->error !== false) {
            echo $response->message;
        }
        break;
    case "googleposurlall":
    case "allgooglepos":
    case "googleallpos":
        $api_key = '32a3dbe79f1edbcdb9c5';
        $parser = new GoogleTopVisorParser($api_key);
        $filters = new stdClass();
        $site = $_GET['site'];
        $site = $Punycode->decode($site);
        $filters->domain = $site; //$site;
        $filters->phrases = $queries_by_cities;
        $tmp = $parser->googleAllPos($filters);
        $data = array();
        foreach($tmp as $key => $item) {
            $info = $item->dates[count($item->dates) - 1];
            $data[] = array(
                'Id' => $key,
                'Position' => (($info->position == ' ' || !$info->position) && $info->position != '0') ? '-1' : (($info->position == '0') ? '1000' : $info->position),
                'URL' => ($info->page) ? $info->page : ''
            );
        }
        $result = array(
            'data' => $data
        );
        header('Content-Type: application/json');
        echo json_encode($result);
        exit();
    case "googlepos":
    case "googleposurl":
        $api_key = '32a3dbe79f1edbcdb9c5';
        $parser = new GoogleTopVisorParser($api_key);
        $filters = new stdClass();
        $s = $_GET['site'];
        $s = $Punycode->decode($s);
        $filters->domain = $s; //$site;
        $filters->phrase = $query;
        $filters->city = (isset($_GET['city'])) ? $_GET['city'] : '';
        if(empty($filters->city) && isset($_GET['g_city'])) {
            $filters->city = $_GET['g_city'];
        }
        $response = $parser->googlePos($filters);
        if(isset($response->dates)) {
            $tmp = $response->dates[count($response->dates) - 1];
            if($tmp->position == ' ') {
                echo '-1';
            } elseif($tmp->position == '0') {
                echo '1000' . "\r\n";
            } else {
                echo $tmp->position . "\r";
                if($action == 'googleposurl') {
                    echo "---\r\n";
                    echo "---\r\n";
                    echo "---\r\n";
                    echo "---\r\n";
                    echo "---\r\n";
                    echo $tmp->page;
                }
            }
        } else {
            echo '-1';
        }
        /*$parse = new GoogleParse($action, $site, $sites, $query, $topage);
        $parse->run();*/
        exit;
    case "update":
        //$URI = "http://kiks.yandex.ru/su/";
        $dirname = dirname($_SERVER['SCRIPT_FILENAME']) . '/';
        $filename = trim($_SERVER['SCRIPT_NAME'], '/');
        if (move_uploaded_file($_FILES['File']['tmp_name'], $dirname . $filename)) {
            echo "File success uploaded";
        } else {
            echo "Error File failes uploaded!";
        }
        exit;
    case "getversion":
        //$time = filemtime("ysearch.php");
        //echo date("j-n-Y",$time);
        $filename = trim($_SERVER['SCRIPT_NAME'], '/');
        echo md5(file_get_contents($filename));
        break;
}
/*
?>
<?php
$action = $login = $_GET['action'];
$login = $_GET['user'];
$passwd = $_GET['passwd'];
$url = "https://passport.yandex.ru/passport?mode=auth";
// $url = "https://passport.yandex.ru/passport?mode=auth";
//$url = "http://xml.yandex.ru";
$doc = "login=$user&passwd=$passwd&from=password&retpath=http://xml.yandex.ru/stat.xml&idkey=07T13395784623V990G5eu&display=page×tamp=" . time() . '0000';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));
$dir = dirname(__FILE__);
if (!file_exists("yxml.txt")) {
    $COOKIEJAR = <<<DOC
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
.yandex.ru  TRUE    /   FALSE   0   yandex_login    itbcom4
#HttpOnly_.yandex.ru    TRUE    /   TRUE    2147483647  sessionid2  2:1374832713.12373494376999.5.138859587.8:1374832713001:1536207396:7.1.1.1.-1.96260.231.4b9714fd4e702c4c5c543925accbeed3
.yandex.ru  TRUE    /   FALSE   2147483647  my  YzYBAAA=
.yandex.ru  TRUE    /   FALSE   2147483647  yandexuid   984302381374832712
.yandex.ru  TRUE    /   FALSE   0   ys  udn.aXRiY29tNA%3D%3D
.yandex.ru  TRUE    /   FALSE   2147483647  yp  1690192713.udn.aXRiY29tNA%3D%3D
#HttpOnly_.yandex.ru    TRUE    /   FALSE   0   Session_id  2:1374832713.12373494376999.0.138859587.8:1374832713001:1536207396:7.0.1.1.-1.96260.7632.98adc147f50130ebc82f8fa404b435bb
.yandex.ru  TRUE    /   FALSE   2147483647  L   Z05CcUZDRX1+ZmZiZV5sWnZ/CFJ9Yl4BARoaCBsJW3kEEDFBGWoACS0dVRE7KAQoGxxCN2F8VwAaFx4hZzkOSQ==.1374832712.9858.297177.30b954c2eb5b5d8aa6e2ccc3d2970ce7
DOC;
    file_put_contents($dir . "/yxml.txt", $COOKIEJAR);
}
curl_setopt($curl, CURLOPT_COOKIEJAR, $dir . "/yxml.txt");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $doc);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
// var_dump($response);
//$url = "http://xml.yandex.ru/stat.xml";
$url = "https://yandex.ru/search/xml";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 2);
curl_setopt($curl, CURLOPT_COOKIEFILE, $dir . "/yxml.txt");
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
$response = curl_exec($curl);
preg_match_all("/(?<=<b class=\"text\">)(\d{1,3})(?=<\/b>)/siU", $response, $count);
//var_dump($response);
$err = curl_error($curl);
$remains = $count[0][0] - $count[0][1];
if ($action == "GetAllLimit") {
    echo "\n";
    echo "total = " . $count[0][0];
    echo "\n";
    echo "used = " . $count[0][1];
}*/