Как написать бота для вк на php

Время на прочтение
11 мин

Количество просмотров 62K

На текущий момент большинство крупных сообществ ВКонтакте уже имеют ботов, актуальность этой темы обуславливается огромным спросом на круглосуточную работу приложения, оповещение при вступлении в сообщество и выходе из него, рассылку информационных сообщений, именно бот сообщества ВКонтакте может решить эти задачи. В статье мы рассмотрим решение основных задач, которые часто возникают в любом крупном сообществе.

Настройка Callback API для бота сообщества ВКонтакте

Подготовка серверной части к подключению

Callback API — это инструмент для отслеживания активности пользователей в Вашем сообществе ВКонтакте. С его помощью Вы можете реализовать новые полезные функции, например:

  • Бота для отправки мгновенных ответов на поступающие сообщения.
  • Систему автоматической модерации контента.
  • Сервис для сбора и обработки показателей вовлеченности аудитории.

Чтобы начать использовать Callback API, подключите свой сервер в настройках сообщества и выберите типы событий, данные о которых требуется получать (например, новые комментарии и новые фотографии). Когда в сообществе произойдет событие выбранного типа, ВКонтакте отправит на Ваш сервер запрос в формате JSON с основной информацией об объекте, вызвавшем событие (например, добавленный комментарий). Вам больше не нужно делать регулярные запросы к API, чтобы отслеживать обновления — теперь Вы будете получать их мгновенно.

Инструкция по подключению подробно описана в отличной документации для разработчиков ВКонтакте.

Разберем её подробнее, для размещения скрипта чат-бота мы должны иметь функционирующий веб-сервер.

Для работы с callback API ВКонтакте рекомендует использовать протокол https, инструкцию по бесплатному получению сертификата cloudflare и настройки сервера вы сможете найти в статье, которую можно найти в поисковой системе Google по запросу Бесплатный SSL сертификат CloudFlare.

По окончании настройки сервера вы должны иметь рабочий web-сервер, на который мы загрузим скрипт нашего бота.

Настройка сообщества ВКонтакте

Генерация ключа доступа

Важным моментом в работе бота сообщества являются ответы на пользовательские сообщения и различные события, для того, чтобы мы могли взаимодействовать с пользователем от имени сообщества, нам необходимо создать специальный ключ. Для этого перейдем во вкладку «Управление сообществом«.

Далее спустимся в раздел «Работа с API» → «Ключи доступа«.

Для создания ключа необходимо нажать «Создать ключ» и выбрать необходимые права, которые мы предоставим нашему боту.

В нашем случае нам хватит доступа к сообщениям сообщества.

Сохраним данный ключ, он нам понадобится при настройке backend.

Настройка callback API

Теперь мы должны связать наш сервер и сообщество, для этого мы должны указать данные нашего сервера и создать секретный ключ. Для этого нам необходимо перейти в раздел управления сообщества и спуститься во вкладку «Работа с API».

Дальше наступает очень важный момент, нам необходимо ввести адрес нашего сервера и придумать секретный ключ, в качестве ключа выступает любая строка, а в качестве адреса, соотвественно, адрес к php скрипту на сервере.

Введем секретный ключ и нажимаем «Сохранить», после мы должны получить соответствующее уведомление о успешной установке ключа. Кнопку «Подтвердить» напротив поля с адресом сервера не нажимаем.

Заданный Вами секретный ключ будет передаваться с каждым уведомлением от сервера в отдельном поле secret. Это позволит Вам достоверно определять, что уведомление пришло именно от нашего сервера.

Также мы должны запомнить код, который должен вернуть сервер, запишите его, он нам понадобится при настройке backend.

Настройка типов событий

Важным моментом в работе бота сообщества, является ответы на пользовательские сообщения и различные события, для того, чтобы мы могли взаимодействовать с пользователем от имени сообщества, нам необходимо указать какие именно события мы хотим получать.  Так как мы собираемся отслеживать входящие сообщения, вступления в сообщества и выход из него, то нам необходимо установить соответствующие галочки. Для этого перейдем во вкладку «Управление сообществом«.


Далее спустимся в раздел «Работа с API» → «Типы событий«.

Установите необходимые пункты в данном разделе.

Настройка backend бота ВКонтакте

Следующим этапом мы должны создать специальный скрипт, который будем принимать запросы от callback API вконтакте и определенным образом реагировать на события. Создадим, например, php-скрипт handler.php, адрес к этом скрипту, после настройки backend, мы должны указать в настройках сообщества.

Обратите внимание на значения следующих переменных:

$confirmationToken $token $secretKey

В confirmationToken хранится код, которые сервер должен вернуть, в нашем случае:

004eec27

token хранит в себе ключ доступа, который мы генерировали в главе «Генерация ключа доступа»

secretKey мы задавали в разделе управления сообщества callback API. Итоговый код выглядит следующим образом (handler.php):

Итоговый код handler.php

<?php

if (!isset($_REQUEST)) {
    return;
}

//Строка для подтверждения адреса сервера из настроек Callback API
$confirmationToken = '004eec27';

//Ключ доступа сообщества
$token = 'Ваш ключ';

// Secret key
$secretKey = 'testSecureKey';

//Получаем и декодируем уведомление
$data = json_decode(file_get_contents('php://input'));

// проверяем secretKey
if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0)
    return;

//Проверяем, что находится в поле "type"
switch ($data->type) {
    //Если это уведомление для подтверждения адреса сервера...
    case 'confirmation':
        //...отправляем строку для подтверждения адреса
        echo $confirmationToken;
        break;

    //Если это уведомление о новом сообщении...
    case 'message_new':
        //...получаем id его автора
        $userId = $data->object->user_id;
        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "{$user_name}, ваше сообщение зарегистрировано!<br>".
                            "Мы постараемся ответить в ближайшее время.",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;

    // Если это уведомление о вступлении в группу
    case 'group_join':
        //...получаем id нового участника
        $userId = $data->object->user_id;

        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" .
                            "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" .
                            "Их контакты можно найти в соответсвующем разделе группы.<br>" .
                            "Успехов в учёбе!",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;
}
?>

После того как вы загрузите код, вы должны вернуться в раздел «Управление сообществом» → «Работа с API» → «Callback API», ввести адрес до скрипта и нажать «Подтвердить»

После этого, конфигурация сообщества для работы с ботом завершена, теперь, если мы отправим сообщением в сообщество, мы получим ответ.

Дополнительные возможности

Реализация приветствия при вступлении в сообщество ВКонтакте

На данном этапе мы уже имеем настроенный сервер и обработчик бота, все возможные события указаны в документации, она хорошо написана, рекомендую с ней ознакомиться.

Мы будем отлавливать событие group_join, для этого в операторе switch создадим новый раздел. Мы не будем рассматривать join_type подробно, так как у нас открытая группа, но вы можете обрабатывать этот параметр на ваше усмотрение.

Фрагмент кода оповещения о вступлении в сообщество

    // Если это уведомление о вступлении в группу
    case 'group_join':
        //...получаем id нового участника
        $userId = $data->object->user_id;

        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" .
                            "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" .
                            "Их контакты можно найти в соответсвующем разделе группы.<br>" .
                            "Успехов в учёбе!",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;

Полный код обработчика бота ВКонтакте с функцией приветственного сообщения:

Исходный код handler.php. Приветственное сообщение

<?php

if (!isset($_REQUEST)) {
    return;
}

//Строка для подтверждения адреса сервера из настроек Callback API
$confirmationToken = '004eec27';

//Ключ доступа сообщества
$token = 'Ваш ключ';

// Secret key
$secretKey = 'testSecureKey';

//Получаем и декодируем уведомление
$data = json_decode(file_get_contents('php://input'));

// проверяем secretKey
if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0)
    return;

//Проверяем, что находится в поле "type"
switch ($data->type) {
    //Если это уведомление для подтверждения адреса сервера...
    case 'confirmation':
        //...отправляем строку для подтверждения адреса
        echo $confirmationToken;
        break;

    //Если это уведомление о новом сообщении...
    case 'message_new':
        //...получаем id его автора
        $userId = $data->object->user_id;
        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "{$user_name}, ваше сообщение зарегистрировано!<br>".
                            "Мы постараемся ответить в ближайшее время.",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;

    // Если это уведомление о вступлении в группу
    case 'group_join':
        //...получаем id нового участника
        $userId = $data->object->user_id;

        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" .
                            "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" .
                            "Их контакты можно найти в соответсвующем разделе группы.<br>" .
                            "Успехов в учёбе!",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;
}
?>

Реализация прощания с участником после того, как он покинул сообщество

Реализация идентичная, в конкретном случае мы обрабатываем group_leave

Фрагмент кода оповещения о выходе из сообщества

    // Если это уведомление о выходе из группы
    case 'group_leave':
        //...получаем id ушедшего участника
        $userId = $data->object->user_id;

        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "{$user_name}, нам очень жаль прощаться с вами 😔<br>" .
                            "Мы всегда будем ждать Вас в нашей уютной компании.<br>" .
                            "Если возникли вопросы - свяжитесь с администратором сообщества<br>" .
                            "Константин - https://vk.com/kulakovkostya",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;

Полный листинг кода:

Итоговый код handler.php с расширенным функционалом

<?php

if (!isset($_REQUEST)) {
    return;
}

//Строка для подтверждения адреса сервера из настроек Callback API
$confirmationToken = '004eec27';

//Ключ доступа сообщества
$token = 'Ваш ключ';

// Secret key
$secretKey = 'testSecureKey';

//Получаем и декодируем уведомление
$data = json_decode(file_get_contents('php://input'));

// проверяем secretKey
if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0)
    return;

//Проверяем, что находится в поле "type"
switch ($data->type) {
    //Если это уведомление для подтверждения адреса сервера...
    case 'confirmation':
        //...отправляем строку для подтверждения адреса
        echo $confirmationToken;
        break;

    //Если это уведомление о новом сообщении...
    case 'message_new':
        //...получаем id его автора
        $userId = $data->object->user_id;
        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "{$user_name}, ваше сообщение зарегистрировано!<br>".
                            "Мы постараемся ответить в ближайшее время.",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;

    // Если это уведомление о вступлении в группу
    case 'group_join':
        //...получаем id нового участника
        $userId = $data->object->user_id;

        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" .
                            "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" .
                            "Их контакты можно найти в соответсвующем разделе группы.<br>" .
                            "Успехов в учёбе!",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;

    // Если это уведомление о выходе из группы
    case 'group_leave':
        //...получаем id ушедшего участника
        $userId = $data->object->user_id;

        //затем с помощью users.get получаем данные об авторе
        $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));

        //и извлекаем из ответа его имя
        $user_name = $userInfo->response[0]->first_name;

        //С помощью messages.send и токена сообщества отправляем ответное сообщение
        $request_params = array(
            'message' => "{$user_name}, нам очень жаль прощаться с вами 😔<br>" .
                            "Мы всегда будем ждать Вас в нашей уютной компании.<br>" .
                            "Если возникли вопросы - свяжитесь с администратором сообщества<br>" .
                            "Константин - https://vk.com/kulakovkostya",
            'user_id' => $userId,
            'access_token' => $token,
            'v' => '5.0'
        );

        $get_params = http_build_query($request_params);

        file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);

        //Возвращаем "ok" серверу Callback API
        echo('ok');

        break;
}
?>

Исходный код на GitHub: github.com/KostyaKulakov/vksocialbot

VKBotAPI v1.2

Простое решение для создания бота ВКонтакте.

Настройка

Чтобы начать создавать своего бота подключите библиотеку, укажите токен сообщества и используемую версию API

<?php require_once 'vk.php';

$vk = new VK('ТокенСДоступомКСообщениямСообщества', '5.131');
$data = json_decode(file_get_contents('php://input'));

При первом подключении VK отправит подтверждение и бот отправит ключ CallBack:

if ($data->type == 'confirmation') {
    exit(Ключ CallBack); 
}

Использование

1. Отправка сообщения

Чтобы отправить сообщение пользователю, выполните:

// $peer_id - ID диалога с пользователем (можно использовать $from_id, однако если бот состоит в беседе, то нужно использовать $peer_id)
$vk->SendMessage($peer_id, "Текст сообщения");

Вы также можете прикрепить к сообщению, например, фотографию:

$vk->SendMessage($peer_id, "Текст сообщения", "photo-196997982_457239020");

Для отправки сообщения более чем одному человеку, используйте:

$vk->SendMessages("6098838, 291457291, 390511105", "Текст сообщения");

Где «6098838, 291457291, 390511105» — ID пользователей, которым необходимо отправить сообщение (максимальное количество ID — 100 штук).
К сообщениям также можно прикрепить, например, фотографию.

Если Вы хотите отправить сообщения с клавитурой, то выполните:

$vk->SendButton($peer_id, "Текст сообщения", [[$btn]], true);

Где $btn — кнопка, которую необходимо отправить (подробнее про кнопки ниже).
После кнопок укажите true или false — параметр, который отвечает за показ inline кнопок.
Если указано значение true, то кнопки будут отображаться прямо в сообщении. При значении false кнопки будут находиться под полем ввода.

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

$vk->SendButton($peer_id, "Текст сообщения", [[$btn, $btn1, $btn2], [$btn3, $btn4, $btn5]], true);

[$btn, $btn1, $btn2] — Первый ряд кнопок (максиальное количество рядов: 10, а количество кнопок в ряду: 4). Каждый новый ряд указывается в квадратных скобках и отделяется от предыдущего запятой.

Сообщения с клавиатурой также поддерживают прикрепление документов (например, фотографий):

$vk->SendButton($peer_id, "Текст сообщения", [[$btn]], true, "photo-196997982_457239020");

Для отправки сообщения с кнопкой и вложением (по желанию) сразу нескольким пользователям (до 100 человек), используйте:

$vk->SendUsersButton($user_ids, "Текст сообщения", [[$btn]], true, "photo-196997982_457239020");

Где $user_ids — список пользователей, которым необходимо отправить сообщения. Пример: 6098838, 291457291, 390511105

2. Клавиатуры

Библиотека поддерживает отправку клавиатуры. Поддерживаемые виды кнопок:

  • Text (обычная кнопка с действием или без)
  • Link (кнопка, которая открывает ссылку при нажатии)
  • Location (кнопка, при нажатии на которую пользователь отправляет свою геолокацию)
  • CallBack (кнопка, которая позволяет без отправки сообщения от пользователя получить уведомление о нажатии на кнопку и выполнить необходимое действие)

Кнопка: Text

$button = ["text", ["payload" => "start"], "Текст кнопки", "green"];

Где Payload — действие, которое будет совершено при нажатии на кнопку, green — цвет кнопки. Поддерживаемые цвета:

  • Red (negative, красный цвет)
  • Green (positive, зеленый цвет)
  • White (secondary, белый/серый цвет)
  • Blue (primary, синий цвет)

Кнопка: Link

$button = ["link", "Текст кнопки", "https://vk.com/"];

Кнопка открывает указанную ссылку при нажатии, однако она не способна совершать действия (payload’ы)

Кнопка: Location

Кнопка открывает окно выбора геолокации и отправляет ее боту.

Кнопка: Callback

$button = ["callback", ["type" => 'show_snackbar', "text" => 'Привет мир!'], "Текст кнопки", "green"];

Где show_snackbar — тип действия, которое будет совершено при нажатии на кнопку. Доступные варианты:

  • show_snackbar — отображение уведомления (доступно с мобильных устройств)
  • open_link — открыть ссылку. При этом «text» => ‘Привет мир!’ необходимо заменить на «link» => ‘ссылка’
  • open_app — открыть VK Mini App. При этом «text» => ‘Привет мир!’ необходимо заменить на «app_id» => ‘id приложения’, «owner_id» => ‘id владельца’, «hash» => ‘хэш’

3. Payload’ы

Благодаря Payload’ам кнопки не являются бесполезными. Они могут, например, открывать другие меню или выполнять другие команды.
После нажатия на кнопку она отправляет запрос с данными, благодаря которым бот и понимает, что была нажата та или иная кнопка:

if (isset($data->object->message->payload)) {
  $payload = json_decode($data->object->message->payload, true); 
} else {
  $payload = null;
}
$payload = $payload['command'];

Таким образом можно определить, что пользователь начал диалог по стартовой кнопке, например:

if ($payload == 'start') {
  // code...
}

Реакции на действия пользователя в сообществе

Предположим, что пользователь поставил лайк на запись, а Вы хотите его отблагодарить (необходимо включить: Записи на стене -> Добавление лайка):

if ($data->type == 'like_add') {
	$vk->sendMessage($from_id, "$first_name, спасибо за лайк!");
}

Реакция на репост записи (необходимо включить: Записи на стене -> Репост):

if ($data->type == 'wall_repost') {
	$vk->sendMessage($from_id, "$first_name, спасибо за репост!");
}

Если Вам важен ID поста, который репостнул человек, то он хранится в переменной $post_id. Таким образом можно добавить реакцию на конкретный пост:

if ($data->type == 'wall_repost' && $post_id == 'ID поста') {
	$vk->sendMessage($from_id, "$first_name, спасибо за репост поста с конкурсом! Теперь ты принимаешь в нем участие!");
}

Реакция на комментарий записи сообщества (необходимо включить: Записи на стене -> Добавление):

if ($data->type == 'wall_reply_new') {
	$vk->sendMessage($from_id, "$first_name, спасибо за комментарий!");
}

Статьи / PHP

По началу покажется что это не возможно, но поверьте, Вам стоит только начать и все получится. Так как бота мы будем делать на сообществе, нам нужно его создать или использовать уже созданное 

После того как создали сообщество, переходим в настройки  

Далее в раздел Сообщения и включаем данную функцию, без нее работать наш бот не будет.

У нас появляется раздел Настройки для бота, переходим в него и включаем, при желании можете активировать возможность добавлять в беседы.

Далее переходим: Настройки -> Работа с API -> Ключи доступа и создаем ключ со следующими параметрами:

Этого будет достаточно, так как мы будем работать с сообщениями, получаем вот такой большой код (токен)

3a5eb7b4f02821c71813ef13ba3d0eccfca127bd1e64d97f077bb3467c31a7808af1bda385230fbbc18db

Данный токен сообщать другим пользователям нельзя, иначе Вы рискуете потерять доступ к своему сообществу, в моем случае после написания статьи я его удалю и он станет не активный. Сохраните токен в блокноте, он нам пригодится.

С настройками сообщества пока закончим, но в данный раздел нам нужно будет еще вернутся, теперь приступаем к написанию кода для нашего будущего бота. Конечно в данной статье я не буду показывать основные функции своего бота, а лишь небольшую часть, остальное Вы сможете сделать сами при желании, это лишь начальный этап создания бота, учитывайте это.

Бота мы будем писать на PHP.

Для удобства написания кода, я рекомендую скачать Sublime Text, один из лучших редакторов, самое главное удобный и практичный.

Создаем файл с расширением .php, например bot.php

Открываем любым редактором и начинаем писать код.

Вместе с исходником, я положу библиотеку, без нее бот работать не будет, библиотека является публичной, ее можно найти на просторах интернета, создана она очень хорошим человеком, скачать ее можно будет только после регистрации на сайте, требую мало, но оно того стоит  blush 

Библиотека упрощает работу с кодом и методами API VK.

Подключаем библиотеку:

<?php
require_once('simplevk-master/autoload.php');
use DigitalStarvk_apiVK_api as vk_api; // Основной класс

Теперь создаем константы, они нужны для удобства

Их нужно заполнить. в кавычках вставляем тот самый длинный код (токен), вторую константу мы пока пропускаем, а в 3 пишем версию API, которую мы будем использовать. Давайте возьмем 5.81. Нам так же нужно указать и ACCESS_KEY его мы берем в сообществе.

В моем случае это: be20ea35 у Вас будет другой, копируем и вставляем во вторую константу. У Вас должно получится вот так:

<?php

require_once('simplevk-master/autoload.php');
use DigitalStarvk_apiVK_api as vk_api; // Основной класс


const VK_KEY = "3a5eb7b4f02821c71813ef13ba3d0eccfca127bd1e64d97f077bb3467c31a7808af1bda385230fbbc18db";  // Токен сообщества
const ACCESS_KEY = "be20ea35";  // Тот самый ключ из сообщества
const VERSION = "5.126"; // Версия API VK

Обратите внимание, что токен и строка сообщества будет отличаться от вашего!

Продолжаем. Теперь нам нужно создать экземпляр класса работы с api, получить и декодировать JSON пришедший из VK и сообщить VK что мы приняли callback, все это кажется сложным, но на деле все очень просто и понятно.

Получаем следующий код:

$vk = vk_api::create(VK_KEY, VERSION)->setConfirm(ACCESS_KEY);

$vk->initVars($peer_id, $message, $payload, $vk_id, $type, $data); // Инициализация переменных

Теперь приступаем к самому интересному, обработке сообщений и созданию команд. Для начала нам нужно получить объект новых сообщений, для его дальнейшей обработки:

if ($data->type == 'message_new') {


    }

Теперь можно создать первую команду! Наша команда будет !бот, давайте напишем ее:

if ($data->type == 'message_new') {

    if ($message == '!бот') {

            $vk->sendMessage($peer_id, "Привет :-)"); // Отправляем ответ
            
        }


    }

Этот код работать не будет, так как мы не создали переменные $id и $message давайте создадим их. Переменные создаем выше строки

if ($data->type == ‘message_new’) {

$id = $data->object->from_id; // Узнаем ID пользователя, кто написал нам
$message = $data->object->text; // Само сообщение от пользователя

Статья обновлена 17.12.2020 

Теперь часть переменных инициализируется в функции InitVars но для примера оставим как их можно задавать еще!

У нас получается следующий код:

<?php

require_once('simplevk-master/autoload.php');
use DigitalStarvk_apiVK_api as vk_api; // Основной класс


const VK_KEY = "3a5eb7b4f02821c71813ef13ba3d0eccfca127bd1e64d97f077bb3467c31a7808af1bda385230fbbc18db";  // Токен сообщества
const ACCESS_KEY = "be20ea35";  // Тот самый ключ из сообщества
const VERSION = "5.126"; // Версия API VK


$vk = vk_api::create(VK_KEY, VERSION)->setConfirm(ACCESS_KEY);

$vk->initVars($peer_id, $message, $payload, $vk_id, $type, $data); // Инициализация переменных
// ====== Наши переменные ============
$vk_id = $data->object->from_id; // Узнаем ID пользователя, кто написал нам
$message = $data->object->text; // Само сообщение от пользователя
// ====== *************** ============

if ($data->type == 'message_new') {

    if ($message == '!бот') {
            $vk->sendMessage($peer_id, "Привет :-)");
        }

   }

Это уже полностью рабочий бот, Вы уже можете его запустить, давайте это и сделаем, потом вернемся в код и напишем еще 1 команду.

Нам понадобиться любой хостинг, на котором будет установлен PHP версии не ниже 5.6, стоимость такого хостинга от 30 рублей и выше, статью о том как работать с хостингом я напишу позже, у меня есть видео ролик по работе с игровым хостингом, скрипт будет работать и там. Видео можете посмотреть ниже

Добавлена статья как залить скрипт на сервер с инструкцией

Загружаем скрипты на бесплатный хостинг с PHP и MySQL. Подойдет для скриптов бота ВК 

Допустим Вы разобрались с хостингом и готовы установить туда сам скрипт. Заходим на сервер и загружаем туда наш скрипт с  ботом VK и библиотеку. Саму библиотеку скачать можно только после регистрации!

Внимание! У Вас нет прав для просмотра скрытого текста.

[/hide]

Скачиваем архив, туда я так же положил и скрипт, в нем нужно будет заменить лишь токен и строку, которую скрипт возвращает VK и дописать 2 команду при желании, если она Вам будет нужна.

 

Теперь нужно получить прямую ссылку к скрипту, в моем случае скрипт залит в корень сайта и ссылка выглядит так:

http://qu4.ru/bot.php

копируем ссылку, у вас будет другая, возможно состоящая даже из IP адреса, если используете игровой сервер или хостинг без домена. Возвращаемся к настройкам бота в сообществе и вставляем ссылку:

Выбираем версию API 5.126, указываем ссылку и подтверждаем, если все сделали правильно, VK сообщит нам об этом 

Если сейчас написать боту, он не ответит, так как нам нужно включить тип событий:

Этого будет достаточно, что бы бот начал функционировать и отвечать нам. Давайте это проверим:

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

Если Вы допустили в коде ошибку, то у Вас появится Ошибка 500, это означает что Вы допустили ошибку в самом коде скрипта:

Данный бот будет работать только с хостингом, запустить с ПК скрипт не получится

(Получится, но это требует особых навыков hushed)

Теперь наш бот отлично функционирует, а значит можно добавлять новые команды, давайте сделаем команду !дата

Создаем переменную $date и записываем в нее текущую дату и время, с помощью PHP функции date(); получаем следующий код

$date = date("d.m.Y  H:i");

Теперь нам нужно создать саму команду:

        if ($message == '!дата') {

            $vk->sendMessage($peer_id, $date);
            
        }

Весь исходный код выглядит так:

<?php

require_once('simplevk-master/autoload.php');
use DigitalStarvk_apiVK_api as vk_api; // Основной класс


const VK_KEY = "3a5eb7b4f02821c71813ef13ba3d0eccfca127bd1e64d97f077bb3467c31a7808af1bda385230fbbc18db";  // Токен сообщества
const ACCESS_KEY = "be20ea35";  // Тот самый ключ из сообщества
const VERSION = "5.126"; // Версия API VK


$vk = vk_api::create(VK_KEY, VERSION)->setConfirm(ACCESS_KEY);

$vk->initVars($peer_id, $message, $payload, $vk_id, $type, $data); // Инициализация переменных
// ====== Наши переменные ============
$vk_id = $data->object->from_id; // Узнаем ID пользователя, кто написал нам
$message = $data->object->text; // Само сообщение от пользователя

$date = date("d.m.Y  H:i");
// ====== *************** ============

if ($data->type == 'message_new') {

    if ($message == '!бот') {

            $vk->sendMessage($peer_id, "Привет :-)");
         
        }
    if ($message == '!дата') {

        $vk->sendMessage($peer_id, $date);

    }


   }
   

У нас получилось всего 37 строк кода 

Что бы Вы понимали, бот KotOFF и Conference Kot содержит 1761 строку кода! Хотя функционал не самый большой на данный момент.

Давайте проверим работу команды:

Отлично! Все работает. Если данная статья будет интересна, я напишу продолжение и там мы будем создавать новые команды для нашего бота, а пока только вводный курс о создании собственного бота с удобной и очень классной библиотекой, которая помогает упросить код и облегчить работу с методами API. Вместе с Вами учусь и я, ведь я не являюсь программистом и делюсь с вами личным опытом, который я получил совсем недавно. 

UPD: Что бы бот отвечал и в беседах нужно заменить частично код, инструкция ниже

Где:

$id = $data->object->from_id;

Заменить на 

$id = $data->object->from_id;
$peer_id = $data->object->peer_id;

Далее заменить:

$vk->sendMessage($id, "Привет :-)");

На 

$vk->sendMessage($peer_id, "Привет :-)");

$id — хранит ид пользователя
$peer_id — хранит в себе ид беседы

Если возникли вопросы или трудности, пишите в комментарии, я с радостью отвечу на них.

На этом у меня все, со временем буду корректировать статью и дополнять ее.

Данный бот отлично подойдет как автоответчик или инструкция (FAQ) для вашего сообщества.

Разработка ботов на заказ, любой сложности, обращаться:

Скачать архив с ботом и библиотекой можно после регистрации на сайте! Регистрация доступна через социальные сети :)

Внимание! У Вас нет прав для просмотра скрытого текста.

Внимание! У Вас нет прав для просмотра скрытого текста.

Рекомендуем размещать скрипты на таких хостингах: firstvds.ru или hostline.ru

СТАТЬЯ ОБНОВЛЕНА 17.12.20 ДЛЯ ПОДДЕРЖКИ ПОСЛЕДНИХ ВЕРСИЙ АПИ ВК 5.126

Продолжаем цикл статей посвященный написанию чат-ботов для социальных сетей на php. Прошлый раз мы создавали бота для Телеграм, а в этот раз я расскажу как сделать аналогичного бота для ВКонтакте. Забегая вперед скажу, что сегодня мы не будем использовать ВКшный PHP SDK и наш бот будет состоять лишь из одного файла (про SDK поговорим в другой раз).

Также, как и в случае с Телеграмм ботом нам потребуются минимальные навыки программирования на php, хостинг и ssl сертификат. Готовы? Приступим!

Что будет уметь наш бот?

Возможности бота ограничены лишь фантазией программиста (благо api вк многое позволяет), поэтому для примера наш бот будет уметь лишь самое простое, а именно:

  1. Отправлять уведомления при вступлении в сообщество;
  2. Отвечать в случае если пользователь отправил ЛС в чат группы;
  3. Отправлять уведомление в момент когда пользователь покидает группу.

Начинаем создавать бота

Прежде чем начнем писать код, создадим ключи доступа для нашего бота. Для этого перейдем в Управление сообществом, выберем справа «Работа с API» и нажмем на «Создать ключ».

Во всплывающем окне отметим галочками права доступа. В нашем случае достаточно лишь поставить галочку напротив пункта «Разрешить приложению доступ к сообщениям сообщества«, но имейте ввиду, что для более крутых ботов стоит ставить галки напротив всех пунктов сразу. Подтвердим действие нажатием по кнопке «Создать».

Далее нам предложат подтвердить действие через мобильное уведомления в приложении ВК или по СМС. Я выбрал второе. Получил код по СМС и ввел его.

Далее ВКонтакте генерирует для нас длинный проверочный ключ (token).  Запишем его куда-нибудь (например в блокнот). В дальнейшем он нам понадобится для написания кода.

Теперь перейдем во вкладку Callback API->Настройки сервера. Здесь нас интересуют сразу 3 вещи: Адрес, Строка, которую должен вернуть сервер и Секретный ключ. Адрес пока пропустим (в целом вы можете сразу его заполнить если определились с тем, где будет лежать основной файл нашего php-бота, но поскольку сам файл еще не создан, то ВК будет ругаться, ибо сразу после ввода url соцсеть отправляет POST-запрос на проверку доступности бота по указанному адресу). Скопируем значение напротив «Строка, которую должен вернуть сервер» (confirmationToken). (в нашем случае это tt32e1. Придумает Секретный ключ (secretKey). Не забываем нажать «Сохранить».

Итак, на выходе у нас должны быть где-то записаны 3 вещи:

  1. confirmationToken
  2. token
  3. secretKey

Теперь можно приступить к написанию php кода.

Начинаем писать файл нашего бота ВКонтакте. Назовем его vk_bot.php. Напомню, что код необходимо писать в кодировке UTF-8 (без BOOM).

Определимся с константами:

if (!isset($_REQUEST)) {return;}
// Строка, которую должен вернуть сервер (См. Callback API->Настройки сервера)
$confirmationToken = 'tt32e1';
// Ключ доступа сообщества (длинная строчка которую получили нажав "создать ключ")
$token = 'тутбудетмногобуквицифр';
// Секретный ключ. (Задаем в Callback API->Настройки сервера)
$secretKey = 'testKeyMyBot';

Теперь проверим поступившие данные:

// Получаем и декодируем уведомление
$data = json_decode(file_get_contents('php://input'));
// проверяем secretKey
if (strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0) {return;}

Используя switch проверим, что находится в поле «type» (какое событие сработало и в зависимости от этого сформируем ответ).

// Проверяем, что находится в поле "type"
switch ($data->type) {
// Запрос для подтверждения адреса сервера (посылает ВК)
case 'confirmation':
echo $confirmationToken; // отправляем строку для подтверждения адреса
break;
// Если это уведомление о новом сообщении...
case 'message_new':
// получаем id автора сообщения
$userId = $data->object->user_id;
// через users.get получаем данные об авторе
$userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));
// Вытаскиваем имя отправителя
$user_name = $userInfo->response[0]->first_name;
// Через messages.send используя токен сообщества отправляем ответ
$request_params = array(
'message' => "{$user_name}, Ваше сообщение получено!
В ближайшее время админ группы на него ответит.",
'user_id' => $userId,
'access_token' => $token,
'v' => '5.0'
);
$get_params = http_build_query($request_params);
file_get_contents('https://api.vk.com/method/messages.send?'. $get_params);
echo('ok'); // Возвращаем "ok" серверу Callback API
break;
}

Небольшое пояснение:

Когда юзер отправляет сообщение в чат с группой срабатывает событие. Событие представляет собой JSON, имеющий следующую структуру:

{«type»: <тип события>, «object»: <объект, инициировавший событие>, «group_id»: <ID сообщества, в котором произошло событие>}

В зависимости от того, что нам пришло в type, мы можем понять, какая структура будет у объекта  object. Полный список возможных событий см. в официальной справке ВКонтакте.

Итак, на данный момент мы научили нашего бота 2-м вещам: корректно отвечать роботу ВК на проверочный запрос, а также автоматически отправлять пользователю уведомление в случае, если он отправит любой текст.

Теперь можно закачать наш с вами файл на сервер и заполнить в настройках адрес (если не сделали этого ранее).

Кроме этого необходимо перейти во вкладку «Типы событий» и поставить галочку напротив «Входящие сообщения».

Теперь можем проверить работу:

Как видим — все пашет. По сути у нас уже получилось сделать бота в вк. Давайте его немного прокачаем.

Добавим в конструкцию case еще 2 условия. Первое — отправит уведомлений в случае если человек вступил в нашу группу:

// Сработало событие - человек вступил в группу
case 'group_join':
// получаем id автора сообщения
$userId = $data->object->user_id;
// через users.get получаем данные об авторе
$userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));
// Вытаскиваем имя отправителя
$user_name = $userInfo->response[0]->first_name;
// Через messages.send используя токен сообщества отправляем ответ
$request_params = array(
'message' => "Добро пожаловать в группу, {$user_name}!",
'user_id' => $userId,
'access_token' => $token,
'v' => '5.0'
);
$get_params = http_build_query($request_params);
file_get_contents('https://api.vk.com/method/messages.send?'. $get_params);
echo('ok'); // Возвращаем "ok" серверу Callback API
break;

Второе — аналогичное уведомление, но только в момент, когда человек покинет сообщество:

// Сработало событие - человек покинул группу
case 'group_leave':
// получаем id автора сообщения
$userId = $data->object->user_id;
// через users.get получаем данные об авторе
$userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0"));
// Вытаскиваем имя отправителя
$user_name = $userInfo->response[0]->first_name;
// Через messages.send используя токен сообщества отправляем ответ
$request_params = array(
'message' => "{$user_name}, нам очень жаль, что вы покинули нашу группу!",
'user_id' => $userId,
'access_token' => $token,
'v' => '5.0'
);
$get_params = http_build_query($request_params);
file_get_contents('https://api.vk.com/method/messages.send?'. $get_params);
echo('ok'); // Возвращаем "ok" серверу Callback API
break;

Не забудем добавить соответсвтующие галочки напротив нужных нам событий в настройках группы:

Чего нельзя делать ботам

Не лишним будет процитировать один из разделов справки ВК:

Любой пользователь с базовыми навыками программирования может создать чат-бота ВКонтакте. Ботов можно написать для разных целей: от поиска рецептов до обработки фотографий. Их возможности ограничены только Вашей фантазией и правилами, которые мы разработали для того, чтобы боты использовались только в благих целях.

Прежде чем продолжить работу с бот-платформой, убедитесь, что все руководители сообщества ознакомлены с этими правилами. За их нарушение сообщество может быть заблокировано.

Ботам запрещено:

требовать подписку на сообщество, отметки «Нравится» и репосты;
рассылать рекламу, в том числе ссылки на аккаунты сообщества в других сервисах;
нарушать Правила пользования сайтом ВКонтакте.

Теперь вы знаете как создавать своего бота в ВК. Исходники урока можно скачать тут. В следующий раз поговорим о работе с PHP SDK для вк-ботов. Если у вас остались вопросы — задавайте в комментах. И не забываем репостить и лайкать эту статью)


Post Views:
13 104

Как создать чат-бота ВКонтакте

Как создать чат-бота ВКонтакте

10 августа 2021 PHP

В этом руководстве создадим чат-бота ВКонтакте, которого можно добавить не только в сообщения группы, но и в групповую беседу. Бот может прослушивать все сообщения в беседе, и если в каком-то из них будет содержаться определенное слово, фраза или часть текста, бот будет отвечать на него. Сообщения бота, так же как и обычного пользователя, могут содержать не только текст, но и например, изображения или видеоролик.

Сфера применения бота ограничивается только вашей фантазией, с ним можно не только общаться, но и например, научить его присылать заказы из интернет-магазина в беседу с сотрудниками. Так же бот может отслеживать не только новые сообщения, но и множество других событий, например, когда сообщение редактируется, кто именно его написал, содержится ли в нем медиа и т.д.

Создание сообщества

Боты ВКонтакте работают от имени сообществ, поэтому если у вас нет группы, регистрируем ее в разделе Сообщества → Создать сообщество.

Создание сообщества ВКонтакте

Укажите тип сообщества, например «Группа по интересам».

Тип сообщества

Укажите название и тематику сообщества.

Название сообщества

Создание ключей доступа

После того, как сообщество будет создано, перейдите в его настройки по ссылке «Управление» с его главной страницы. Здесь есть iphone

Главная страница сообщества

Выберите меню «Работа с API» и создайте новый ключ.

Работа с API

Пока что для бота нам хватит отслеживать только сообщения, поэтому отметьте галочкой этот пункт.

Создание ключа доступа

Созданный ключ можно увидеть на вкладке «Ключи доступа».

Ключи доступа

Перейдите на вкладку CallBack API. Выберите версию 5.89. Вы можете выбрать и самую последнюю, но учтите, что передаваемые параметры там будут несколько другие, чем в приведенном ниже коде. Поле адрес пока оставьте пустым. Придумайте любой секретный ключ. Так же вам понадобится код из поля «Строка, которую должен вернуть сервер».

Callback API

На вкладке типы событий отметьте входящие сообщения.

Типы событий

Дли того, чтобы боту можно было написать в группе, включите функцию сообщений.

Сообщения

Разрешите добавлять бота в беседы.

Настройки для бота

После добавления бота в беседу, он может принимать сообщения, которые адресованы только ему. Чтобы бот смог отслеживать все сообщения устанавливаем опцию в настройках участников. Сделать это может только администратор беседы.

Доступ ко всей переписке

Итак, после всех манипуляций вы должны получить 3 секретных ключа:

  • Ключ доступа
  • Секретный ключ
  • Строка, которую должен вернуть сервер

PHP-код чат-бота

Замените в коде строки с ключами на полученные и сохраните его на вашем хостинге, например по адресу http://site.ru/bot.php

Затем укажите этот адрес в настройках бота на вкладке Callback API (то, что пропустили на предыдущем шаге настроек).

<?php
$confirmationToken = '<Строка, которую должен вернуть сервер>';
$secretKey = '<Секретный ключ>';	

// Функция отправляющая сообщения
function vk_msg_send($peer_id, $text){
	
	$request_params = array(
      'message' => $text,
	  'attachment' => $attachment,
      'peer_id' => $peer_id,
      'access_token' => '<Ключ доступа>',
      'v' => '5.89'
    );
	
	$get_params = http_build_query($request_params); 
	file_get_contents('https://api.vk.com/method/messages.send?' . $get_params);
}

$data = json_decode(file_get_contents('php://input')); // Получаем данные с ВК

if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0) {
	return;
}

switch ($data->type) {  
	case 'confirmation': 
		echo $confirmationToken; // Если ВК запрашивает подтверждение, то выводим код подтверждения 
	break;  
		
	case 'message_new':
		// Если событие нового сообщения, то получаем его текст
		$message_text = $data->object->text;
		$peer_id = $data->object->peer_id;
		
		$message_text = mb_strtolower($message_text, 'UTF-8'); // Переводим текст к нижнему регистру
		
		// Если сообщение содержит подстроку привет, отправляем сообщение
		if(strpos($message_text, "привет") !== false){
			vk_msg_send($peer_id, "Привет");
		}
		
		echo 'ok'; // Обязательно уведомляем сервер, что сообщение получено, текстом ok
	break;
}
?>

Бот так же может отправлять медиафайлы. Для этого в переменную $attachment передаем код файла. Получить его можно из адресной строки, например так:

Код медиафайла ВКонтакте

Боты стали новой эпохой в соц сетях и мессенджерах. Мы расскажем как создать настоящего бота на PHP, используя API социальной сети Вконтакте.

Для создание ботов в социальной сети Вконтакте нужно несколько вещей:

  1. Специальный standalone token;
  2. Токен вашей группы;
  3. Сам скрипт с ботом;
  4. Группа с подключенным сервером и API.

Получение токена

Первым делом необходимо получить standalone token вместе с токеном вашей группы. Для этого переходим в раздел для разработчиков и в «Мои приложения». Здесь создаем новое приложение. Название приложения можете выбрать любым, главное чтобы оно было Standalone-приложение.

Включите Open API после создания приложения. В него пропишите сайт, с которым будет связано ваше приложение, а также базовый домен. В нашем случае это itProger.com.

После этого необходимо перейти по этой ссылке. Также вы её видите ниже:

https://oauth.vk.com/authorize?client_id=6678654&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,photos,audio,video,status,messages,wall,groups,offline,stats,email&response_type=token&v=5.63

Единственное, вам необходимо изменить client_id и установить чтобы оно было равным ID вашего приложения.

Далее вы нажимаете на кнопку Разрешить и после этого получаете токен, который будет записан в ссылке. Копируете токен от знака равенства (=) и до амперсанда (&).

После этого создайте новую группу или воспользуйтесь вашей существующей группой. Зайдите в настройке, после чего в Ключи доступа и нажмите Создать ключ. Установите все права для ключа и после этого вы сможете получить токен вашей группы, который вам пригодиться для создания бота.

Создание самого бота

Для создания бота нам понадобиться три файла:

  • config — файл служащий исключительно для нас. В нем мы запишем различные настройки и данные, которые сможем в дальнейшем использовать в других файлах;
  • photos — файл для обработки альбома. В этом файле мы будем обрабатывать альбом, получать из него все изображение и записывать их в новый txt файл в специальном формате, который в дальнейшем будем передавать в качестве прикрепленного изображения к сообщению;
  • bot — основной файл с ботом. Здесь мы прописываем обработку данных от пользователя, а также передачу сообщений от бота к пользователю Вконтакте.

Ниже представлены эти три файла. Они полностью готовы и с рабочим кодом. Детальное описание всего что в них происходит вы можете получить из видео.

Скрипт config:

$album = 'https://vk.com/album-113958919_252151167';
$res = parse_url($album);
$path = substr($res['path'], 6);
$arr = explode('_', $path);
$owner_id = $arr[0];
$album_id = $arr[1];

$standalone = "ваш standalone токен приложения";
$group_token = 'ваш токен группы';
$conf = [
	'standalone' => $standalone,
	'group_token' => $group_token,
	'contorm_token' => 'eae5d4a2',
	'mess' => 'Фото в студио',
	'not_command' => 'Ничего не понял!',
	'owner_id' => $owner_id,
	'album_id' => $album_id,
	'group_id' => '170785666',
	'apiurl' => 'https://api.vk.com/method/',
	'path' => substr($_SERVER['PHP_SELF'], 0, -2),
	'photos' => 'photos.txt',
	'temp_link' => 'temp_album.txt',
	'random_id' => mt_rand(0000000000, 999999999999),
	'v' => '5.50'
];

Скрипт photos:

unlink($conf["photos"]);
$query = file_get_contents($conf['apiurl'].'photos.get?owner_id='.$conf['owner_id'].'&album_id='.$conf['album_id'].'&v='.$conf['v'].'&access_token='.$conf['standalone']);
$res = json_decode($query, true);

foreach($res as $v) {
	foreach($v['items'] as $q) {
		$result = 'photo'.$q['owner_id'].'_'.$q['id'];
		file_put_contents($conf['photos'], $result."n", FILE_APPEND | LOCK_EX);
	}
}

Скрипт bot:

require "config.php";
$data = json_decode(file_get_contents('php://input'));
$u_id = $data->object->user_id;
$mess = $data->object->body;

$user_info = json_decode(file_get_contents($conf['apiurl'].'users.get?user_id='.$u_id.'&v='.$conf['v'].'&access_token='.$conf['standalone']));
$user_name = $user_info->response[0]->first_name;

$temp_link = file($conf['temp_link']);
if($temp_link[0] != $album) {
	file_put_contents($conf['temp_link'], $album);
	require "photos.php";
	return true;
}

switch($data->type) {
	case 'confirmation':
		echo $conf['contorm_token'];
		break;
	case "message_new":
		if($mess == $conf['mess']) {
			$file = file_get_contents($conf['photos']);
			$photos_all = explode("n", $file);
			
			$myCurl = curl_init();
			curl_setopt_array($myCurl, array(
				CURLOPT_URL => $conf['apiurl'].'messages.send?user_id='.$u_id.'&group_id='.$conf['group_id'].'&attachment='.$photos_all[mt_rand(0, count($photos_all) - 1)].'&message='.urlencode('Держи свое фото').'&v='.$conf['v'].'&access_token='.$conf['standalone'],
				CURLOPT_RETURNTRANSFER => true,
				CURLOPT_POST => true,
				CURLOPT_POSTFIELDS => http_build_query(array())
			));
			$response = curl_exec($myCurl);
			curl_close($myCurl);
		} else {
			$myCurl = curl_init();
			curl_setopt_array($myCurl, array(
				CURLOPT_URL => $conf['apiurl'].'messages.send?user_id='.$u_id.'&group_id='.$conf['group_id'].'&message='.urlencode($conf['not_command']).'&v='.$conf['v'].'&access_token='.$conf['standalone'],
				CURLOPT_RETURNTRANSFER => true,
				CURLOPT_POST => true,
				CURLOPT_POSTFIELDS => http_build_query(array())
			));
			$response = curl_exec($myCurl);
			curl_close($myCurl);
		}
		echo 'ok';
		break;
}

Детальное описание создания бота на языке PHP под систему Вконтакте:

Последнее что необходимо будет сделать, так это прописать URL адрес скрипта bot.php в группе, в настройках API:

После этого можете написать сообщение в группу и бот будет вам отвечать. Напишите «Фото в студио» и бот пришлет вам случайную фотографию из альбома.

Всем привет! Недавно на одном проекте мне пришлось столкнуться с ботом вк, который «живёт» в сообщениях группы. До этого я имел самый разный опыт создания ботов из личных страничек. Для того, чтобы бот мог нормально отвечать на сообщения приходилось делать самые разные извращения с кроном, таймерами, «запоминанием» сообщений и другими разными ужасами.
Как же я удивился, когда начав курить VK API групп касаемо сообщений, я увидел это чудо — Callback API.

Для нетерпеливых или любящих разбираться со всем самостоятельно в конце есть готовый пример.

Статья рассчитана не для совсем новичков и я не стал её сильно затягивать, специально опустив разжёвывание совсем очевидных вещей, иначе бы это была бы очень огромная статья. Тема написания ботов в целом так-то не очень новичковая тема.

Для тех кто не знает, что это, расскажу кратко.
При помощи этой фишки вк сам, автоматически, отправляет запросы в формате JSON куда мы укажем сами.
О формате JSON я писал немного инфы в статье про создание авторизации через вк

Так вот, в этом callback запросе вк может уведомлять обо всём: новых сообщениях группы, исходящих от группы сообщениях, видео, аудио, комментариях, новых подписчиках и так далее. И мы, прочитав этот запрос, можем решить, как на этот запрос реагировать.
Прямо как платёжные системы. Магия.

Давайте по порядку. Для того, чтобы воспользоваться callback api для создания бота или ещё чего-бы то ни было, нужно:

Сначала, конечно же, создать группу.
Открыть раздел «Управление сообществом», в котором справа будет вот такое меню:

Выбираем работу с API, где и имеем все настройки.

В первую очередь нужно создать API ключ, который сразу желательно где-то записать, потому что для его повторного отображения нужно будет получать смску на телефон.
Наверху водится вкладка с Callback API.

Откройте её и посмотрите, что там есть. Сразу можете указать в типах событий «Входящее сообщение», остальные пока не трогаем, иначе они будут без нужды напрягать сервер как вк, так и Ваш.

Предлагаю сделать вот что:
Пусть бот будет отвечать на сообщения этим же сообщением, которое ему прислали, только задом-наперёд, ахах

Для начала давайте слепим два файла. callback.php и vk.class.php. Класс нужен чисто для удобства, чтобы не громоздить большую кучу кода в одном файлике. Сделаем всё аккуратно :D

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

Перед использованием самого каллбек апи придётся так же для начала подтвердить свой каллбек-скрипт, отдав вк нужную строку. Все запросы от каллбека будут лететь в формате JSON (уже говорил) и вк как бы сам показывает, как они будут выглядеть. Первый из них, это confirmation, который будет смотреться примерно так:

{"type":"confirmation","group_id":ИДГРУППЫ}

Идём теперь в наш callback.php, в котором для начала нужно получить запрос от вк и проверить, что же там пришло и сразу это обработать. О структуре запроса отправляемого от вк можно узнать из официальной документации вк
Ниже приведён сразу полный код файла callback.php, который будет укомплектован тонной комментариев )
Весь код будет максимально упрощен, во многих местах на каком-то большом и серьёзном проекте так лучше не делать ) Нужны будут как минимум обработчики ошибок и так далее, которые вк может вполне себе вернуть. Так же желательно будет использовать секретный ключ и всякое-разное

<?php
	$body = file_get_contents('php://input'); //Получаем в $body json строку
	$arr = json_decode($body, true); //Разбираем json запрос на массив в переменную $arr
	
	if ($arr['type'] == 'confirmation') { //Если нам пришел запрос на подтверждение callback скрипта, то
		exit("xxxxxxxx");  //отдаём в ответ свой код подтверждения выданный вк и останавливаем скрипт, дальше ему ничего не требуется
	}
	//Если скрипт выполняется дальше, значит это не confirmation, а одно из уведомлений.
	//Т.к. на данном этапе мы обрабатываем только входящее письмо, значит это входящее письмо
	if ($arr['type'] == 'message_new') { //Проверим на всякий случай, точно ли это входящее письмо
		function cir_strrev($stroka){ //Так как функция strrev не умеет нормально переворачивать кириллицу, нужен костыль через массив. Создадим функцию
			preg_match_all('/./us', $stroka, $array); 
			return implode('',array_reverse($array[0]));
		}
	
		//Значит точно входящее. Можно уже и наш класс подключить
		include_once ('vk.class.php'); //Меж дела подключаем наш vk.class.php
		
		//Сразу и создадим этот класс, который будет написан чуть позже
		//Сюда пишем ключ апи, который создавали в самом начале
		$vk = new vk('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
		
		$sms = $arr['object']['body']; //Получаем текст сообщения, которое нам пришло.
		//О структуре этого массива который прилетел нам от вк можно узнать из официальной документации. Ссылка выше, до кода
		
		//Сразу и user_id получим, которому нужно отправлять всё это назад
		$vk_id = $arr['object']['user_id'];
		
		//Перевернём строку задом-наперёд используя php функцию strrev
		$sms_rev = cir_strrev($sms);
		
		//Используем наш ещё не написанный класс, для отправки сообщения в ответ
		$vk->send($vk_id, $sms_rev);
	}
	exit('ok'); //Обязательно возвращаем "ok", иначе вк отправит уведомление несколько раз

Теперь, собственно, сам vk.class.php:

<?php
//Задаём класс
class VK {

	public $token = ''; //Создаём публичную переменную для токена, который нужно отправлять каждый раз при использовании апи вк

	public function __construct($token) {
		$this->token = $token; //Забиваем в переменную токен при конструкте класса
	}
	
	public function send($id, $message) {	//Задаём публичную функцию send для отправки сообщений
		//Заполняем массив $data инфой, которую мы через api отправим до вк. О функции api "messages.send" можно почитать в официальной документации вк
		$data = array( 
			'peer_id'      => $id,
			'message' 	   => $message,
			'v'            => '5.46', //Версия для функции. Её передавать нужно обязательно. Узнать нужную можно через официальную документацию вк
		);
		//Получаем ответ через функцию отправки до апи, которую создадим ниже
		$out = $this->request('messages.send', $data);
		//И пусть функция вернёт ответ. Правда в данном примере мы это никак не будем использовать, пусть будет задаток на будущее
		return $out;
	}	
	
	public  function request($method, $data = array()) {
		$curl = curl_init(); //мутим курл-мурл в переменную. Для отправки предпочтительнее использовать курл, но можно и через file_get_contents если сервер не поддерживает
		
		$data['access_token'] = $this->token; //токен, который нужно отправить вместе с запросом тоже нужно добавить в дату

		curl_setopt($curl, CURLOPT_URL, 'https://api.vk.com/method/' . $method); //Ссылки до разных методов апи вк выглядят так: https://api.vk.com/method/И_ТУТ_САМ_МЕТОД, поэтому метод вполне можно забивать в эту функцию и без всяких ссылок
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); //Отправляем через POST
		curl_setopt($curl, CURLOPT_POST, true);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //Сами данные отправляемые
		
		$out = json_decode(curl_exec($curl), true); //Получаем результат выполнения, который сразу расшифровываем из JSON'a в массив для удобства
		
		curl_close($curl); //Закрываем курл
		
		return $out; //Отправляем ответ в виде массива
	}
}

Рабочий пример, так сказать, демо, можно посмотреть вот здесь. )

Понравилась статья? Поделить с друзьями:
  • Как написать бота для ватсап
  • Как написать бота для вайбер
  • Как написать бота для браузера
  • Как написать бота для биржи криптовалют
  • Как написать бота для бинарных опционов