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