<?php

//*************************************************************************
// yandex_wordstat.php : implementation file
// Version : 3.0
// Date :  December 2013
// Author : Andre Dolenko
// Email :  bigfozzy@gmail.com
// Latest Version : http://x-datas.com/
//*************************************************************************

//////////////////////////////////////////////////// Yandex Wordtstat /////////////////////////////////////////////////////////////////////////
class CYandexWordstat extends CBaseWebAPI
{
    
///////////////////////////////////////////////////

    // конструктор        
    
function CYandexWordstat($out_path,$pause_per_request,$pause_bad_request,$use_proxy,$proxy_timeout)
    {
        
// имя сборщика
        
$this->name="Сборщик подсказок Yandex.Wordstat";
        
// аббревиатура сборщика
        
$this->abbreviature="YWSTAT";

        
// запрашиваемый урл с параметрами
        
$this->requested_url "http://wordstat.yandex.ru";

        
// иконка сборщика
        
global $app;        
        
$app->set_tray_icon(__FILE__.".ico");

        
// базовый конструктор
        
$this->CBaseWebAPI($out_path,$pause_per_request,$pause_bad_request,$use_proxy,$proxy_timeout);
    }

    
// надо ли пропускать запрс
    
protected function is_skip_query($query)
    {      
        if ( 
strpos($query,"-")!==false )
            return 
true;
        if ( 
strpos($query,"«")!==false )
            return 
true;
    }    
    
// инициализировать сборщкик
    
protected function init()
    {
        
// глобальные
        
global $browser,$anchor,$input,$button;

        
// переходим на старотовую страницу
        
$browser->navigate($this->requested_url);

        
// разлогинемся
        //$anchor->click_by_inner_text("Выход",false);
        //sleep(2);

        // залогинится
        
$this->login();
    }
    
// залогинится
    
protected function login()
    {
        
// глобальные
        
global $browser,$anchor,$input,$button,$label;

        
// логинемся
        
if ($anchor->is_exist_by_inner_text("Войти",false))
        {
            
// перейдем к форме логина
            
$anchor->get_by_inner_text("Войти",false)->send_mouse_click();
            
sleep(2);

            
// получим случайные логин-пароль
            
$login_psw=explode(";",CTextFile::get_random_line("in/accounts.txt"));
            
$login=$login_psw[0];
            
$password=$login_psw[1];
                            
            
// залогинемся
            
while ($input->get_x_by_attribute("id","b-domik_popup-username",false)>0)
            {
                echo 
"logining ... ";
                
$input->get_by_attribute("id","b-domik_popup-username",false)->send_input($login."\t");
                
$input->get_by_attribute("id","b-domik_popup-password",false)->send_input($password);
                
$button->get_by_number(2)->mouse_move(2,2);
                
$button->get_by_number(2)->send_mouse_click(2,2);
                
sleep(3);            
                if (
$label->get_x_by_inner_text("пароль",false)>0)
                {
                    echo 
"logining 2 ... ";
                    
$input->get_by_attribute("name","login",false)->send_input($login."\t");
                    
$input->get_by_attribute("name","password",false)->send_input($password);
                    
$button->get_by_number(0)->mouse_move(2,2);
                    
$button->get_by_number(0)->send_mouse_click(2,2);
                }
            }

        }
    }
        
    
///////////////////////////////////////////////////

    // проверить правильно ли прошел запрос
    
protected function is_query_good()
    {    
        if (
$this->body=="")
            return 
false;                        
        return 
strpos($this->body,$this->current_query)!=false;    
    }

    
///////////////////////////////////////////////////

    // выполним запрос
    
protected function init_query($query)
    {
        
// текущий запрос
        
$this->current_query=$query;

        
// больше ничего не надо
        
return null;
    }

    
// выполним запрос
    
protected function run_query($ch)
    {
        
// глобальные
        
global $input,$button,$webpage,$span,$anchor,$image,$browser,$app;

        
// проверить что нужен логин
        
if ($input->get_x_by_name("passwd")>0)
            
$this->login();

        
// проверить капчу
        
if ($image->get_x_by_attribute("src","captcha.yandex.net",false)>0)
            
$app->pause(0);
        if (
$span->get_x_by_inner_text("Отправить ещё раз",false)>0)
        {
            
sleep(10);
            
$span->click_by_inner_text("Отправить ещё раз",false);
            
sleep(10);
        }



        
// очистим введенное слово
        
sleep(1);
        if (
$span->is_exist_by_attribute("class","b-form-input__clear b-form-input__clear_visibility_visible",false))
            
$span->get_by_attribute("class","b-form-input__clear b-form-input__clear_visibility_visible",false)->send_mouse_click();
        
sleep(1);

        
// проверить капчу
        
if ($image->get_x_by_attribute("src","captcha.yandex.net",false)>0)
            
$app->pause(0);
        if (
$span->get_x_by_inner_text("Отправить ещё раз",false)>0)
        {
            
sleep(10);
            
$span->click_by_inner_text("Отправить ещё раз",false);
            
sleep(10);
        }

        
// ввести слово
        
$input->get_by_name("text")->set_value("");
        
$input->get_by_name("text")->send_input($this->current_query,0);
        
$button->get_by_attribute("class","b-form-button__input",false)->send_mouse_move();        
        
$button->get_by_attribute("class","b-form-button__input",false)->click();        
        
sleep(2);

        
// проверим капчу
        
if ($image->get_x_by_attribute("src","captcha.yandex.net",false)>0)
            
$app->pause(0);
        if (
$span->get_x_by_inner_text("Отправить ещё раз",false)>0)
        {
            
sleep(10);
            
$span->click_by_inner_text("Отправить ещё раз",false);
            
sleep(10);
        }

        
// результат
        
$this->body    $webpage->get_body();
    }

    
// загрузим следующую страницу данных для текущего запроса
    
protected function load_next_page($ch)
    {
            
// глобальные
            
global $input,$button,$webpage,$span,$anchor,$image,$browser,$app;
            
            
// перейдем к следующей странице
            
if (!$anchor->click_by_inner_text("Следующая",false))
                return 
false;
            
sleep(2);

            
// сохраним все
            
$this->save();

            
// проверим капчу
            
if ($image->get_x_by_attribute("src","captcha.yandex.net",false)>0)
                
$app->pause(0);

            
// результат
            
$this->body    $webpage->get_body();
            return 
true;
    }

    
///////////////////////////////////////////////////

    // перезапуск
    
protected function restart()
    {
        global 
$script_main_file,$app,$log;
        
$log->event("restarting $script_main_file .... ");
        
$log->event_mail("restarting $script_main_file .... ",$this->write_stat());
        
$app->restart($script_main_file);
        die();
    }

    
// сохранить обработанные поисковые результаты в файл 
    
function save()
    {    
        
// лог
        
global $log;        
    
        
// число полученных субданных по запросу
        
$subdatas_count=0;

        
// префиксы для разбора
        
$prefix1="href=\"/#!/?";
        
$prefix1_1="\">";
        
$prefix2="</a>";
        
        
$prefix3="td-count\">";
        
$prefix4="</td>";

        
$prefix0="&nbsp;—&nbsp;";
        
$prefix0_1=" показ";
        
$index1=strpos($this->body,$prefix0,0);        
        
$tmp="";
        if (
$index1!==false)
        {
                
$index2=strpos($this->body,$prefix0_1,$index1+strlen($prefix0)+1);
                if (
$index2!==false)
                    
$tmp=substr($this->body$index1+strlen($prefix0), $index2-$index1-strlen($prefix0));                
        }        
        
$tmp=str_replace("&nbsp;","",$tmp);
        
$tmp=str_replace("</td>","",$tmp);
        

        
$index1=-1;
        
$index2=-1;        
        
$out_str $this->current_query.":$this->current_query|".$tmp."|";
        while (
true)
        {
                
$index1=strpos($this->body,$prefix1,$index2+strlen($prefix4)+1);
                if (
$index1===false)
                    break;
                
$index1=strpos($this->body,$prefix1_1,$index1+strlen($prefix1)+1);
                if (
$index1===false)
                    break;
                
$index2=strpos($this->body,$prefix2,$index1+strlen($prefix1_1)+1);
                if (
$index2===false)
                    break;                
                
$tmp=substr($this->body$index1+strlen($prefix1_1), $index2-$index1-strlen($prefix1_1));                
                
$out_str.=$tmp."|";

                
$index1=strpos($this->body,$prefix3,$index2+strlen($prefix2)+1);
                if (
$index1===false)
                    break;
                
$index2=strpos($this->body,$prefix4,$index1+strlen($prefix3)+1);
                if (
$index2===false)
                    break;                
                
$tmp=substr($this->body$index1+strlen($prefix3), $index2-$index1-strlen($prefix4));                
                
$tmp=str_replace("&nbsp;","",$tmp);
                
$tmp=str_replace("</td>","",$tmp);
                
$out_str.=$tmp."|";

                
// число полученных субданных по запросу
                
$subdatas_count++;

                
// лог
                
$log->event_add(" . ");
        }
        
$out_str=trim($out_str,"|");        
        
        
// добавим в результаты
        
CTextFile::add($this->out_path,$out_str."\n");
        
// конец события
        
$log->event_end("");        

        
// вернем число добавленных поисковых результатов
        
return $subdatas_count;
    }

    
///////////////////////////////////////////////////
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?>