<?php

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

//////////////////////////////////////////////////// Google API Search Results /////////////////////////////////////////////////////////////////////////
class CGoogleSuggest
{
    
///////////////////////////////////////////////////

    // запрашиваемый урл с параметрами
    
var $requested_url "http://clients1.google.com/complete/search?output=toolbar&num=20&hl=en&pq=suggestqueries.google.com&cp=1&q=";

    
// путь для записи результатов
    
var $out_path="out/results.txt";

    
// пауза после наудачных запросов
    
var $pause_bad_request=60;

    
// использовать ли прокси при запросе
    
var $use_proxy=true;
    
// максимальное время запроса через прокси
    
var $proxy_timeout=10;

    
// параметр - текущий запрос
    
var $current_query;
    
// дополнительный параметр - сайт
    
var $site="localhost";
    
// прокси через который было получение
    
var $proxy=null;

    
// промежуточные результаты 1
    
var $body;

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

    // конструктор        
    
function CGoogleSuggest($out_path,$pause_bad_request,$use_proxy,$proxy_timeout)
    {
        
// файл для записи выходных результатов
        
$this->out_path=$out_path;

        
// пауза если наш запрос был забанен или прокси не справился
        
$this->pause_bad_request=$pause_bad_request;

        
// использовать ли пркоси
        
$this->use_proxy=$use_proxy;

        
// максимальнео время работы через прокси
        
$this->proxy_timeout=$proxy_timeout;        
    }
        
    
///////////////////////////////////////////////////

    // зададим прокси
    
protected function set_proxy($ch)
    {      
        
// зададим прокси в запрос
        
if ($this->use_proxy)
        {        
            
// получим прокси от поставщика проксей
            
global $proxies;
            
$this->proxy=$proxies->get_current_proxy();

            
// зададим прокси
            
curl_setopt($chCURLOPT_PROXY$this->proxy->get());

            
// таймаут (время за котрое прокси должно справится)
            
curl_setopt($chCURLOPT_TIMEOUT$this->proxy_timeout);

            
// лог
            
global $log;
            
$log->event_add(" [ ".$this->proxy->get()." ] ");
        }
    }    

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

        
// API url                
        
$url=$this->requested_url.urlencode(iconv("windows-1251","utf-8//IGNORE",$this->current_query));

        
// запрос
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$url);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_HEADER0); 
        
curl_setopt($chCURLOPT_ENCODING"gzip");

        
// вернем подготовленный запрос
        
return $ch;
    }

    
// выполним запрос
    
protected function run_query($ch)
    {
        
// зададим прокси
        
$this->set_proxy($ch);

        
// выполниить запрос
        
$this->body curl_exec($ch);    

        
// преобработать запрос
        
$this->pre_procced_results();
    }

    
// убрать из запроса лишнее
    
protected function pre_procced_results()
    {
        
// убрать из запроса лишнее
        
$this->body=str_replace("\t","",$this->body);
        
$this->body=str_replace("\r","",$this->body);
        
$this->body=str_replace("\n","",$this->body);
    }

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

    
// лог плохого запроса
    
protected function log_bad_query()
    {                
        
// событие статуса неудачи
        
global $log;
        if (
$this->body=="")
            
$log->event_add(" E ");
        else
            
$log->event_add(" B ");
    }

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

    // сделать запрос поисковых результатов через Google API
    
function get($query)
    {
        
// начало события
        
global $log;
        
$log->event_begin("обрабатываем $query : ");        
    
        
// инициализируем запрос
        
$ch=$this->init_query($query);

        
// выполним запрос
        
$this->run_query($ch);

        
// цикл пока не достучимся - с заданной паузой
        
$num_bad=0;
        while ( !
$this->is_query_good() )
        {
            
// лог
            
$this->log_bad_query();

            
// прокси не сработал
            
if ($this->proxy)
                
$this->proxy->report(0);

            
// пауза
            
sleep($this->pause_bad_request);

            
// условие выхода
            
$num_bad++;
            if (
$num_bad>50)
                die(
"Превышено число плохих запросов");

            
// перезапрос
            
$this->run_query($ch);
        }
        
// прокси сработал
        
if ($this->proxy)
            
$this->proxy->report(1);

        
// закроем запрос
        
curl_close($ch);
    
        
// отработали успешно
        
return true;
    }

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

    // сохранить обработанные поисковые результаты в файл 
    
function save()
    {    
        
// лог
        
global $log;
    
        
// префиксы для разбора
        
$prefix1="<suggestion data=\"";
        
$prefix2="\"/>";

        
CTextFile::write("c:\\1.txt",$this->body);
        
$index1=1;
        
$index2=1;
        
$out_str $this->current_query.":";
        while (
true)
        {
                
$index1=strpos($this->body,$prefix1,$index2);
                if (
$index1===false)
                    break;
                
$index2=strpos($this->body,$prefix2,$index1);
                if (
$index2===false)
                    break;
                
$out_str=$out_str.substr($this->body$index1+strlen($prefix1), $index2-$index1-strlen($prefix1))."|na|";

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

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

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