Вы наверняка сталкивались с тем, что когда включаешь автоудаление переписки с помощью стандартного функционала Телеги, то эта самая Телега предательски трезвонит об этом в каждом новом чате. Да и сами чаты также отмечаются специальным значком с часами. Смысл этого не совсем понятен — ведь оно никак не защищает собеседника от ручного удаления, зато часто становится причиной глупых вопросов. Чтобы этих самых глупых вопросов избежать и не прослыть параноиком, можно автоматизировать удаление переписок с помощью бота.
О том, как такой бот сделать, мы и рассказываем сегодня.
Какие задачи решает бот для автоудаления переписок
В целом основная задача этого бота — автоматизация удаления переписок без сопутствующего палева, уже была описана во вступлении, однако давайте разложим ее на составляющие.
Автоматизация — здесь все и так ясно.
Сохранение имиджа — то самое «чтобы не прослыть параноиком».
Безопасность — когда собеседник видит, что у вас включено автоудаление, он может заранее сохранять переписки, тем самым лишая ваше общение всякой конфиденциальности. Когда инфы об этом нет, риск подобного снижается.
Экономия времени — в случае со встроенным функционалом Телеги, если вы вдруг захотите сохранить переписку, вам придется сделать это вручную. Потом, в случае ее удаления (в том числе вашим собеседником) — делать это еще раз. И еще. И еще. И так каждый раз. Бот же позволит единожды добавить визави в белый список и больше не тратить на это время.
Ну и традиционно добавим, что любые непредусмотренные изначально функции также являются функциями. Так что никто не запрещает вам креативить.
Принцип работы бота для автоудаления переписок
С точки зрения алгоритма он работает следующим образом:
Обновляет через указанные промежутки времени список диалогов — и далее принимает решение, что делать с каждым конкретным диалогом, исходя из заданных параметров.
Проверяет наличие собеседника в белом списке — игнорирует диалог в случае нахождения визави в БС.
Удаляет переписку — если в диалоге не было активности указанное количество времени.
Игнорирует переписку — если в диалоге была активность либо если собеседник в БС.
Слушает эфир — реагирует на команды в избранном.
Реагирует на /add ID — добавляя ID в белый список.
Реагирует на /del ID — удаляя ID из белого списка.
Реагирует на /list — выводя белый список.
Выводит оповещения — сервисные уведы бота приходят в избранное и в консоль.
Как видите, ничего сложного.
Пошаговая инструкция, как сделать бот для автоудаления переписок
Для начала нужно развернуть Python-сервер. Если не понимаете, о чем речь, — вам сюда.
Там рассказано, как сделать это бесплатно на домашнем ПК. Однако после тестов советуем переехать на нормальный хостинг. Затем настраиваем сервер, для этого в его консоли пишем следующее:
pip install telethon
pip install asyncio
После этого:
- Открываем веб-версию Telegram.
- Жмем «API development tools».
- Заполняем форму.
- Сохраняем значения для 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-каналом, чтобы первыми получать код полезных ботов для арбитража трафика.