Есть такая замечательная штука, виджет комментариев "В контакте". Но у него есть небольшой минус — нет возможности "из коробки" получать уведомления о новых комментариях. Есть блок, выводящий все комментария, но он показывает только сообщения первого уровня, вложенные ответы не видно.
Добавим уведомления на почту при поступлении нового комментария.
Ссылки
Drupal 8 — добавляем виджет комментариев "В контакте"
Модифицируем скрипт
При отправке комментария виджет передаёт событие widgets.comments.new_comment. Нужно подписаться на это событие и выполнить собственную функцию. Мы можем, например, сделать запись в БД, или отправить e-mail.
В код виджета добавляем VK.Observer.subscribe:
<div id="vk_comments"> </div>
<script type="text/javascript">
VK.init({apiId: 7181531, onlyWidgets: true});
VK.Widgets.Comments("vk_comments", {limit: 20, attach: "*"});
VK.Observer.subscribe("widgets.comments.new_comment", function f(num, last_comment, date, sign){
var xmlHttp = new XMLHttpRequest();
var params = 'num=' + encodeURIComponent(num) + '&last_comment=' + encodeURIComponent(last_comment) + '&date=' + encodeURIComponent(date) + '&sign=' + encodeURIComponent(sign) + '&url=' + encodeURIComponent(window.location) + '&title=' + encodeURIComponent(document.title);
xmlHttp.open( "POST", "/notify.php", false );
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xmlHttp.send(params);
});
</script>
Принцип простой, в функцию f передаётся 4 параметра:
- num (integer) — количество комментариев
- last_comment (string) — текст последнего комментария
- date (string) — текущая дата в формате ISO 8601 (например, 2004-02-12T15:19:21+00:00)
- sign (string) — контрольная сумма md5 от конкатенации четырех строк: api_secret, date, num, last_comment. В языке PHP может быть получена с помощью md5($api_secret.$date.$num.$last_comment).
Защищенный секрет api_secret Вы можете узнать при редактировании своего приложения в графе "Защищенный ключ".
Эти параметры мы отправляем методом POST на страничку notify.php, которую сейчас напишем.
Sign
Для уведомления на почту достаточно одного параметра, last_comment, остальные мы будем использовать для безопасности, чтобы отсечь спам.
Для расчёта MD5 хеша от сообщения нам понадобится api_secret. Посмотреть его можно в настройках своего приложения.
notify.php
Пишем PHP-скрипт для отправки уведомлений, используйте на свой страх и риск:
<?php
$domain="my_domain.ru";
if ( (!isset($_POST['num'])) || (!isset($_POST['last_comment'])) || (!isset($_POST['date'])) || (!isset($_POST['sign'])) || (!isset($_POST['url'])) || (!isset($_POST['title'])) ){
die();
}
$num = rawurldecode($_POST['num']);
$last_comment = rawurldecode($_POST['last_comment']);
$date = rawurldecode($_POST['date']);
$sign = rawurldecode($_POST['sign']);
$url = rawurldecode($_POST['url']);
$title = rawurldecode($_POST['title']);
//for sign validation
$last_comment_1251 = htmlspecialchars_decode($last_comment, ENT_NOQUOTES);
$last_comment_1251 = iconv("UTF-8", "windows-1251", $last_comment_1251);
//filter
$ref=$_SERVER["HTTP_REFERER"];
$last_comment = htmlspecialchars_decode($last_comment);
$title = htmlspecialchars_decode($title);
$last_comment = strip_tags($last_comment);
$url = strip_tags($url);
$title = strip_tags($title);
$last_comment =trim($last_comment);
$url=trim($url);
$title=trim($title);
$url=filter_var($url, FILTER_SANITIZE_URL);
$last_comment =filter_var($last_comment , FILTER_SANITIZE_STRING);
$title=filter_var($title, FILTER_SANITIZE_STRING);
//sign validation
$api_secret = "здесь_вставьте_секретный_ключ_своего приложения";
$calc = md5($api_secret.$date.$num.$last_comment_1251);
if (strcmp($sign, $calc) == 0){
$subject = "Комментарий на ".$domain;
} else {
$subject = "Подозрительный комментарий на ".$domain;
}
$to="info@".$domain."";
$headers = array(
"From" => $domain." <info@".$domain.">",
"Reply-To" => "info@".$domain,
"MIME-Version" => "1.0",
'Content-type' => "text/html; charset=\"utf-8\"",
'X-Mailer' => 'PHP/' . phpversion()
);
$content="
<!DOCTYPE html>
<html>
<body>
Заголовок: ".$title."
<br>
URL: ".$url."
<br>
Страница ".$ref."
<br>
Комментарий:<br>".$last_comment."
</body>
</html>
";
mail($to,$subject,$content,$headers);
?>
Хочется сконцентрировать ваше внимание на нескольких моментах:
- VK вычисляет хеш от сообщения в кодировке windows-1251, приходится возиться с конвертацией.
- Опытным путём удалось подобрать более-менее подходящий порядок конвертации текста, спецсимволов и кавычек.
- Если хеш совпал с вычисленным, то отправляется сообщение с темой "Комментарий на my_domain.ru", если хеш не совпал, то отправляется сообщение с темой "Подозрительный комментарий на my_domain.ru".
- Домен указывается в переменной, сообщение отправляется на info@my_domain.ru.
Я не большой специалист по PHP, но система работает...