<?php

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

//////////////////////////////////////////////////// BasedWebPAI /////////////////////////////////////////////////////////////////////////
class CBaseWebAPI
{
    
///////////////////////////////////////////////////

    // запрашиваемый урл с параметрами
    
var $requested_url null ;

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

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

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

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

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

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

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

        
// пауза между запросами
        
$this->pause_per_request=$pause_per_request;

        
// пауза если наш запрос был забанен или прокси не справился
        
$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_REFERER$this->site);    
        
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->body=str_replace("\t","",$this->body);
        
$this->body=str_replace("\r","",$this->body);
        
$this->body=str_replace("\n","",$this->body);

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

    
// убрать из запроса лишнее
    
protected function pre_procced_results()
    {
    }

    
// проверить правильно ли прошел запрос
    
protected function is_query_good()
    {
        
$res = ($this->body=="")==0;    
        return 
$res;    
    }

    
// лог плохого запроса
    
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()
    {    
        return 
true;
    }

    
// сохранить обработанные поисковые результаты в файл 
    
function run()
    {    
        
// пройдемся по всем запросам
        
$queries_proceeded=1;
        while (
true)
        {
            
// получим запрос
            
global $queries;
            
$query=$queries->get_next();
            if (
$query===null)
                break;        
    
            
// получим поисковые результаты для запроса через Google API (используя прокси)
            
if ($this->get($query))
            {
                
// добавим поисковые результаты по заданному запросу в файл
                
$this->save();
            }

            
// укажем что данные обработаны
            
$queries->step_complete();

            
// укажем общее количество обработанных данных
            
$queries_proceeded++;

            
// пауза между запросами
            
sleep($this->pause_per_request);
        }

        
// конец
        
global $log;
        
$log->event("Получено поисковых результатов по ".$queries_proceeded." запросам  ");    
    }

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