Akismet — сервис борьбы со спамом

Akismet - сервис борьбы со спамом

От автора: При разработке сайтов, так или иначе, необходимо бороться со спам сообщениями, особенно если предусмотрен механизм приема комментариев от пользователей. Поэтому в данном уроке я хотел бы поговорить о сервисе фильтрации сообщений Akismet.

скачать исходникискачать урок

Введение

Akismet or Automattic Kismet — это сервис фильтрации спама, который фильтрует спам ссылки в комментариях сайта. Фильтр работает путем сбора и объединения информации в специальные правила о спам комментариях с различных сайтов, а затем использует данные правила для блокировки нежелательных сообщений.

Akismet был введен в работу 25 октября 2005 года и в 2013 году отсеял более 100 миллиардов комментариев. Изначально данная система была разработана для CMS WordPress, то есть был создан плагин, посредством которого можно было работать с данной системой. Но сейчас на основе API данной системы создано множество расширений под различные CMS.

Фреймворк YII2. Быстрая разработка с современным PHP фреймворком

Узнай тонкости современной веб-разработки с помощью фреймворка YII2

Узнать подробнее

Поэтому если Ваш сайт создан на одной из популярных CMS, скорее всего, есть уже готовое расширение, при помощи которого можно работать с данным сервисом. Но мы в данном уроке рассмотрим случай, когда сайт, разработан без использования готовых CMS, или фреймворков, то есть обычный PHP- сайт. Первым делом необходимо получить акаунт на официальном сайте сервиса http://akismet.com.

После регистрации, Вам предложат выбрать один из тарифных планов использования данной системы:

Для не коммерческих сайтов и для тестирования, можно выбрать бесплатный тарифный план. Выбрав при этом левый блок Personal, и передвинув, ползунок оплаты сервиса в крайнее левое положение.

После регистрации Вы получите специальный ключ API Key, который необходим для доступа к ресурсам сервиса. Подробная документация по использованию данного сервиса содержится по адресу http://akismet.com/development/api/#detailed-docs:

Проверка подлинности API KEY

Для сегодняшнего урока мы будем использовать вот такую тестовую страницу, которая содержит форму добавления нового комментария:

Исходный код данного файла:

<?php
//constant API_KEY
include "config.php";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
 <form method="POST" action="index.php">
 
  Имя автора:<br /> <input name="author" type="text" /><br />
  Электронный адресс: <br /><input name="email" type="text" /><br />
  Сайт: <br /><input name="author_url" type="text" /><br />
  Комментарий: <br /><textarea name="text"></textarea><br />
 
  <input type="submit" />
 
 
 </form>
</body>
</html>

В подключаемом файле config.php, объявлена константа API_KEY, в которой сохранен ключ доступа к API сервиса Akismet. Данный файл, я сразу же загрузил на реальный хостинг в интернете, поэтому будем работать с сервисом, практически на реальном сайте.

И первым делом необходимо проверить правильность ключа доступа к API системы Akismet. Для этого в файл добавим следующий код (я привожу только код PHP, который необходимо добавить в начале файла):

<?php
//constant API_KEY
include "config.php";

if(!akismet_verify_key(API_KEY,"http://avtomirock.com.ua/lesson")) {
 exit();
}


function akismet_verify_key($key, $blog) {
 $blog = urlencode($blog);
 
 $request = "key=".$key."&blog=".$blog;
 $host = "rest.akismet.com";
 $path = "/1.1/verify-key";
 $port = 443;
 $akismet_ua = "Wordpress/3.8.1 | Akismet/2.5.9";
 $content_length = strlen($request);
 
 $http_request = "POST $path HTTP/1.0\r\n";
 $http_request .= "Host: $host \r\n";
 $http_request .= "Content-Type: application/x-www-form-urlencoded\r\n";
 $http_request .= "Content-Length: {$content_length}\r\n";
 $http_request .= "User-Agent: {$akismet_ua}\r\n";
 $http_request .= "\r\n";
 $http_request .= $request;
 
 /*echo $http_request;*/
 
 $response = '';
 
 if(false != ($fs = fsockopen('ssl://'.$host,$port,$errno,$errstr, 10))) {
  fwrite($fs,$http_request);
 
  while(!feof($fs)) {
 $response .= fgets($fs,1160);
  }
 
  fclose($fs);
 
  $response = explode("\r\n\r\n",$response);
 
  //print_r($response);
 
  if($response[1] == 'valid') {
 return TRUE;
  }
  else {
 return FALSE;
  }
 }
 
}
?>

Как Вы видите, объявляем функцию akismet_verify_key(), которая проверит правильность ключа и вернет TRUE, если ключ верен и FALSE в противном случае. При этом функция принимает два параметра: первый – это проверяемый ключ, второй – адрес Вашего сайта.

В коде функции необходимо отправить запрос типа POST, на сервер сервиса Akismet. Данные, которые передаются в запросе, сохраняем в переменной $request. А непосредственно сам запрос (данные и необходимые заголовки) формируем в переменной $http_request в виде строки. Вспомогательные переменные:

$host — адрес сервера, который примет данные;

$path – обработчик запроса с данными;

$port — порт;

$akismet_ua — параметр USER_AGENT, который должен быть равен строке «WordPress/3.8.1 | Akismet/2.5.9″;

Фреймворк YII2. Быстрая разработка с современным PHP фреймворком

Узнай тонкости современной веб-разработки с помощью фреймворка YII2

Узнать подробнее

$content_length – количество символов с данными.

При этом если отобразить запрос на экране мы увидим следующее:

Запрос к серверу, отправляем, используя сокеты, а именно, через сокет открываем удаленный файл – функция fsockopen(), которая вернет нам дескриптор открытого файла. Далее мы производим запись в этот файл, таким образом, отправляем в него наш запрос, хранящийся в переменной $http_request, а далее читаем открытый файл и таким образом получаем ответ от сервера:

Если мы получаем ответ valid, значит, ключ верен.

Проверка комментария.

После проверки правильности ключа, необходимо проверить отправляемый комментарий, для этого создадим специальную функцию akesmet_comment_check(). Полный PHP код файла:

<?php
//constant API_KEY
include "config.php";

if(!akismet_verify_key(API_KEY,"http://avtomirock.com.ua/lesson")) {
 exit();
}

if($_SERVER['REQUEST_METHOD'] == 'POST') {
 $data = array
 (
 'blog'=>'http://avtomirock.com.ua/lesson',
 'user_agent' => $_SERVER['HTTP_USER_AGENT'],
 'user_ip' => $_SERVER['REMOTE_ADDR'],
 'referer' => $_SERVER['HTTP_REFERER'],
 'permalink' => 'http://avtomirock.com.ua/lesson',
 'comment_type' => 'comment',
 'comment_author' => $_POST['author'],
 'comment_author_email' => $_POST['email'],
 'comment_author_url' => $_POST['author_url'],
 'comment_content' => $_POST['text']
 );
 //print_r($data);
 if(akesmet_comment_check(API_KEY,$data)) {
  echo "comment correct";
 } 
}



function akesmet_comment_check($key,$data) {
 //$blog = urlencode($blog);
 
 $request = 'blog='.urlencode($data['blog']);
 $request .= '&user_ip='.urlencode($data['user_ip']);
 $request .= '&user_agent='.urlencode($data['user_agent']);
 $request .= '&referrer='.urlencode($data['referer']);
 $request .= '&permalink='.urlencode($data['permalink']);
 $request .= '&comment_type='.urlencode($data['comment_type']);
 $request .= '&comment_author='.urlencode($data['comment_author']);
 $request .= '&comment_author_email='.urlencode($data['comment_author_email']);
 $request .= '&comment_author_url='.urlencode($data['comment_author_url']);
 $request .= '&comment_content='.urlencode($data['comment_content']);
 
 
 
 $host = $key.".rest.akismet.com";
 $path = "/1.1/comment-check";
 $port = 443;
 $akismet_ua = "Wordpress/3.8.1 | Akismet/2.5.9";
 $content_length = strlen($request);
 
 $http_request = "POST $path HTTP/1.0\r\n";
 $http_request .= "Host: $host \r\n";
 $http_request .= "Content-Type: application/x-www-form-urlencoded\r\n";
 $http_request .= "Content-Length: {$content_length}\r\n";
 $http_request .= "User-Agent: {$akismet_ua}\r\n";
 $http_request .= "\r\n";
 $http_request .= $request;
 
 //echo $http_request;
 
 $response = '';
 
 if(false != ($fs = fsockopen('ssl://'.$host,$port,$errno,$errstr, 10))) {
  fwrite($fs,$http_request);
 
  while(!feof($fs)) {
 $response .= fgets($fs,1160);
  }
 
  fclose($fs);
 
  $response = explode("\r\n\r\n",$response);
 
  //print_r($response);
 
  if($response[1] == 'false') {
 return TRUE;
  }
  else {
 return FALSE;
  }
 }
}

function akismet_verify_key($key, $blog) {
 $blog = urlencode($blog);
 
 $request = "key=".$key."&blog=".$blog;
 $host = "rest.akismet.com";
 $path = "/1.1/verify-key";
 $port = 443;
 $akismet_ua = "Wordpress/3.8.1 | Akismet/2.5.9";
 $content_length = strlen($request);
 
 $http_request = "POST $path HTTP/1.0\r\n";
 $http_request .= "Host: $host \r\n";
 $http_request .= "Content-Type: application/x-www-form-urlencoded\r\n";
 $http_request .= "Content-Length: {$content_length}\r\n";
 $http_request .= "User-Agent: {$akismet_ua}\r\n";
 $http_request .= "\r\n";
 $http_request .= $request;
 
 /*echo $http_request;*/
 
 $response = '';
 
 if(false != ($fs = fsockopen('ssl://'.$host,$port,$errno,$errstr, 10))) {
  fwrite($fs,$http_request);
 
  while(!feof($fs)) {
 $response .= fgets($fs,1160);
  }
 
  fclose($fs);
  print_r($response);
  $response = explode("\r\n\r\n",$response);
 
 
 
  if($response[1] == 'valid') {
 return TRUE;
  }
  else {
 return FALSE;
  }
 }
 
}
?>

Для начала проверяем, пришли ли данные методом POST, если это так, значит, формируем массив $data, со следующими ячейками:

‘blog’=>адрес Вашего сайта,

‘user_agent’ => данные о браузере пользователя;

‘user_ip’ => ip – адрес пользователя;

‘referer’ => страница, с которой перешел пользователь на страницу отправки комментария;

‘permalink’ => адрес страницы отправки комментария;

‘comment_type’ => тип проверяемых данных;

‘comment_author’ => автор комментария;

‘comment_author_email’ => почта автора комментария;

‘comment_author_url’ => адрес сайта автора комментария;

‘comment_content’ => текст комментария.

Далее вызываем функцию akesmet_comment_check($key,$data), которой передаем сформированный массив и ключ доступа к сервису Akismet. Работа функции полностью аналогична функции проверки правильности ключа. За исключением того, что в переменной $host, добавляется к адресу сервера, ключ доступа к API сервиса, в переменной $path – теперь уже другой обработчик данных, и конечно переменная $request – содержит совсем другие данные.

При отправке комментария мы получим следующий ответ от сервера:

Если от сервера возвращается false, значит – комментарий в порядке, если – TRUE, значит это спам комментарий.

На этом данный урок можно завершать. Я Вам предложил сервис Akismet как один из инструментов борьбы со спамом, а решать уже Вам использовать его или нет. Конечно, он не идеален и я бы Вам рекомендовал, обязательно протестировать его работу перед использованием.

Всего Вам доброго и удачного кодирования!!!

Фреймворк YII2. Быстрая разработка с современным PHP фреймворком

Узнай тонкости современной веб-разработки с помощью фреймворка YII2

Узнать подробнее
Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки: ,

Похожие статьи:

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree