От автора: При разработке сайтов, так или иначе, необходимо бороться со спам сообщениями, особенно если предусмотрен механизм приема комментариев от пользователей. Поэтому в данном уроке я хотел бы поговорить о сервисе фильтрации сообщений Akismet.
Введение
Akismet or Automattic Kismet — это сервис фильтрации спама, который фильтрует спам ссылки в комментариях сайта. Фильтр работает путем сбора и объединения информации в специальные правила о спам комментариях с различных сайтов, а затем использует данные правила для блокировки нежелательных сообщений.
Akismet был введен в работу 25 октября 2005 года и в 2013 году отсеял более 100 миллиардов комментариев. Изначально данная система была разработана для CMS WordPress, то есть был создан плагин, посредством которого можно было работать с данной системой. Но сейчас на основе API данной системы создано множество расширений под различные CMS.
Поэтому если Ваш сайт создан на одной из популярных CMS, скорее всего, есть уже готовое расширение, при помощи которого можно работать с данным сервисом. Но мы в данном уроке рассмотрим случай, когда сайт, разработан без использования готовых CMS, или фреймворков, то есть обычный PHP- сайт. Первым делом необходимо получить акаунт на официальном сайте сервиса //akismet.com.
После регистрации, Вам предложат выбрать один из тарифных планов использования данной системы:
Для не коммерческих сайтов и для тестирования, можно выбрать бесплатный тарифный план. Выбрав при этом левый блок Personal, и передвинув, ползунок оплаты сервиса в крайнее левое положение.
После регистрации Вы получите специальный ключ API Key, который необходим для доступа к ресурсам сервиса. Подробная документация по использованию данного сервиса содержится по адресу //akismet.com/development/api/#detailed-docs:
Проверка подлинности API KEY
Для сегодняшнего урока мы будем использовать вот такую тестовую страницу, которая содержит форму добавления нового комментария:
Исходный код данного файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?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, который необходимо добавить в начале файла):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?php //constant API_KEY include "config.php"; if(!akismet_verify_key(API_KEY,"//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»;
$content_length – количество символов с данными.
При этом если отобразить запрос на экране мы увидим следующее:
Запрос к серверу, отправляем, используя сокеты, а именно, через сокет открываем удаленный файл – функция fsockopen(), которая вернет нам дескриптор открытого файла. Далее мы производим запись в этот файл, таким образом, отправляем в него наш запрос, хранящийся в переменной $http_request, а далее читаем открытый файл и таким образом получаем ответ от сервера:
Если мы получаем ответ valid, значит, ключ верен.
Проверка комментария.
После проверки правильности ключа, необходимо проверить отправляемый комментарий, для этого создадим специальную функцию akesmet_comment_check(). Полный PHP код файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
<?php //constant API_KEY include "config.php"; if(!akismet_verify_key(API_KEY,"//avtomirock.com.ua/lesson")) { exit(); } if($_SERVER['REQUEST_METHOD'] == 'POST') { $data = array ( 'blog'=>'//avtomirock.com.ua/lesson', 'user_agent' => $_SERVER['HTTP_USER_AGENT'], 'user_ip' => $_SERVER['REMOTE_ADDR'], 'referer' => $_SERVER['HTTP_REFERER'], 'permalink' => '//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 как один из инструментов борьбы со спамом, а решать уже Вам использовать его или нет. Конечно, он не идеален и я бы Вам рекомендовал, обязательно протестировать его работу перед использованием.
Всего Вам доброго и удачного кодирования!!!