Разработка
May 13

Удаление сообщений Telegram

Проблема

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

Решение на Rust

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

Почему Rust?

Rust был выбран по нескольким причинам:

  • Высокая производительность.
  • Безопасность памяти без использования сборщика мусора.
  • Отличная поддержка асинхронного программирования через библиотеку tokio.

Архитектура проекта

Проект состоит из следующих ключевых компонентов:

Конфигурация Telegram

Для работы клиенту необходимы api_id и api_hash. Эти данные можно получить следующим образом:

  1. Перейдите на сайт Telegram API Development Tools.
  2. Войдите в свой аккаунт Telegram, используя номер телефона и подтверждающий код.
  3. Перейдите в раздел "API Development Tools".
  4. Нажмите на кнопку "Create Application" (Создать приложение).
  5. Заполните форму.
  6. Получите ваш api_id и api_hash и сохраните их.

Техническое решение

1. Инициализация клиента

Приложение загружает конфигурацию из файла telegram-config.json, который содержит api_id и api_hash. Эти данные используются для создания клиента Telegram через библиотеку grammers-client:

async fn create_client() -> Result<Client, Box<dyn Error>> {
    let config = load_or_create_config()?;
    let client = Client::connect(Config {
        api_id: config.api_id,
        api_hash: config.api_hash,
        session: Session::load_or_create(SESSION_FILE)?,
    }).await?;

    Ok(client)
}

2. Управление сессией

Сессия сохраняется в файл telegram-session.session. Это позволяет сохранять состояние подключения и избегать повторной авторизации:

  • При первом запуске создается новая сессия.
  • При повторном запуске загружается существующая сессия.

3. Получение списка чатов

Клиент использует асинхронные запросы к серверу Telegram для получения списка всех чатов пользователя:

async fn list_chats(client: &Client) -> Result<Vec<Dialog>, Box<dyn Error>> {
    let chats = client.iter_dialogs().await?.collect::<Vec<_>>();
    Ok(chats)
}

4. Выбор чата

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

5. Удаление сообщений пользователя

Для удаления сообщений мы используем асинхронный обход всех сообщений в чате:

  • Приложение проверяет каждое сообщение.
  • Если сообщение отправлено текущим пользователем (is_outgoing()), оно удаляется:
async fn delete_all_user_messages(client: &Client, dialog: &Dialog) -> Result<(), Box<dyn Error>> {
    let messages = client.iter_messages(dialog).await?;
    for msg in messages {
        if msg.is_outgoing() {
            client.delete_messages(dialog, vec![msg.id()]).await?;
        }
    }
    Ok(())
}

6. Логгирование

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

Как использовать

  1. Настройте конфигурацию в telegram-config.json.
  2. Запустите проект командой:
cargo run
  1. Выберите чат и выполните удаление своих сообщений.

Заключение

Этот проект демонстрирует, как с помощью Rust и Telegram API можно создавать мощные и производительные инструменты для работы с Telegram. Хотите добавить новые функции? Проект легко расширяем.

Ссылка на проект: https://github.com/stas-dubich/deleting-telegram-messages