В связи с введением нового дизайна ВКонтакте так же был введён новый функционал — 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)


  1. riot26
    05.10.2016 18:22
    +3

    Спасибо за хороший сборник ужасного PHP-кода.


    1. Wedmer
      05.10.2016 18:33
      +2

      Так главное реферальную программу сюда закинуть.


      1. riot26
        05.10.2016 18:45

        При чём ничего нового по сравнению с документацией в статье нет, как и лучших объяснений, поражаюсь.


  1. Mixxer
    05.10.2016 20:33
    +1

    Зачем это тут?


    1. MaximChistov
      05.10.2016 20:54
      +1

      так рефералка же


      1. Mixxer
        05.10.2016 20:55

        В этом и дело, это тут не нужно совсем.


  1. gluck59
    05.10.2016 23:38
    +1

    1. К чему вот эта ловушка?
    > $a = file_get_contents('https://api.vk.com/method/ messages.send?'. $get_params);
    На кого это рассчитано?

    2. Кто ошибку 901 обрабатывать будет?
    Она кстати не гуглится, на нее можно выйти либо случайно, либо досконально зная API вкантактика.

    3. А почему… да ну нафиг в общем…


  1. InstaRobot
    07.10.2016 02:25

    Давно таких шедевров не видел! Но хоть посмеялся, спасибо