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

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

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

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

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

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

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

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

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

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

  1. confirmationToken
  2. token
  3. secretKey

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

Как создать бота в ВК (кодинг на 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":

$userId = $data->object->user_id;



$user_name = $userInfo->response->first_name;

$request_params = array(
"message" => "{$user_name}, Ваше сообщение получено!
В ближайшее время админ группы на него ответит.",
"user_id" => $userId,
"access_token" => $token,
"v" => "5.0"
);



break;
}

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

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

{«type»: <тип события>, «object»: <объект, инициировавший событие>, «group_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->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->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 для вк-ботов. Если у вас остались вопросы - задавайте в комментах. И не забываем репостить и лайкать эту статью)

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


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

Авторизация

Нам понадобится библиотека vk_api . Авторизоваться в вк можно двумя способами:
- Как пользователь
- Как сообщество


В первом случае надо будет ввести логин и пароль. Во втором случае в группе надо включить "Сообщения сообщества" и создать ключ доступа к API:





import time import vk_api vk = vk_api.VkApi(login = "login", password = "password") #vk_api.VkApi(token = "a02d...e83fd") #Авторизоваться как сообщество vk.auth()

Отправка сообщений

Теперь напишем короткую функцию, которая отправляет сообщение выбранному человеку.


P.S. Сообщество может отправлять сообщения только ранее писавшим пользователям.


def write_msg(user_id, s): vk.method("messages.send", {"user_id":user_id,"message":s})

В vk.method мы можем вызывать любой метод из VK API и передавать параметры в виде словаря.


В данном случае мы вызываем метод messages.send и в качестве параметров передаем id пользователя и текст сообщения.

Прием сообщений

Отлично! Отправлять сообщения мы научились, осталось научиться их принимать. Для этого нам нужен метод messages.get .


Несколько параметров, на которые стоит обратить внимание:


1) out - если этот параметр равен 1, сервер вернет исходящие сообщения.
2) count - количество сообщений, которое необходимо получить.
3) time_offset - максимальное время, прошедшее с момента отправки сообщения до текущего момента в секундах.
4) last_message_id - идентификатор сообщения, полученного перед тем, которое нужно вернуть последним (при условии, что после него было получено не более count сообщений)


values = {"out": 0,"count": 100,"time_offset": 60} vk.method("messages.get", values)

В нашем случае этот метод вернет все полученные сообщения за последние 60 сек, если их конечно было меньше 100, а если больше, то последние 100.


В итоге мы получаем список items:


{u"count": 3441, u"items": [{u"body": u"\u041f\u0438\u0448\u0435\u043c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0432\u043a!", u"date": 1491934484, u"id": 7387, u"out": 0, u"read_state": 0, u"title": u" ... ", u"user_id": 23107592}, {u"body": u"\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!", u"date": 1491934479, u"id": 7386, u"out": 0, u"read_state": 0, u"title": u" ... ", u"user_id": 23107592}]}

Если объяснять простыми словами, то items - это то, что можно выделить в диалоге.



Финальный аккорд, делаем вечный цикл, где на каждое сообщение будем отвечать "Привет, Хабр!".


while True: response = vk.method("messages.get", values) if response["items"]: values["last_message_id"] = response["items"]["id"] for item in response["items"]: write_msg(item,u"Привет, Хабр!") time.sleep(1)

Чат-бот готов.


P.S. Мы запоминаем параметр last_message_id, чтобы в следующий раз обрабатывать только новые сообщения.


Полный код

# -*- coding: utf-8 -*- import time import vk_api vk = vk_api.VkApi(login = "login", password = "password") #vk_api.VkApi(token = "a02d...e83fd") #Авторизоваться как сообщество vk.auth() values = {"out": 0,"count": 100,"time_offset": 60} def write_msg(user_id, s): vk.method("messages.send", {"user_id":user_id,"message":s}) while True: response = vk.method("messages.get", values) if response["items"]: values["last_message_id"] = response["items"]["id"] for item in response["items"]: write_msg(item,u"Привет, Хабр!") time.sleep(1)


Получилось 17 строк кода. Успехов!


UPD 17.09.18:
К сожалению в новой версии (5.80) VK API был убран метод "messages.get" и данная статья потеряла актуальность. Теперь для создания ботов используйте систему longpoll. Пример на модуле vk_api для Python вы можете найти .

Из прошлых статей мы создавали простой скрипт для переписки. Были рассмотрены базовые возможности. На этот раз мы напишем чат-бот с командами. Реализуем такие команды:

  • город [название города]. Данной командой задается город собеседника, бот запомнит его, сохранит в файл. Эти данные будут доступны даже после перезапуска программы.
  • погода . Бот отправляет текущую температуру в городе собеседника.
  • пробки . Бот получает скриншот Яндекс.Карт с состоянием пробок и отправляет картинку.
  • события . Бот отправляет список событий в городе собеседника.
  • пришли на email . Бот сохраняет email собеседника в файл.

Город

Город собеседника мы будем хранить в текстовом файле. Для каждого скрипта создается отдельная папка в которой он может хранить произвольные файлы, которые будут переживать перезапуск программы. Папка будет создана рядом со скриптом. Рассмотрим фрагмент кода по обработке команды город .

Var cityFile = profile + "__" + contact; if (content.startsWith("город ")) { var city = content.substring(6); log.info("Saving city for contact " + contact); tools.writeToFile(cityFile, city); return "Теперь я знаю твой город."; }

В переменную cityFile мы сохраняем имя файла. Далее с помощью вызова метода tools.writeToFile(file, data) мы сохраняем город в файл. Обратите внимание, что функцией writeToFile пользоваться небезопасно в случае если несколько анкет выполняют один и тот же скрипт и обращаются к одному и тому же файлу. Поэтому мы используем id анкеты в имени файла, чтобы исключить такие конфликты.

Для чтения из файла используется метод tools.readFromFile(file). Данная функция читает весь файл и возвращает содержимое. Если файла не существует, функция возвращает пустую строку.

Var city = tools.readFromFile(cityFile); if (city.isEmpty()) { return "Я не знаю твой город:("; }

Выбор имени файла

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

Var profile = hist.localContact().getID().toString(); var contact = hist.externalContact().getID().toString(); var cityFile = profile + "__" + contact;

Здесь мы получаем данные об анкете в боте через метод hist.localContact(). Далее методом getID() получаем внутренний идентификатор анкеты (выглядит примерно так profile_www.vk.com_+79129192508). Аналогично получаем идентификатор собеседника (id361493719). В результате в переменной cityFile получаем profile_www.vk.com_+79129192508__id361493719. Поскольку имя содержит идентификатор анкеты, добавленной в бот, другая анкета не сможет сгенерировать такое же имя файла и конфликтов не будет.

Погода

Для получения данных о погоде воспользуемся сервисом openweathermap.org. Нужно зарегистрироваться и получить бесплатный ключ для доступа к API. Далее отправить HTTP-запрос с названием города и получить в ответ JSON с данными.

Function getWeather(city, tools) { city = city.replace(" ", "%20"); var apiKey = "43599b515694631087a103907284116d"; var url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric"; return JSON.parse(tools.httpGet(url)); }

Для выполнения HTTP-запроса используем метод tools.httpGet(url). Метод возвращает тело HTTP-ответа. Обратите внимание, что пробелы в названии города мы заменяем на специальный код.

Пробки

Получать данные о пробках будет с Яндекс.Карт также через выполнение HTTP-запроса.

Function getTraffic(city, file, log, tools) { log.info("Getting coordinates for city " + city); city = city.replace(" ", "%20"); var url = "https://geocode-maps.yandex.ru/1.x/?geocode=" + city + "&format=json"; var resp = JSON.parse(tools.httpGet(url)); var coord = resp["response"]["GeoObjectCollection"]["featureMember"]["GeoObject"]["Point"]["pos"].replace(" ", ","); log.info("Coordinates are: " + coord + ", getting traffic pic"); var url = "https://static-maps.yandex.ru/1.x/?ll=" + coord + "&spn=0.1,0.1&l=map,trf"; return tools.download(url, file); }

Сервис Яндекс.Карт возвращает данные о пробках по географической координате. У нас же есть только строковое название города. Поэтому сначала мы отправляем HTTP-запрос на получение данных о городе на другой сервис. Среди прочего в ответе есть данные о координате. Координату используем для другого HTTP-запроса. Обратите внимание, что для получения картинки с пробками мы используем метод tools.download(url, file). Этот метод также выполняет HTTP GET запрос, но сохраняет бинарный результат в файл. Метод получает URL и имя файла для сохранения ответа. Обратите внимание, что в имени файла должно быть только имя, без путей. Метод возвращает полный путь к этому файлу.

События

Для получения событий в конкретном городе воспользуемся API timepad.ru .

Function getEvents(city, tools) { city = city.replace(" ", "%20"); var url = "https://api.timepad.ru/v1/events.json?limit=10&skip=0&cities=" + city + "&fields=location&sort=+starts_at"; return JSON.parse(tools.httpGet(url)); }

Пришли на email

Воспользуемся методом tools.appendToFile(file, line). Метод добавляет строку line в файл file (только имя файла, без путей). Данный метод является безопасным для использования из нескольких анкет с одним и тем же именем файла. Таким образом удобно собирать какие-то сообщения или фрагменты сообщений от пользователей в одном файле. В данном скрипте мы будем собирать email адреса пользователей.

If (content.startsWith("пришли на email ")) { var email = content.substring(16); tools.appendToFile("emails", email); }

Весь скрипт

Приведем весь код скрипта.

Function getTemplates() { return ; } function getWeather(city, tools) { city = city.replace(" ", "%20"); var apiKey = "43599b515694631087a103907284116d"; var url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric"; return JSON.parse(tools.httpGet(url)); } function getTraffic(city, file, log, tools) { log.info("Getting coordinates for city " + city); city = city.replace(" ", "%20"); var url = "https://geocode-maps.yandex.ru/1.x/?geocode=" + city + "&format=json"; var resp = JSON.parse(tools.httpGet(url)); var coord = resp["response"]["GeoObjectCollection"]["featureMember"]["GeoObject"]["Point"]["pos"].replace(" ", ","); log.info("Coordinates are: " + coord + ", getting traffic pic"); var url = "https://static-maps.yandex.ru/1.x/?ll=" + coord + "&spn=0.1,0.1&l=map,trf"; return tools.download(url, file); } function getEvents(city, tools) { city = city.replace(" ", "%20"); var url = "https://api.timepad.ru/v1/events.json?limit=10&skip=0&cities=" + city + "&fields=location&sort=+starts_at"; return JSON.parse(tools.httpGet(url)); } function handle(content, profile, contact, log, tools) { log.info("Got message: " + content + " from " + contact + " to " + profile); var cityFile = profile + "__" + contact; if (content.startsWith("город ")) { var city = content.substring(6); log.info("Saving city for contact " + contact); tools.writeToFile(cityFile, city); return "Теперь я знаю твой город."; } else if (content.startsWith("погода")) { var city = tools.readFromFile(cityFile); if (city.isEmpty()) { return "Я не знаю твой город:("; } log.info("Getting weather for city " + city); var weather = getWeather(city, tools); return "Температура: " + weather["main"]["temp"]; } else if (content.startsWith("пробки")) { var city = tools.readFromFile(cityFile); if (city.isEmpty()) { return "Я не знаю твой город:("; } var trafficFile = profile + "__" + contact + ".png"; var fullFileName = getTraffic(city, trafficFile, log, tools); return "такие пробки "; } else if (content.startsWith("пришли на email ")) { var email = content.substring(16); tools.appendToFile("emails", email); return "Спасибо! Я напишу."; } else if (content.equals("события")) { var city = tools.readFromFile(cityFile); if (city.isEmpty()) { return "Я не знаю твой город:("; } log.info("Getting events for city " + city); var events = getEvents(city, tools)["values"]; log.info("Got " + events.length + " events"); var result = ""; for (var i = 0; i < events.length; ++i) { var dateTime = events[i]["starts_at"]; var dateTimeStr = dateTime.substring(0, 10) + " " + dateTime.substring(11, 17); var name = events[i]["name"]; result += (i + 1) + ". " + dateTimeStr + " " + name + "\n"; } return result; } return ""; } function getAnswer(hist, log, tools) { var profile = hist.localContact().getID().toString(); var contact = hist.externalContact().getID().toString(); var toReply = hist.unansweredMessages(); var result = ""; for(var i = 0; i < toReply.size() ; ++i) { var message = toReply.get(i); var content = message.content().toLowerCase(); var dup = false; for(var j = 0; j < i && !dup; ++j) { dup = content.equals(toReply.get(j).content().toLowerCase()); } if (!dup) { result += handle(content, profile, contact, log, tools) + " "; } } return result; }

Пример работы

Что еще можно получить из истории

Из истории переписки в скрипте можно получить некоторую дополнительную информацию об анкете и собеседнике. А именно.

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

Не является исключением и одна из популярнейших социальных сетей в России – «Вконтакте».

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

  • чаты-помощники. Данная разновидность программ часто находятся рядом, их всегда сложно распознать. Помогают в существенной мере упростить жизнь путем «отбора» на себя рутинных и периодических операций. Яркие примеры: нахождение необходимой информации, покупка или подбор туров, заказ еды с доставкой на дом, бронирование гостиничных номеров и т. п.;
  • бизнес-боты – специализированные программы, выполненные на разных языках программирования. Основная задача – автоматизация бизнес-процессов и оптимизация, как временная, так и функциональная. Примеры: рассылка оповещений и сообщений клиентам, сотрудникам, покупателям; автоответчик и т. д.;
  • искусственный интеллект или ИИ. В скором времени подобные боты станут единственными и поглотят общий рынок веб-разработок. Их реализация часто требует достаточно много сил, времени и денежных средств. Однако, эффект оптимизации и увеличения КПД просто потрясающий. Подобные роботы способны ответить практически на любой вопрос пользователя. На их основе часто делают «обучалки» в различных играх и приложениях (в том числе и мобильных);
  • игровые боты. Данная разработка является подвидом ИИ, также пользующаяся нарастающим спросом. Такие программы часто имитируют какого-либо игрока или персонажа, помогающего пройти этап. Распространены в приложениях в «Вконтакте».

Зная разновидности, приступим к различным способам их реализации.

Как сделать бота для группы в «Вконтакте». 2 основных метода.

Реализация путем непосредственного использования ресурсов самого «ВК».

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

Чтобы приступить к процессу, необходимо перейти во вкладку «Управление».


Скролим вниз и видим подраздел «Сообщества».

Так же можно сразу нажать одноименную вкладку в меню, находящемся слева.

Нажимаем «Чат-боты».

Оказываемся на веб-странице, на которой происходит описание чат-ботов, их преимуществ, цели создания.

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

Нет смысла описывать полностью разработку бота для «ВК», так как данный процесс займет много времени, часто сугубо индивидуален и зависит лт цели его изобретения. Но мы отметим те моменты, которые могут вам сильно помочь:

    примеры реализации чат-ботов (источники доступны на популярном веб-ресурсе «GitHub»):

    разработка чат-бота с применением «Node JS» с возможностью добавления новых команд.

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

Использование ботов-сервисов для создания

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

Рассмотрим несколько сервисов. Первый и очень популярный веб-ресурс – «Robochat».

Нажимаем «Создать бота» и переходим на форму регистрации/авторизации, выбираем наиболее удобный способ.


Следующий шаг – кликнуть мышкой по кнопке «Подключить бота» и выбрать интересующее нас сообщество.

Выбрав и разрешив боту необходимые доступы, попадаем в раздел «Настройки» и их производим. А именно:

  • тип сообщения: приветствие, действие после подписки/отписки, письмо на необработанное сообщение от интернет-пользователя;
  • ответы на загрузку какого-либо медиафайла: картинка, стикер, видео, товар, документ, аудиофайл;
  • и т. д.

Чтобы произвести редактирование, наводим на необходимый пункт и жмем на появившийся «карандашик».

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

Поняв принцип, рассмотрим основные возможности сервиса:

  • «Настройки» были описаны ранее;
  • «Сценарий» дает возможность создания имитации прямого диалога с пользователем путем прописывания тех или иных вопросов, разных ответов и связей между ними. Чем больше продумана данная структура, тем лучше.
  • «Рассылка» - отправка сообщений всем пользователям в «Вконтакте», которые когда-либо осуществляли обращение через бота в сообщество;
  • «Статистика». Название говорит само за себя. Основные данные для анализа: количество диалогов, сообщений, подписок/отписок, пол/возраст, город и статистика ответов на неизвестные команды. Последний пункт позволяет дорабатывать структуру и задавать более точные сценарии после непосредственного анализа.

    «Управление ботом» подразумевает следующие моменты, отображенные на скриншоте;

    «Написать боту» отдельно выделенная функция, дающая возможность произвести проверку и при необходимости отладку прописанного сценария.

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

Сервис «Робочат» является условно бесплатным. Тарифная сетка формируется на основе количества подписчиков и числа подключенных сообществ:

  • «Бесплатный» тариф относится к паблик-формированиям, в котором менее 50 000 участников;
  • «Начальный» - 1 сообщество, в котором до 100 000 людей. Плата в месяц – 399 рублей;
  • «Стандарт» подразумевает возможности подключения одного паблика, в котором до 500 000 подписчиков. Месячная стоимость – 599 руб.;
  • Премиум – 1 999 рублей за любое сообщество с неограниченным числом подписанных пользователей.

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

Рассмотрим еще один аналогичный сервис с оригинальным названием – «BotVK».

Нажав «Создать бота прямо сейчас», сразу попадаем на окно с запросами доступа. При этом желательно уже зайти в свою учетную запись в соцсети «Вконтакте».

Заходим в раздел «Боты», производим подключение необходимого паблика.

Основная разница в ценообразовании:

  • предусмотрен бесплатный тестовый период, составляющий 3 дня и позволяющий в полной мере ознакомиться со всем функционалом сервиса;
  • вне зависимости от количества подписчиков абонентская плата составляет 100 рублей в месяц за одно паблик-формирование.
  • за рассылку будет необходимо заплатить 500 рублей, но одноразово.

Малая стоимость платы за месяц, видимо, и является тем преимуществом, которое помогло «БотВК» стать конкурентоспособным и быть наравне с «Робочатом».

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

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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


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

  1. confirmationToken
  2. token
  3. secretKey

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

Как создать бота в ВК (кодинг на 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":

$userId = $data->object->user_id;



$user_name = $userInfo->response->first_name;

$request_params = array(
"message" => "{$user_name}, Ваше сообщение получено!
В ближайшее время админ группы на него ответит.",
"user_id" => $userId,
"access_token" => $token,
"v" => "5.0"
);



break;
}

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

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

{«type»: <тип события>, «object»: <объект, инициировавший событие>, «group_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->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->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 для вк-ботов. Если у вас остались вопросы - задавайте в комментах. И не забываем репостить и лайкать эту статью)



Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png