Как поставить отложенную отправку в Телеграмме

TL;DR: Если у вас есть Telegram-канал и вы устали руками заполнять отложку, то такой бот здорово облегчит вам жизнь.

Видеть это окно каждый раз при создании отложенного поста очень утомляет

Стандартный алгоритм создания отложенного поста выглядит так:

  1. Открыть канал
  2. Создать пост
  3. Выбрать тип публикации «Отложенная»
  4. Указать время поста
  5. Отправить публикацию

При фиксированном интервале между постами алгоритм напрашивается на оптимизацию, в идеале хотелось бы оставить только пункты 1, 2, 5. Причем пункт 2 прокачать до «Создать посты».

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

Как в телеграмме сделать отложенную отправку (автопрстинг)

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

Дуров, почему?

Получается без собственной реализации отложки не обойтись.

Идея

У любого файла, загруженного на сервера Telegram, есть уникальный fileId. Если мы отправим боту фотографию, то он сможет достать этот id из входящего сообщения и сохранить в базу:

В случае картинки на серверах создается несколько файлов в разном разрешении

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

Создаем проект

Бота будем писать на Java с использованием Spring Boot и библиотеки TelegramBots,. В качестве БД используем PostgreSQL. На Spring Initializr сгенерируем наш проект с необходимыми зависимостями:

Откроем сгенерированный проект в IDE. В build.gradle в тег dependencies добавим библиотеку для работы с ботами:

Еще по теме:  Madu telegramm поиск людей

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 next не нажимается

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

Возможность польностью скрыть свой номер появилась после изменений настроек приватности Telegram. Ранее на наличие уязвимостей в настройках конфиденциальности жаловались участники протестов в Гонконге.

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

Источник: www.buro247.ru

Рейтинг
( Пока оценок нет )
Загрузка ...