Google Safe Browsing API взаимодействие с PHP

15 августа 2011 г.

Начинаем


Логотип Google
Все знают про сервисы сокращения ссылок. Для твиттера, аськи, ну в общем не важно. Так вот решил я сделать такой вот сервис, и на глаза мне попался удивительный API от Googl’а. Данный интерфейс позволяет отдавать Googl’у URL’ы либо GET запросом по одному, либо пачкой до 500 URL’ов в POST запросе. В свое время, Гугл возвращает нам ответ, является ли ссылка фишинговой. В этом топике я расскажу вам, как можно сделать POST запрос к данному API.
Для начала нам следует зарегистрировать себе apikey. Что делать дальше? Смотрите под катом.

Предположим, что у нас есть некий массив URL’ов, которые надо проверить на «вшивось». Создаем класс google_lookup_api, в котором и будем творить чудеса.

 class google_lookup_api{
 
 var $gurl="https://sb-ssl.google.com/safebrowsing/api/lookup?"; 
 var $client="firefox";
 var $apikey="your_api_key"; // сюда мы будем вводить ваш полученный ключ.
 var $apprev="1.5.2";
 var $prev="3.0";
 var $errorcode = 0; // об этом немного 
 var $errormessage = ''// позднее;

Класс нужно заполнить функциями, чем мы сейчас и займемся.

function validate($array){ // данной функции мы будем передавать массив с нашими URL'ами
 
 $itter = ceil(count($array)/500); // определяем, сколько нужно будет отправить POST запросов. Т.е. количество иттераций.
 $endarray = array(); // эта переменная послужит хранилищем результата.
 for ($u = 0; $u<$itter; $u++){ // запускаем наш цикл.
 $slice = array_slice ($array,$u*500,500);
 $value = array_values($slice);
 $newarray = $this->connect_google($value);// ссылаемся на следующую функцию
 if ($newarray){
 foreach ($newarray as $key=>$value){
 $endarray[$key]=$value;
 }
 }
 
 }
 return($endarray);
 }
 

Перейдем к основной функции класса.

function connect_google($slice){
 $newarray = array();
 $errorcode = 0;
 
 
 if (count($slice)>500) {
 $this->errorcode = 1; // в этой функции мы так же будем формировать сообщения о каких
 $this->errormessage = 'Массив превысил значения';//либо ошибках
 exit;
 }
 //отправляем пост запрос с помощью CURL'а
 $urlg = count($slice)."\n".implode("\n",$slice)."\n";
 $urls = array('google.ru'=>1, 'test'=>1);
 $url = $this->gurl."client=".$this->client."&apikey=".$this->apikey."&appver=".$this->apprev."&pver=".$this->prev;
 $ch = curl_init(); 
 curl_setopt($ch, CURLOPT_URL, $url); 
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch, CURLOPT_POST, 1); 
 curl_setopt($ch, CURLOPT_POSTFIELDS, $urlg); 
 $result = curl_exec($ch); // здесь мы получим строчку либо пустую, либо нет, в случае если в пакете имеется плохой URL
 $resultinfo = curl_getinfo($ch,CURLINFO_HTTP_CODE); // получаем коды ответа, более подробно в документации
 curl_close($ch); 
 switch($resultinfo){// обрабатываем ответы
 case 200:
 $resarray = explode("\n",$result);
 if (count($resarray)<count($slice)) {
 $this->errorcode = 3;
 $this->errormessage = 'Количество принятых URL-ов меньше количества отправленных';
 }
 else{
 unset($result);
 $valueres = current($resarray);
 } 
 foreach($slice as $key=>$value){
 if ($valueres!='ok'){
 $valueres='nok';
 }
 $newarray[$value] = $valueres;
 $valueres = next($resarray);
 } 
 break;
 case 204:
 
 reset($slice);
 foreach($slice as $key=>$value){
 $newarray[$value] = 'ok';
 }
 break;
 case 403:
 
 $this->errorcode = 2; //ошибка подключения к google api
 $this->errormessage = 'ошибка подключения к google api';
 
 break;
 case 400:
 $this->errorcode = 4;
 $this->errormessage = 'Bad Request — The HTTP request was not correctly formed.';
 break;
 case 401:
 $this->errorcode = 5;
 $this->errormessage = 'Not Authorized — The apikey is not authorized';
 break;
 case 503:
 $this->errorcode = 6;
 $this->errormessage = 'Service Unavailable — The server cannot handle the request. Besides the normal server failures, it could also indicate that the client has been “throttled” by sending too many requests';
 break;
 
 default:
 
 $this->errorcode = 7;
 $this->errormessage = 'Неизвестная ошибка';
 
 break;
 
 }
 if ($errorcode){
 
 return false; 
 
 }
 return $newarray;
 }

Теперь нам осталось лишь создать функцию выдачи ошибок, если таковые имеются.

function getError(){
 $error=array();
 $error[$this->errorcode]= $this->errormessage;
 return($error);
 
 }
 
 }

Литература: Google Safe Browsing API

Теги:
рубрика PHP
  • Похожие статьи
  • Предыдущие из рубрики