Удаление сообщений Telegram
Проблема
В Telegram-группах пользователи часто сталкиваются с ситуацией, когда они не могут массово удалить свои собственные сообщения. Telegram не предоставляет встроенного инструмента для этой задачи, и пользователям приходится удалять сообщения вручную. Это становится особенно болезненным в группах с высоким уровнем активности.
Решение на Rust
Для решения этой проблемы мы создали клиент на языке Rust, который позволяет пользователям автоматически находить и удалять свои сообщения в выбранной группе.
Почему Rust?
Rust был выбран по нескольким причинам:
- Высокая производительность.
- Безопасность памяти без использования сборщика мусора.
- Отличная поддержка асинхронного программирования через библиотеку
tokio
.
Архитектура проекта
Проект состоит из следующих ключевых компонентов:
Конфигурация Telegram
Для работы клиенту необходимы api_id
и api_hash
. Эти данные можно получить следующим образом:
- Перейдите на сайт Telegram API Development Tools.
- Войдите в свой аккаунт Telegram, используя номер телефона и подтверждающий код.
- Перейдите в раздел "API Development Tools".
- Нажмите на кнопку "Create Application" (Создать приложение).
- Заполните форму.
- Получите ваш
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
, которая сохраняет информацию о ходе выполнения приложения.
Как использовать
cargo run
Заключение
Этот проект демонстрирует, как с помощью Rust и Telegram API можно создавать мощные и производительные инструменты для работы с Telegram. Хотите добавить новые функции? Проект легко расширяем.
Ссылка на проект: https://github.com/stas-dubich/deleting-telegram-messages