Бот для автоудаления переписок
Traffic Cardinal Traffic Cardinal  написал 10.11.2026

Бот для автоудаления переписок

Traffic Cardinal Traffic Cardinal  написал 10.11.2026
8 мин
0
21
Содержание

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

О том, как такой бот сделать, мы и рассказываем сегодня.

Какие задачи решает бот для автоудаления переписок

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

  • Автоматизация — здесь все и так ясно.

  • Сохранение имиджа — то самое «чтобы не прослыть параноиком».

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

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

Ну и традиционно добавим, что любые непредусмотренные изначально функции также являются функциями. Так что никто не запрещает вам креативить.

Принцип работы бота для автоудаления переписок

С точки зрения алгоритма он работает следующим образом:

  • Обновляет через указанные промежутки времени список диалогов — и далее принимает решение, что делать с каждым конкретным диалогом, исходя из заданных параметров.

  • Проверяет наличие собеседника в белом списке — игнорирует диалог в случае нахождения визави в БС.

  • Удаляет переписку — если в диалоге не было активности указанное количество времени.

  • Игнорирует переписку — если в диалоге была активность либо если собеседник в БС.

  • Слушает эфир — реагирует на команды в избранном.

  • Реагирует на /add ID — добавляя ID в белый список.

  • Реагирует на /del ID — удаляя ID из белого списка.

  • Реагирует на /list — выводя белый список.

  • Выводит оповещения — сервисные уведы бота приходят в избранное и в консоль.

Как видите, ничего сложного.

Пошаговая инструкция, как сделать бот для автоудаления переписок

Для начала нужно развернуть Python-сервер. Если не понимаете, о чем речь, — вам сюда.

Там рассказано, как сделать это бесплатно на домашнем ПК. Однако после тестов советуем переехать на нормальный хостинг. Затем настраиваем сервер, для этого в его консоли пишем следующее:

pip install telethon
pip install asyncio

После этого:

  1. Открываем веб-версию Telegram.
  2. Жмем «API development tools».
  3. Заполняем форму.
  4. Сохраняем значения для api_id и api_hash.

Далее:

  • Создаем текстовый файл
  • Называем его bot.py.
  • Вставляем в этот файл код:

import asyncio

import json

from datetime import datetime, timedelta, timezone

from pathlib import Path

from telethon import TelegramClient, events

from telethon.errors import FloodWaitError

from telethon.tl.types import User

API_ID = ваш API_ID

API_HASH = "ваш API_HASH"

CHECK_INTERVAL = 60

MESSAGE_AGE = 24 * 60 * 60 # 24 часа

SESSION_FILE = "userbot"

WHITELIST_FILE = "whitelist.json"

def ensure_whitelist():

path = Path(WHITELIST_FILE)

if not path.exists():

path.write_text(

json.dumps({"chats": []}, indent=4, ensure_ascii=False),

encoding="utf-8"

)

def load_whitelist():

ensure_whitelist()

try:

data = json.loads(

Path(WHITELIST_FILE).read_text(encoding="utf-8")

)

chats = data.get("chats", [])

return {int(chat_id) for chat_id in chats}

except (json.JSONDecodeError, ValueError, TypeError):

print("Ошибка в whitelist.json. Используется пустой whitelist.")

return set()

def save_whitelist(chats):

Path(WHITELIST_FILE).write_text(

json.dumps(

{"chats": sorted(chats)},

indent=4,

ensure_ascii=False

),

encoding="utf-8"

)

client = TelegramClient(

SESSION_FILE,

API_ID,

API_HASH

)

@client.on(events.NewMessage(outgoing=True))

async def command_handler(event):

me = await client.get_me()

if event.chat_id != me.id:

return

text = event.raw_text.strip()

if text.startswith("/add"):

parts = text.split(maxsplit=1)

if len(parts) != 2:

await event.respond(

"Использование:\n/add ID"

)

return

try:

chat_id = int(parts[1])

except ValueError:

await event.respond(

"ID должен быть числом."

)

return

whitelist = load_whitelist()

if chat_id in whitelist:

await event.respond(

f"{chat_id} уже есть в белом списке."

)

return

whitelist.add(chat_id)

save_whitelist(whitelist)

await event.respond(

f"Добавил {chat_id} в белый список."

)

elif text.startswith("/del"):

parts = text.split(maxsplit=1)

if len(parts) != 2:

await event.respond(

"Использование:\n/del ID"

)

return

try:

chat_id = int(parts[1])

except ValueError:

await event.respond(

"ID должен быть числом."

)

return

whitelist = load_whitelist()

if chat_id not in whitelist:

await event.respond(

f"{chat_id} отсутствует в белом списке."

)

return

whitelist.remove(chat_id)

save_whitelist(whitelist)

await event.respond(

f"Удалил {chat_id} из белого списка."

)

elif text == "/list":

whitelist = load_whitelist()

if not whitelist:

await event.respond(

"Белый список пуст."

)

return

lines = ["Белый список:"]

for chat_id in sorted(whitelist):

lines.append(str(chat_id))

await event.respond("\n".join(lines))

async def delete_old_messages():

me = await client.get_me()

my_id = me.id

cutoff = datetime.now(timezone.utc) - timedelta(

seconds=MESSAGE_AGE

)

whitelist = load_whitelist()

whitelist.add(my_id)

dialogs = client.iter_dialogs()

async for dialog in dialogs:

entity = dialog.entity

if not isinstance(entity, User):

continue

chat_id = entity.id

if chat_id in whitelist:

continue

try:

messages_to_delete = []

async for message in client.iter_messages(

entity,

limit=None

):

if message.date >= cutoff:

continue

messages_to_delete.append(message.id)

if len(messages_to_delete) >= 100:

await delete_batch(

entity,

messages_to_delete

)

messages_to_delete.clear()

if messages_to_delete:

await delete_batch(

entity,

messages_to_delete

)

except FloodWaitError as e:

print(

f"FloodWait для {chat_id}: "

f"ждём {e.seconds} сек."

)

await asyncio.sleep(e.seconds)

except Exception as e:

print(

f"Ошибка при обработке {chat_id}: {e}"

)

async def delete_batch(entity, message_ids):

if not message_ids:

return

try:

await client.delete_messages(

entity,

message_ids,

revoke=True

)

except FloodWaitError as e:

print(

f"FloodWait при удалении: "

f"ждём {e.seconds} сек."

)

await asyncio.sleep(e.seconds)

await client.delete_messages(

entity,

message_ids,

revoke=True

)

async def cleanup_loop():

while True:

try:

await delete_old_messages()

except Exception as e:

print(f"Ошибка цикла очистки: {e}")

await asyncio.sleep(CHECK_INTERVAL)

async def main():

ensure_whitelist()

await client.start()

me = await client.get_me()

print(f"Авторизован как: {me.first_name} (@{me.username})")

print(f"Проверка каждые: {CHECK_INTERVAL} сек.")

print(f"Удаление сообщений старше: {MESSAGE_AGE} сек.")

print("Userbot запущен.")

await asyncio.gather(

client.run_until_disconnected(),

cleanup_loop()

)

if __name__ == "__main__":

asyncio.run(main())

  • Подставляем в поля API_ID = ваш API_ID, API_HASH = "ваш API_HASH" и CONTROL_CHAT_ID = ID чата для управления свои значения.
  • Сохраняем.
  • Проверяем, все ли работает как задумано.

Демонстрация работы

Сразу уточним, что для тестов значения переменных CHECK-INTERVAL и MESSAGE-AGE были изменены. Вы также можете это сделать, чтобы проверить работоспособность бота, однако после тестов советуем вернуть исходные значения.

Функция изменения этих значений вручную была намеренно не добавлена в интерфейс — чтобы акк не отлетел из-за подозрительно частых удалений. Раз в сутки — это оптимальное значение. Но вернемся к проверке работоспособности.

Проверяем БС — он пуст. Далее пишем себе с другого профиля и ждем. Видим, что сообщение автоматически удалилось.
Проверяем БС — он пуст. Далее пишем себе с другого профиля и ждем. Видим, что сообщение автоматически удалилось.

Пишем с двух профилей. С одного — пишем и ждем, а с другого продолжаем писать. Видим, что активная переписка не удаляется, а там, где активности нет, снова удалена.
Пишем с двух профилей. С одного — пишем и ждем, а с другого продолжаем писать. Видим, что активная переписка не удаляется, а там, где активности нет, снова удалена.

Прекращаем написывать со второго профиля и видим, что переписка с ним также удаляется спустя время. Теперь добавляем второй акк в БС.
Прекращаем написывать со второго профиля и видим, что переписка с ним также удаляется спустя время. Теперь добавляем второй акк в БС.

Снова пишем с двух акков, но на этот раз по одному сообщению. Видим, что удалена переписка лишь с тем акком, которого нет в БС.
Снова пишем с двух акков, но на этот раз по одному сообщению. Видим, что удалена переписка лишь с тем акком, которого нет в БС.

Убираем его из БС, ждем и видим, что переписка с ним также удалена. Все работает в соответствии с нашим замыслом.
Убираем его из БС, ждем и видим, что переписка с ним также удалена. Все работает в соответствии с нашим замыслом.

Подводя итоги

Как видите, удалять переписки в автоматическом режиме можно и без злополучного уведа о том, что включено автоудаление — достаточно просто использовать наш бот.

Следите за нашим Telegram-каналом, чтобы первыми получать код полезных ботов для арбитража трафика.

Здравствуйте! У вас включен блокировщик рекламы, часть сайта не будет работать!