TL;DR: Если у вас есть Telegram-канал и вы устали руками заполнять отложку, то такой бот здорово облегчит вам жизнь.
Стандартный алгоритм создания отложенного поста выглядит так:
- Открыть канал
- Создать пост
- Выбрать тип публикации «Отложенная»
- Указать время поста
- Отправить публикацию
При фиксированном интервале между постами алгоритм напрашивается на оптимизацию, в идеале хотелось бы оставить только пункты 1, 2, 5. Причем пункт 2 прокачать до «Создать посты».
Несмотря на обилие готовых решений, большинство их них перегружено функциями (зачастую платными) и работа с ними может, наоборот, увеличить время создания поста. Поэтому было решено реализовать собственного бота, которому можно просто отсылать фотографии (видео, документы, что угодно), а он бы сам уже добавлял их в отложенные публикации, основываясь на времени последнего поста.
Как в телеграмме сделать отложенную отправку (автопрстинг)
Звучит здорово, но этот подход не сработал из-за того, что боту недоступно это самое время последнего поста в канале, а также из-за этого:
Получается без собственной реализации отложки не обойтись.
Идея
У любого файла, загруженного на сервера Telegram, есть уникальный fileId. Если мы отправим боту фотографию, то он сможет достать этот id из входящего сообщения и сохранить в базу:
Далее, когда настанет время, мы сможем использовать сохраненный fileId, чтобы отправить пост в канал.
Создаем проект
Бота будем писать на Java с использованием Spring Boot и библиотеки TelegramBots,. В качестве БД используем PostgreSQL. На Spring Initializr сгенерируем наш проект с необходимыми зависимостями:
Откроем сгенерированный проект в IDE. В build.gradle в тег dependencies добавим библиотеку для работы с ботами:
implementation ‘org.telegram:telegrambots-spring-boot-starter:5.5.0’
Далее настроим подключение к нашей локальной БД. Для этого в application.yaml пропишем:
spring: datasource: url: $
И создадим класс конфигурации БД:
databaseChangeLog: — changeSet: id: 1-add-record author: ananac changes: — createTable: tableName: record columns: — column: name: id type: bigint constraints: primaryKey: true nullable: false — column: name: file_id type: varchar(255) constraints: nullable: true — column: name: comment type: text constraints: nullable: true — column: name: data_type type: varchar(15) constraints: nullable: false — column: name: create_date_time type: timestamp constraints: nullable: false — column: name: post_date_time type: timestamp constraints: nullable: true — column: name: author type: varchar(255) constraints: nullable: false
databaseChangeLog: — include: file: db/changelog/1-add-record.yaml
После этого можно запускать приложение, чтобы миграции накатились и в БД появилась наша таблица для хранения постов.
Как сделать отложенную публикацию в телеграм. Отложенный пост telegram.
Создаем бота
telegram: name: botname token: 1793090787:AaaaAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaa chatId: -1948372984327 adminId: 265765765
Пишем логику
Реализуем сущность для созданной нами таблицы:
И JPA-репозиторий с необходимыми нам запросами:
Займемся непосредственно обработчиком входящих сообщений. Создаем новый класс, отнаследованный от TelegramLongPollingBot . В нем определяем метод, который будет обрабатывать входящие события. Мы хотим, чтобы с ботом мог работать только пользователь указанный в конфиге, поэтому добавим проверку по userId:
Далее реализуем метод сохранения поста в БД. Пока делаем поддержку только для фото, но в будущем ничего не мешает расшириться на все типы вложений. Помним, что во входящем сообщении лежит несколько файлов в разном разрешении, нас интересует только самый большой:
private void processMessage(Message message) < Long chatId = message.getChatId(); if (message.getPhoto() != null !message.getPhoto().isEmpty()) < Record record = buildRecord(message); recordRepository.save(record); reply(chatId, «Добавлено. Количество постов в отложке: » + recordRepository.getNumberOfScheduledPosts()); >else < reply(chatId, «Принимаются только фото»); >> private Record buildRecord(Message message) < Record record = new Record(); String fileId = getLargestFileId(message); record.setFileId(fileId); record.setComment(message.getCaption()); record.setDataType(«PHOTO»); record.setId(message.getMessageId()); record.setCreateDateTime(LocalDateTime.now()); record.setAuthor(message.getFrom().getUserName()); return record; >private String getLargestFileId(Message message)
Метод запускается раз в минуту и первым делаем проверяет есть ли в БД неопубликованные посты. Если посты есть, то проверяется не прошло ли 120 минут с момента публикации последнего поста и на основании этого принимается решении о постинге. Также учитываем, что при первом запуске у нас не будет опубликованных постов в БД.
Далее добавим пару команд, чтобы с ботом было удобнее работать:
И реализуем их в коде. Команду для очистки сделаем с подтверждением, чтобы избежать мискликов:
private void processMessage(Message message) < Long chatId = message.getChatId(); if (message.getPhoto() != null !message.getPhoto().isEmpty()) < Record record = buildRecord(message); recordRepository.save(record); reply(chatId, «Добавлено. Количество постов в отложке: » + recordRepository.getNumberOfScheduledPosts()); >else if (message.getText() != null) < switch (message.getText()) < case «/info»: < reply(chatId, «Количество постов в отложке: » + recordRepository.getNumberOfScheduledPosts()); break; >case «/clear»: < reply(chatId, «Чтобы очистить напиши /delete»); break; >case «/delete»: < recordRepository.clear(); reply(chatId, «Очищено. Количество постов в отложке: » + recordRepository.getNumberOfScheduledPosts()); break; >default: < break; >> > else < reply(chatId, «Принимаются только фото»); >> public void sendPhoto(Record record) < try < SendPhoto sendPhoto = new SendPhoto(); sendPhoto.setChatId(chatId); sendPhoto.setPhoto(new InputFile(record.getFileId())); execute(sendPhoto); afterPost(record); >catch (TelegramApiException e) < e.printStackTrace(); >> private void afterPost(Record record)
Запуск и проверка
Поднимаем приложение и проверяем:
В дальнейшем приложение можно задеплоить в облако, например, на Heroku (что и было сделано с этим ботом) по этому гайду. С кодом можно ознакомиться здесь.
Источник: habr.com
В Telegram появилась отложенная отправка сообщений и возможность полностью скрывать номер
В мессенджере Telegram появились функция отложенной отправки сообщений и возможность полностью скрывать свой телефонный номер от других пользователей. Нововведения стали доступны после очередного обновления сервиса.
Для того чтобы установить таймер отправки сообщений в десктопной версии, вам необходимо кликнуть правой кнопкой мыши на кнопку отправки и выбрать соответствующую функцию в появившемся меню. В мобильном приложении для этого тоже нужно удерживать кнопку отправки. Кстати, функцию можно использовать и для сохраненных сообщений — тогда они получат значок календаря и станут напоминаниями.
Возможность польностью скрыть свой номер появилась после изменений настроек приватности Telegram. Ранее на наличие уязвимостей в настройках конфиденциальности жаловались участники протестов в Гонконге.
Ранее Telegram представил функцию беззвучной отправки сообщений и «медленный режим» для чатов.
Источник: www.buro247.ru