В связи с введением нового дизайна ВКонтакте так же был введён новый функционал — Callback API
для групп и сообществ. Сейчас я расскажу как им пользоваться.
Предыстория
У меня есть несколько групп, некоторые из которых закрытые. И мне крайне лень было каждый день заходить и смотреть в группах сообщения, заявки и прочее.
И вот я обнаружил, что с введением нового дизайна так же появилась "Работа с API" для групп и решил их изучить.
Настройка сервера оповещений
Переходим в управление нашей группой и заходим на вкладку "Работа с API". Там выбираем "Callback API". У нас открылась страница настроек.
Нам предлагают ввести домен, куда будут отправляться запросы. Тут можно использовать любой бесплатный хостинг с php
. Но я советую использовать свой VPS на Digital Ocean — регистрируйтесь по моей реферальной ссылке, и получите 10$ на своё счёт. Этого хватит на 2 месяца бесплатного использования сервера.
Я не буду подробно останавливаться на настройке php
и веб-сервера, приведу лишь минимальный пример index.php
для проверки валидатором ВКонтакте.
Вводим на странице настроек наш домен и секретный ключ (им может быть любые символы на английском языке и цифры).
Далее в index.php
прописываем следующие строки:
<?php
function check_secret($key) {
$secret = "MySecretKey";
if ($key != $secret) {
die("error");
}
}
$confirmation_token = "4ds4a5asd"; // Код со страницы настроек
$group_id = 12345678910;
$data = json_decode(file_get_contents('php://input'));
if (!isset($data->secret)){
if ($data->type == "confirmation") {
die($confirmation_token);
} else {
die("error");
}
} else {
// Тут будет обработка событий
}
?>
Сохраняем файл, нажимаем в ВКонтакте кнопку "Проверить" — если всё хорошо — то ваш домен примет ВКонтакте.
Выбор событий для оповещений
Теперь переходим на вкладку "Типы событий" и выбираем необходимые события. Мне хватило 3 пунктов — "Новое сообщение", "Вступление в сообщество" и "Выход из сообщества". В противном случае — у вас будет на система уведомлений, а система спама )).
Настройка обработки событий
Оповещения будем делать через систему личных сообщений от имени группы (ЛС). Для этого нам нужен access_token
.
Переходим на вкладку "Ключи доступа" и создаём новый ключ. Хватит вполне прав на сообщения сообщества. Копируем ключ доступа. Открываем наш файл, и после функции check_secret
дописываем функцию отправки сообщения вам в ЛС.
<?php
function send_message_to_me($text) {
global $data;
$token = "055a2f350c4dc66d38310b80a8df829cfe478c185c2b6e77e25a42990a94z8bc164732ad71162d461e379"; // Ключ доступа, полученный выше
$request_params = array(
'message' => $text,
'user_id' => $admin_id, // Ваш ИД ВКонтакте
'access_token' => $token,
'v' => '5.0'
);
$get_params = http_build_query($request_params);
$a = file_get_contents('https://api.vk.com/method/ messages.send?'. $get_params);
file_put_contents("log.txt", json_encode($a), FILE_APPEND);
}
?>
Теперь в область обработки дописываем следующий код:
<?php
check_secret($data->secret);
unset($data->secret);
switch ($data->type) {
// Новое сообщение
case 'message_new':
$user_id = $data->object->user_id;
// Получаем информацию о пользователе-отправителе
$user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$user_id}&v=5.0"));
$user_name = $user_info->response[0]->first_name;
// Отправляем Вам сообщение
send_message_to_me("Новое сообщение в Вашей группе от пользователя {$user_name} - http://vk.com/id{$user_id}" . "
https://vk.com/gim{$group_id}?sel={$user_id}");
die('ok');
break;
// Пользователь покинул группу
case 'group_leave':
// Получаем информацию о пользователе, который покинул группу
$user_id = $data->object->user_id;
$self = $data->object->self;
$user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$user_id}&v=5.0"));
$user_name = $user_info->response[0]->first_name;
$text = "Пользователь {$user_name} (http://vk.com/id{$user_id}) покинул Вашу группу";
$text .= $self == 1 ? "сам" : "по решению администрации";
// Отправляем Вам сообщение
send_message_to_me($text);
die('ok');
break;
// Вступление в группу
case 'group_join':
// Получаем информацию о пользователе, который покинул группу
$user_id = $data->object->user_id;
$join_type = $data->object->join_type;
if ($join_type != "approved") {
// Не отправлять если это принятая Вами заявка
// Получаем информацию о пользователе, который подал заявку в группу
$user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$user_id}&v=5.0"));
$user_name = $user_info->response[0]->first_name;
// Отправляем Вам сообщение
send_message_to_me("Пользователь {$user_name} (http://vk.com/id{$user_id}) вступил в группу Грешники");
}
die('ok');
break;
// Новая запись на стене - подойдёт для пабликов - оповещение о предложенных записях - нужно поставить соответствующую галочку в настройках типов событий
case "wall_post_new":
$object = $data->object;
$post_id = $object->id;
$post_type = $object->post_type;
if ($post_type == "suggest") {
// Если это предложенная запись
// Получаем информацию о пользователе, который предложил запись
$user_id = $data->object->from_id;
$user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$user_id}&v=5.0"));
$user_name = $user_info->response[0]->first_name;
// Отправляем сообщение
send_message_to_me("новая предложенная запись от пользователя {$user_name} (http://vk.com/id{$user_id}) - http://vk.com/wall-{$group_id}_{$post_id}");
}
die('ok');
break;
default:
die('ok');
break;
}
}
?>
Сохраняем файл, и можем наслаждаться сообщениями от имени группы с оповещениями о событиях. Дополнительные события Вы можете подключить самостоятельно, достаточно отметить нужные галочки, и посмотреть отправляемые запросы на вкладке "Запросы". Там описаны все отправляемые параметры.
Пользуйтесь. Мне очень помогает.
Спасибо за внимание!
Комментарии (8)
gluck59
05.10.2016 23:38+11. К чему вот эта ловушка?
> $a = file_get_contents('https://api.vk.com/method/ messages.send?'. $get_params);
На кого это рассчитано?
2. Кто ошибку 901 обрабатывать будет?
Она кстати не гуглится, на нее можно выйти либо случайно, либо досконально зная API вкантактика.
3. А почему… да ну нафиг в общем…
riot26
Спасибо за хороший сборник ужасного PHP-кода.
Wedmer
Так главное реферальную программу сюда закинуть.
riot26
При чём ничего нового по сравнению с документацией в статье нет, как и лучших объяснений, поражаюсь.