Akismet — сервіс боротьби зі спамом

328

Від автора: При розробці сайтів, так чи інакше, необхідно боротися зі спам повідомленнями, особливо якщо передбачений механізм прийому коментарів від користувачів. Тому в даному уроці я хотів би поговорити про сервіс фільтрації повідомлень Akismet.

Akismet — сервіс боротьби зі спамомAkismet — сервіс боротьби зі спамом

Введення

Akismet or Automattic Kismet — це сервіс фільтрації спаму, який фільтрує спам посилання в коментарях сайту. Фільтр працює шляхом збору та об’єднання інформації в спеціальні правила про спам коментарях з різних сайтів, а потім використовує дані правила для блокування небажаних повідомлень.

Akismet був введений в роботу 25 жовтня 2005 року і в 2013 році відсіяв понад 100 мільярдів коментарів. Спочатку ця система була розроблена для CMS WordPress, тобто був створений плагін, за допомогою якого можна було працювати з даною системою. Але зараз на основі API цієї системи створено безліч розширень під різні CMS.

Тому якщо Ваш сайт створено на одній з найпопулярніших CMS, швидше за все, є вже готове розширення, за допомогою якого можна працювати з цим сервісом. Але ми в даному уроці розглянемо випадок, коли сайт, розроблений без використання готових CMS, або фреймворків, тобто звичайний PHP – сайт. Насамперед необхідно отримати акаунт на офіційному сайті сервісу http://akismet.com.

Akismet — сервіс боротьби зі спамом

Після реєстрації Вам запропонують вибрати один з тарифних планів використання даної системи:

Akismet — сервіс боротьби зі спамом

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

Akismet — сервіс боротьби зі спамом

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

Akismet — сервіс боротьби зі спамом

Перевірка справжності API KEY

Для сьогоднішнього уроку ми будемо використовувати ось таку тестову сторінку, яка містить форму додавання коментаря:

Akismet — сервіс боротьби зі спамом

Вихідний код даного файлу:

Ім’я автора:

Електронна адреса:

Коментар:

У підключається файлі config.php, оголошена константа API_KEY, в якій збережено ключ доступу до API сервісу Akismet. Даний файл, я завантажив на реальний хостинг в інтернеті, тому будемо працювати з сервісом, практично на реальному сайті.

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

Як Ви бачите, оголошуємо функцію 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”;

$content_length – кількість символів з даними.

При цьому якщо відобразити запит на екрані ми побачимо наступне:

Akismet — сервіс боротьби зі спамом

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

Akismet — сервіс боротьби зі спамом

Якщо ми отримуємо відповідь valid, значить, ключ вірний.

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

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

‘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 – містить зовсім інші дані.

При відправці коментаря ми отримаємо таку відповідь від сервера:

Akismet — сервіс боротьби зі спамом

Якщо від сервера повертається false, значить – коментар в порядку, якщо TRUE, значить це спам коментар.

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

Всього Вам доброго і вдалого кодування!!!