Google Safe Browsing API взаимодействие с PHP
Начинаем
Все знают про сервисы сокращения ссылок. Для твиттера, аськи, ну в общем не важно. Так вот решил я сделать такой вот сервис, и на глаза мне попался удивительный 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