В преддверии Дня Победы ежегодно и повсеместно проходят акции в формате «Бессмертного полка».
В этом году, в связи с известными коронавирусными обстоятельствами, бо́льшая часть акций перешла в онлайн-формат. В частности «Российское движение школьников» запустило акцию «Помним».
Участникам акции предлагается:
- Скачать файл с рамкой;
- Наложить слой с рамкой на слой с фото в нужном порядке (да, рамка должна быть на переднем слое, т. к. у неё есть «уголочки», которые должны быть на фотографии, а не под);
- Добавить подписи (желательно — уместным шрифтом);
- Сохранить фото.
Очевидно, что для многих потенциальных участников акции выполнение алгоритма станет не такой уж тривиальной задачей: требуются навыки работы с графическими редакторами или хотя бы онлайн-сервисами аналогичного назначения. Либо использования «костылей» вроде PowerPoint’а.
Для того, чтобы повысить потенциальную вовлечённость наших обучающихся и их родителей в акцию, мы решили поэкспериментировать и максимально оптимизировать процесс подготовки фото в рамке для публикации в школьной онлайн-колонне «Бессмертного полка».
Был реализован следующий пользовательский сценарий:
- Бот в сети ВКонтакте принимает в качестве входных данных фотографию, ФИО и (опционально) звание героя.
- Подготавливает изображение, присылает его пользователю.
- Предлагает пользователю выполнить публикацию в сообществе.
- Если пользователь соглашается, фото загружается в альбом сообщества и публикуется на стене с заранее заготовленным набором соответствующих хэштегов. Получившийся пост отправляется пользователю, который может принять решение о лайке, репосте (или каком-либо другом действии в рамках стандартного взаимодействия с соцсетью).
Важно, что без прямого на то намерения пользователя ничего никуда не публикуется и, пока пользователь не примет такого решения, никакие данные не выходят за пределы диалога «пользователь — бот».
По сути сейчас нет никакой технической фильтрации ни текстового, ни графического контента, которые подаются на вход боту (кроме, разве что, «загрузите, пожалуйста, вертикальное фото»). Поэтому в целях предупреждения потенциального вандализма была организована команда модераторов, состоящая из педагогов и ребят-активистов, готовых оперативно устранять последствия актов вандализма, если таковые будут иметь место.
Вот что получилось:
Дальше — чуть-чуть технических подробностей разработки. Можете смело пропустить два следующих абзаца, если вас пугают слова и аббревиатуры PHP, API, SDK, NoSQL, «токен» или «standalone» :)
Технически взаимодействие с пользователем осуществляется через чат-бота VK, серверной частью которого является PHP-приложение, написанное с использованием официального SDK VK:
- Для генерации изображений используются библиотеки-обёртки над GD: ImageArtist и gd-text.
- Для хранения состояния сессии взаимодействия с пользователем используется NoSQL-хранилище Redis и его PHP-клиент Predis.
- В целом архитектура проекта такова, что при желании можно изменить (или расширить) платформы взаимодействия с ботом на другие соцсети и/или мессенджеры, используя их API.
Взаимодействие с пользователем осуществляется от имени специально созданного сообщества, однако в процессе разработки я столкнулся с одним логически неочевидным ограничением (однако прямо оговорённым в документации): токен доступа сообщества не позволяет загружать фотографии в альбомы сообщества и создавать записи на его стене. Это возможно только с ключом доступа пользователя, обладающего правами на такие действия в конкретном сообществе. Из этой ситуации был найден следующий выход: создано техническое standalone-приложение, для которого был получен токен пользователя-администратора сообщества с неограниченным сроком действия.