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

29 Сен
2011

Начинаем

Все знают про сервисы сокращения ссылок. Для твиттера, аськи, ну в общем не важно. Так вот решил я сделать такой вот сервис, и на глаза мне попался удивительный API от Googl’а. Данный интерфейс позволяет отдавать Googl’у URL’ы либо GET запросом по одному, либо пачкой до 500 URL’ов в POST запросе. В свое время, Гугл возвращает нам ответ, является ли ссылка фишинговой. В этом топике я расскажу вам, как можно сделать POST запрос к данному API. Для начала нам следует зарегистрировать себе apikey. Что делать дальше? Смотрите под катом. Предположим, что у нас есть некий массив URL’ов, которые надо проверить на «вшивось». Создаем класс google_lookup_api, в котором и будем творить чудеса.
<?php
 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);
 }
 }
?>
Вот и все, если у вас имеются вопросы, или замечания, прошу отписаться. P.S. Не судите строго, мне 17 лет, и я только учусь. Литература: Google Safe Browsing API
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх