VK API уведомление о новом комментарии

Я давно стал добавлять на страницы своих сайтов виджет ВКонтакте для комментирования.

Его достоинство – простота в установке и обслуживании, недостаток – коментарии не индексируются поисковиками.

Ещё один недостаток я победил нашел только сейчас: это уведомление о новом коментарии. Из-за отсутствия уведомления я не мог отвечать вовремя на новые комментарии, что не есть хорошо.

Начну с добавления виджета, чтобы получилась законченная статья.

Добавить виджет коментрирования для сайта можно здесь: https://vk.com/dev/Comments.

Там же Вы получите код для вставки, но не получите api_secret, с помощью которого сможете проверять, что уведомление о новом коментарии пришли от Вашего скрипта. Мне он не нужен, если Вам нужен, регистрируйте приложение по расширенной схеме здесь: https://vk.com/editapp?act=create или подсмотрите его в Мои Приложения, Редактирование, слева Настройки — там будет ваш "Защищенный ключ". Получите код виджета, что-типа такого:

<!-- Put this script tag to the <head> of your page -->
<script type="text/javascript" src="//vk.com/js/api/openapi.js?168"></script>

<script type="text/javascript">
    VK.init({apiId: XXXXXXXXXXXX, onlyWidgets: true});
</script>

<!-- Put this div tag to the place, where the Comments block will be -->
<div id="vk_comments"></div>
<script type="text/javascript">
    VK.Widgets.Comments("vk_comments", {limit: 10, width: "665", attach: "*"});
</script>

API виджета комментария имеет параметр onChange. Функция, которую содержит параметр onChange, вызывается каждый раз при событии удаления/создания комментария. Подробнее о виджете коментрирования здесь. Измените вызов VK.Widgets.Comments на следующий:

VK.Widgets.Comments("vk_comments", {limit: 10, width: "665", attach: "*", <b>onChange: addCommentCallback</b>});

или если вы хотите передавать дополнительную информацию, например id поста, то так:

VK.Widgets.Comments("vk_comments", {limit: 10, width: "665", attach: "*", onChange: addCommentCallback}, "post_<?php echo $data['id']?>");

Третий параметр — это ID данного виджета (блока) комментариев, если его не указывать в качестве id, используется md5-хэш от location.href (ссылки на эту страницу).

CallBack-функция onChange вызывается с четырьмя параметрами:

  • num - количество комментариев
  • last_comment - текст последнего комментария
  • date - текущая дата в формате ISO 8601 (например, 2004-02-12T15:19:21+00:00)
  • sign - контрольная сумма md5 от конкатенации 4х строк: api_secret, date, num, last_comment. В языке php может быть получена с помощью md5($api_secret.$date.$num.$last_comment). Защищенный секрет api_secret Вы можете узнать при редактировании своего приложения в графе "Защищенный ключ".

Если у Вас на сайте используется jquery, Вы можете вызвать отправку сообщения на сервер используя следующий код:

function addCommentCallback(num, last_comment, date, sign){
    $.post("http://ВАШ_САЙТ.ru/vkcomment.php",{
        type: 'vkontakte',
        num: num,
        last_comment: last_comment,
        date: date,
        sign: sign,
        id: "<?php echo $this->post['id']?>"
    });
}

Я jquery не использую, у меня код такой:

function addCommentCallback(num, last_comment, date, sign){
    try {
        if(num && last_comment && date && sign){
            var data=new FormData();
            data.append('num', num);
            data.append('last_comment', last_comment);
            data.append('date', date);
            data.append('sign', sign);
            data.append('ref', document.location.referrer);
            var xhr=new XMLHttpRequest();
            xhr.open('POST', '/vkcomment.php', false);
            xhr.send(data);
            return true;
        }
        log(num, last_comment, date);
    } catch (e) {
        log(e);
    }
    return true;
}

Ну и непосредственно PHP обработчик vkcomment.php:

if (
    $_SERVER['REQUEST_METHOD'] !== 'POST' ||
    (
        empty($_SERVER['HTTP_REFERER']) ||
        strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false
    )
)    exit;
if ( !isset($_POST['date']) || !isset($_POST['num']) || !isset($_POST['sign']) || !isset($_POST['last_comment']) ) exit;
/* блок провеки хеша, я не использую
$apiSecret = %ВАШ_API_SECRET%;
$hash = md5($apiSecret.$post['date'].$post['num'].$post['last_comment']);
if ($hash != $_POST['sign'])) exit; // проверяем, что хэши совпадают
*/
$msg = var_export($_POST,!0)."\nBrowser: ".@$_SERVER['HTTP_USER_AGENT']."\nHttp_referer: ".@$_SERVER['HTTP_REFERER'];
mail("XXX@htmlweb.ru", "VK Comment", $msg, "From: <noreply@htmlweb.ru>\nContent-Type: text/plain; charset=utf-8");

.