Удаление сообщений 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