<?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=" — ";
$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(" ","",$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(" ","",$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;
}
///////////////////////////////////////////////////
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?>