Студия разработки сайтов и приложений

Netspark.ru

Платформа для ботов в Telegram

Ботопотамы

Сериальный телеграм-бот TV Botopotamus

Разнообразные сериалы я смотрю очень давно, когда-то писал, как так вышло. Ещё так вышло, что смотрю я обычно на английском. Что, кстати, за годы просмотра очень неплохо его прокачало — но об этом в другой раз.

Со временем всё самое хорошее, что уже было снято, посмотрел и стал смотреть новое. В связи с чем встал вопрос отслеживания выхода новинок. Долгое время отслеживал с сайта addic7ed.com, где добрые люди неустанно изготавливают для сериалов субтитры. Причём, делают это крайне быстро, так что в списке последних добавленных сабов обычно и видны все новинки.

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

Тем не менее, со временем сериалы стали выходить уже с сабами внутри, поэтому нет-нет и на сайте новинки стали пропускать. Решил наконец сменить способ отслеживания на более технологичный. И написал под свою маленькую платформу Botopotamus.Ru свирепого сериального ботопотама — @tv_botopotamus_bot в Телеграме.

Пока бот умеет две основные вещи:

— показывает, какие телешоу выходят сегодня (с учётом часовых поясов для нас это завтра)
— и какие премьеры и возвраты (новые сезоны) телешоу выходят в этом месяце.

Для каждого шоу бот показывает краткий сюжет, жанры, номера серий и ссылку на источник, где можно посмотреть картинку и каст подробнее. Это для всех британских и американских телеканалов, а также стримингов типа Netflix и Apple TV+, на английском языке. То есть то, что я обычно смотрю.

На список принудительно наложены фильтры: только художественные (scripted) шоу и мультики (animation). Иначе, если не убирать документальные передачи, риалити-шоу, спорт и новости, список получается под 200 позиций в день — неудобно читать.

В дальнейших планах добавить в бота:

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

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

Далее технические подробности про бота, для тех, кому интересно.

Бот сделан под мою платформу — она написана Laravel (PHP) и все боты на ней работают в режиме вебхуков.

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

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

Поэтому вот для примера трейт, который объединяет массив текстовых сообщений (с поддержкой HTML) в одно или несколько сообщений ТГ с учетом лимита в 4096 символов и отправляет их. У меня в $messages передается массив анонсов, каждая запись — один сериал со всей выводимой информацией, уже отрендеренный через blade-шаблон.

<?php

namespace App\Traits;

use Telegram\Bot\Api;

trait LongMessages
{

    /**
     * Sends an array of messages to the chat. Messages are concatenated
     * with each other until the length limit is reached (4096 characters).
     * At that point a new message is sent and the process is repeated.
     *
     * @param array $messages
     * @param Api $bot
     */
    protected function send(array $messages, Api $bot): void
    {
        $text = '';

        $allowed_tags = '<b><strong><i><em><u><ins><s><strike><del><a><code><pre><span><blockquote><ul><ol><li>';
        foreach ($messages as $message) {
            $message = strip_tags($message, $allowed_tags);
            if (mb_strlen($text) + mb_strlen($message) > 4096) {
                $bot->sendMessage([
                    'chat_id' => $this->chat_id,
                    'text' => $text,
                    'parse_mode' => 'HTML',
                    'disable_web_page_preview' => true,
                ]);
                $text = '';
            }
            $text .= $message;
        }

        if ($text) {
            $bot->sendMessage([
                'chat_id' => $this->chat_id,
                'text' => $text,
                'parse_mode' => 'HTML',
                'disable_web_page_preview' => true,
            ]);
        }
    }

}

Ограничивать употребление тегов приходится, потому что в аннотациях к сериалам TvMaze себя в плане тегов не очень сдерживают. Приходится оставлять только то, с чем дружит Телеграм.

Для получения телепрограммы бот работает с API сайта TvMaze.com. Пример их JSON-ответа можно посмотреть тут: https://api.tvmaze.com/schedule/web Программа собирается из нескольких источников (UK, US, стриминги), фильтруется, объединяется, после чего убираются возможные дубли.

Поскольку телепрограмма для всех одна, а меняется редко, парсить её на каждый запрос пользователя смысла нет. Поэтому бот тихонечко (4 раза в сутки) ставит в очередь задачу спарсить данные за текущий месяц. Забирает расписания по дням, сразу отфильтровывает ненужное, строит анонсы по датам и список премьер/возвратов на месяц. И кладёт в кэш.

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

Для мониторинга очередей к платформе прикручен Horizon. Конечно, для отслеживания 4 задач в сутки мониторинг не особенно нужен. Но на этой же платформе крутится другой мой ботопотам — Botopotamus Monitor Bot. А в нём весь мониторинг и сервисные задачки — строго на очередях. Так что есть за чем следить.

Кстати, вот такую примерно схемку Дипсик для бота нарисовал. Он прикольные схемы рисует, если с ним архитектурные вопросы обсуждать.

deepseek_scheme.png

Почти так всё в результате и работает. Пишите, если интересно, или если есть вопросы — постараюсь ответить. И заходите к TV Botopotamus вместе смотреть сериалы.

Обсуждение

Чтобы обсудить заметку, написать комментарий, или просто связаться, заходите в Телеграм-канал. У нас весело и всем рады!

Также меня можно найти в Хвиттере, VC.ru, Дзене, или Тенчате.