Перейти к основному содержанию
 

Добавляем уведомления виджету комментариев "В контакте"

В контакте

Есть такая замечательная штука, виджет комментариев "В контакте". Но у него есть небольшой минус — нет возможности "из коробки" получать уведомления о новых комментариях. Есть блок, выводящий все комментария, но он показывает только сообщения первого уровня, вложенные ответы не видно.

Добавим уведомления на почту при поступлении нового комментария.

Ссылки

Drupal 8 — добавляем виджет комментариев "В контакте"

Модифицируем скрипт

При отправке комментария виджет передаёт событие widgets.comments.new_comment. Нужно подписаться на это событие и выполнить собственную функцию. Мы можем, например, сделать запись в БД, или отправить e-mail.

В код виджета добавляем VK.Observer.subscribe:

<div id="vk_comments">&nbsp;</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. Посмотреть его можно в настройках своего приложения.

vk

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);
?>

Хочется сконцентрировать ваше внимание на нескольких моментах:

  1. VK вычисляет хеш от сообщения в кодировке windows-1251, приходится возиться с конвертацией.
  2. Опытным путём удалось подобрать более-менее подходящий порядок конвертации текста, спецсимволов и кавычек.
  3. Если хеш совпал с вычисленным, то отправляется сообщение с темой "Комментарий на my_domain.ru", если хеш не совпал, то отправляется сообщение с темой "Подозрительный комментарий на my_domain.ru".
  4. Домен указывается в переменной, сообщение отправляется на info@my_domain.ru.

Я не большой специалист по PHP, но система работает...

vk

Теги