Бойтесь юзеров с Telegram Premium
«Бойтесь юзеров с Telegram Premium»: как (не) спрятать ваше удалённое сообщение и зачем бизнесу ИИ-бот
Спойлер, если ваш собеседник владеет Telegram Premium и включил Telegram Business, то любой ваш «быстро удалённый» текст может навсегда сохраниться в его переписке с ботом. Более того, у него может быть прикручен ИИ-бот, который продолжит с вами беседу, пока вы судорожно думаете: «А я вообще это писал…?».
Пролог
Представьте, что вы отправили коллеге или другу длинное сообщение (которое потом сами бы стёрли из памяти), а затем резко удалили. В обычном мире оно исчезает без следа, и можно сделать вид, что ничего не было. Но! Если у собеседника есть Telegram Premium с активным «Business Mode», то за кулисами может стоять хитрый бот, который:
Логирует вообще всё (включая удалённые сообщения).
Автоматически отвечает от имени собеседника через ИИ.
Отсюда и ироничная фраза: «Бойтесь юзеров, имеющих Telegram Premium». Да-да, теперь удалённое сообщение может не только успеть сохраниться у владельца, но ещё и продолжить «жить» в чатах, благодаря автогенерации ответов.
Как вообще так случилось?
Telegram Business: краткий ликбез
Telegram давно планировал расширить свои функции для бизнеса. В итоге появилась возможность, что Premium-пользователи могут включить «Business Mode» и получить доступ к:
Привязке ботов к личным чатам (даже там, где вы переписываетесь с друзьями).
Бизнес-событиям
business_message
,edited_business_message
,deleted_business_messages
— позволяющим боту видеть переписку на более глубоком уровне.Автоматическим ответам от вашего лица, если бот на это настроен.
Жутковато? Для параноиков — да. Но с точки зрения бизнеса это круто, бот может фиксировать, анализировать сообщения (даже удалённые) и оперативно отвечать клиентам.
Зачем бизнесу такие штуки?
Экономия времени: бот закрывает рутинные задачи, автодобавляет вежливые приветствия или уточнения, пока менеджеры спят.
Контроль и аналитика: всё логируется, можно изучать часто задаваемые вопросы, корректировать маркетинг-стратегии и общение.
Надёжное сохранение: если клиент удалил сообщение с контактами или важными деталями, а потом говорит: «Я ничего не писал», — бот уже успел зафиксировать это в базе.
Да, нужно учитывать юридические и моральные аспекты —, но технически это работает именно так.
Наш весёлый бот функции и приколы
Чтобы показать, что это не просто слухи, рассмотрим пример бота. Он умеет два главных трюка:
Логировать изменения в переписках (включая удалённые). Если пользователь написал «Я завтра оплачу счёт», а потом стёр — бот отправит владельцу уведомление: «Сообщение удалено. Текст: «Я завтра оплачу счёт».
Автоответ через OpenAI. Если за определённое время (допустим, 15 секунд) хозяин не ответил, бот генерирует ответ сам. В итоге можно увидеть курьёзные диалоги, когда ИИ подшучивает над собеседником.
Почему это «страшно»?
Приватность «под вопросом». Мы привыкли, что если удалили — значит, всё. Но теперь кто-то может всё равно это сохранить.
Неловкие ситуации. Представьте, вы написали негативное сообщение, потом удалили. А собеседник (бизнес-аккаунт) уже успел всё сохранить и ещё прислал вам ИИ-ответ: «Ой, а почему молчите? Расскажите больше!»
Двойной контроль. Помимо банальных скриншотов, у друга может работать целая автоматизированная лог-система, где всё записывается.
Зачем всё это вашему бизнесу?
Поддержка 24/7 — если в нерабочее время клиент пишет что-то в личку, бот может вежливо (или саркастично) ответить, не теряя «лиды».
Улучшение качества — есть возможность пересматривать логи, понимать, что чаще всего спрашивают, и корректировать скрипты ответов.
Автоматизация CRM — все сообщения (даже удалённые) можно прикрутить к аналитике, чтобы ничего не терялось.
Если грамотно настроить промты и указания для ИИ, бот станет полноценным онлайн-ассистентом, облегчающим жизнь владельцу.
Архитектура решения
Под капотом всё достаточно просто:
Расширенные бизнес-события — бот получает не только
message
иedited_message
, но иdeleted_business_messages
, если аккаунт владельца — бизнес-аккаунт.База для логов — при новом сообщении бот запоминает
(chat_id, message_id)
и текст/тип сообщения.Автоответ — если пишет не владелец и за N секунд нет «живого» ответа, бот формирует реплику через ChatGPT (или похожую модель).
Когда Telegram шлёт апдейт об удалении (deleted_business_messages
), бот сопоставляет message_id
с логом и отсылает владельцу: «Вот что было удалено». Аналогично при редактировании.
Почему стоит быть осторожнее?
Юридические аспекты — в некоторых странах нужно предупреждать собеседника, что переписка ведётся с участием ИИ и логируется.
Этика — не все знают, что вы сохраняете удалённое. С точки зрения личной морали — это довольно сомнительно.
Но при этом бизнес-выгоды очевидны, от снижения нагрузки на менеджеров до более полной статистики контактов.
Иллюстративные кейсы
1. Автоматическая поддержка клиентов
Ситуация — клиент спрашивает в час ночи: «Когда доставят мой заказ?». Менеджеры спят.
Что делает бот — ждёт 15 секунд, видит, что владелец не ответил — генерирует ответ: «Доброй ночи! Ваш заказ прибудет завтра к 18:00. Хорошего дня!». Клиент рад, всё чётко.
Удалённые сообщения — если клиент, например, написал грубость и удалил, владелец утром всё равно увидит.
2. Логирование важных деталей
Ситуация — клиент случайно отправил номер карты или нужный адрес, а потом удалил.
Что делает бот — «Я всё видел и уже сохранил». С точки зрения бизнеса удобно (ничего не потерялось), но для клиента — сюрприз.
Мнение параноика
Если вы — пользователь, который НЕ хочет, чтобы за вами шпионили:
Никогда не пишите то, что не готовы показать на публике.
Учитывайте, что удаление не равно «исчезновению».
Если видите у собеседника синий премиум-бейдж, помните — у него может быть этот зловещий «Business Mode».
Мнение предпринимателя
Если вы — предприниматель:
С помощью такого бота вы серьёзно прокачаете клиентский сервис.
Главное — не переходить рамки приличия, соблюдать локальные законы о приватности и чётко знать, зачем вам использовать такого помощника.
Используйте силу ИИ на благо, например, фильтруйте спам, автоматизируйте FAQ и бережно относитесь к полученным данным.
Как всё устроено технически?
Ниже будет — единый пример скрипта (на Python), который демонстрирует:
Подключение к Bot API через
PyTelegramBotAPI
.Использование
openai
для генерации ответов.Обработку расширенных «бизнес-событий»:
business_message
,edited_business_message
,deleted_business_messages
.Логику таймеров для автодополнения ответов, если владелец не успел.
Все токены и ID, разумеется, надо подставить свои. Код выглядит объёмно, но зато иллюстрирует суть целиком.
Заключение: стоит ли паниковать?
Если вы дорожите приватностью и боитесь компромата, будьте осторожнее. Мир уже не тот, где «Удалить для всех» значит «Удалить вообще для всех».
Если вы бизнес — этот инструмент спасёт вам время и нервы, но только при условии, что вы осознаёте риски того, что бот может ответить некорректно.
Если вы разработчик, теперь вы знаете, как «прокачать» своего бота. Добавляйте хоть мультиязычность, хоть интеграцию с CRM, хоть дополнительную аналитику.
В конечном счёте, главное — не отправляйте в чат того, что не готовы увидеть на всеобщем обозрении. А пока мир живёт иллюзией «я удалил сообщение, его никто не увидит», технологии уже делают параллельную копию для бота. Прогресс, что тут скажешь!
Важный блок про безопасность
Никогда не используйте чужие боты (особенно бесплатные) без публичного исходного кода. Подумайте сами, если бот не принадлежит вам, а разработчик хранит его код за семью печатями, то у вас нет гарантии, что он не будет тайно логировать всю переписку и пересылать её куда-нибудь ещё.
Почему это опасно?
Полное незнание процессов внутри — исходный код закрыт, вы не видите, какие данные бот собирает и как ими распоряжается.
Бесплатная модель — когда вы не платите за такого бота, вы как бы подтверждаете готовность передавать ему информацию, но при этом не имеете контроля над тем, куда эти данные могут утечь.
Отсутствие прозрачности — никто не проверяет бота «изнутри», а значит, вполне могут быть скрытые «шпионские» модули, которые сохраняют, анализируют, сливают переписку сторонним лицам.
Как уберечь себя?
Доверять только себе, если нужен бот — создавайте собственного (или используйте проверенные проекты с открытым исходным кодом).
Проверять репутацию, если очень нужно воспользоваться сторонним решением, поищите отзывы, спросите в комьюнити и удостоверьтесь, что разработчик не балуется сомнительными методами.
Минимизировать критичные данные, чем меньше приватной информации вы отправляете в незнакомый бот, тем лучше.
Всегда помните, что за красивым интерфейсом или заманчивой бесплатной подпиской может стоять любой код, в том числе вредоносный. Лучше перестраховаться, чем потом удивляться, где всплыли ваши «удалённые» сообщения.
«Мораль сей басни»:
Телеграм-боты — мощный инструмент и для бизнеса, и для шпионских экспериментов.
Пользователи часто не осознают, что их слова могут «сохраниться» в чужом логе и потом всплыть.
Чёрный юмор в том, что, удаляя сообщение, вы делаете только вид, будто ничего не было —, но бот-то не спит!
Белый юмор — что бизнес реально может прокачать сервис до крутого »24/7 ассистента» с ИИ-ответами, повышая конверсию и удовлетворённость клиентов.
В общем, используйте с умом. Надеюсь, эта статья помогла разобраться в механизмах Telegram Business, породила здоровую паранойю и дала идеи, как сделать свой собственный ~«подглядывающий»~ полезный бот.
Всем безопасных переписок!
Полный код примера
Ниже финальный скрипт, объединяющий все описанные техники. Подставьте свои значения в константы, установите библиотеки (pip install pyTelegramBotAPI openai
) и вперёд — тестировать.
import telebot
import openai
import json
import threading
import time
from collections import defaultdict, deque
# 1. Ваши токены и ID
TELEGRAM_TOKEN = "ВАШ_TELEGRAM_BOT_TOKEN"
OPENAI_API_KEY = "ВАШ_OPENAI_API_KEY"
OWNER_ID = 123456789 # ID владельца бота (ваш телеграм-ID, куда слать уведомления)
# 2. Глобальные настройки
auto_reply_enabled = True # Флаг включён ли автодополненный ответ вообще
AUTO_REPLY_DELAY = 15 # Задержка (в секундах), через которую бот отвечает, если владелец молчит
bot = telebot.TeleBot(TELEGRAM_TOKEN, parse_mode="HTML")
openai.api_key = OPENAI_API_KEY
# 3. Хранилища история для GPT, логи сообщений
chat_histories = defaultdict(lambda: deque(maxlen=25))
messages_log = {}
auto_reply_timers = {}
last_client_message = {}
def get_chat_title(chat: telebot.types.Chat) -> str:
"""
Возвращает удобочитаемое название чата (имя, фамилия или username, если это приват).
"""
if chat.type == "private":
full_name = ""
if chat.first_name:
full_name += chat.first_name
if chat.last_name:
full_name += f" {chat.last_name}"
if not full_name and chat.username:
full_name = f"@{chat.username}"
return full_name.strip() if full_name else str(chat.id)
else:
return chat.title if chat.title else str(chat.id)
def build_gpt_messages(chat_id: int) -> list:
"""
Подготавливаем историю переписки (25 последних сообщений) + системный промт
для передачи в OpenAI ChatCompletion.
"""
messages_for_gpt = [
{
"role": "system",
"content": (
"Ты — дружелюбный чат-бот с легкой иронией. Отвечай кратко, по делу и с юмором. "
"Учитывай предыдущие сообщения, имитируя стиль живого собеседника. "
"Используй неформальный тон, добавляй эмодзи, где уместно."
)
}
]
for role, content in chat_histories[chat_id]:
messages_for_gpt.append({"role": role, "content": content})
return messages_for_gpt
def save_chat_histories_to_json(file_path="chat_histories.json"):
"""
Пример сохранения историй в JSON, если вдруг нужно.
"""
data_to_save = {}
for c_id, history_deque in chat_histories.items():
data_to_save[str(c_id)] = list(history_deque)
with open(file_path, "w", encoding="utf-8") as f:
json.dump(data_to_save, f, ensure_ascii=False, indent=2)
def generate_bot_answer(chat_id: int, user_text: str) -> str:
"""
Генерация ответа через OpenAI ChatCompletion.
"""
chat_histories[chat_id].append(("user", user_text))
gpt_messages = build_gpt_messages(chat_id)
try:
response = openai.ChatCompletion.create(
model="gpt-4", # Или используйте другую модель (gpt-3.5-turbo и т.п.)
messages=gpt_messages,
max_tokens=300,
temperature=0.7
)
gpt_answer = response.choices[0].message.content.strip()
except Exception as e:
print(f"[OpenAI Error] {e}")
gpt_answer = "Извините, но ИИ сейчас молчит..."
chat_histories[chat_id].append(("assistant", gpt_answer))
save_chat_histories_to_json("chat_histories.json")
return gpt_answer
def auto_reply(chat_id: int, bc_id: str):
"""
Функция, срабатывающая через AUTO_REPLY_DELAY секунд, если владелец не ответил.
Формирует ответ с помощью ИИ и отправляет в чат.
"""
auto_reply_timers.pop(chat_id, None)
info = last_client_message.get(chat_id)
if not info:
return # Нет данных, нечего отвечать
message, msg_time = info
now = time.time()
if now - msg_time < (AUTO_REPLY_DELAY - 0.5):
# Вдруг таймер сработал раньше?
return
if not auto_reply_enabled:
print("[AutoReply] Глобально автоответ отключён, ничего не отправляем.")
return
if message.content_type == "text":
user_text = message.text
gpt_answer = generate_bot_answer(chat_id, user_text)
bot.send_message(chat_id=chat_id, text=gpt_answer, business_connection_id=bc_id)
print(f"[AutoReply] Бот сам ответил в чат {chat_id}")
# --- Хендлеры для «Business Mode» ---
@bot.business_message_handler(content_types=[
'text', 'photo', 'video', 'voice', 'document',
'animation', 'audio', 'sticker', 'location', 'contact'
])
def handle_business_message(message: telebot.types.Message):
"""
Обрабатывает новые бизнес-сообщения логирует их и при необходимости запускает таймер для автоответа.
"""
chat_id = message.chat.id
bc_id = message.business_connection_id
from_user_id = message.from_user.id
# Логируем сообщение
log_data = {}
ctype = message.content_type
log_data["type"] = ctype
if ctype == 'text':
log_data["content"] = message.text
elif ctype == 'photo':
photo_obj = message.photo[-1]
log_data["content"] = photo_obj.file_id
if message.caption:
log_data["caption"] = message.caption
elif ctype == 'video':
log_data["content"] = message.video.file_id
if message.caption:
log_data["caption"] = message.caption
elif ctype == 'document':
log_data["content"] = message.document.file_id
if message.caption:
log_data["caption"] = message.caption
elif ctype == 'voice':
log_data["content"] = message.voice.file_id
elif ctype == 'audio':
log_data["content"] = message.audio.file_id
elif ctype == 'animation':
log_data["content"] = message.animation.file_id
if message.caption:
log_data["caption"] = message.caption
elif ctype == 'sticker':
log_data["content"] = message.sticker.file_id
elif ctype == 'location':
lat = message.location.latitude
lon = message.location.longitude
log_data["content"] = f"[location] lat={lat}, lon={lon}"
elif ctype == 'contact':
phone = message.contact.phone_number
first_name = message.contact.first_name
last_name = message.contact.last_name or ''
log_data["content"] = f"[contact] {first_name} {last_name}, tel={phone}"
else:
log_data["content"] = f"[{ctype}]"
# Сохраняем в общий лог
messages_log[(chat_id, message.message_id)] = log_data
# Если пишет владелец — отменяем автоответ, он уже «в деле»
if from_user_id == OWNER_ID:
if chat_id in auto_reply_timers:
t = auto_reply_timers.pop(chat_id)
t.cancel()
print(f"[Cancel Timer] Владелец ответил сам, отменяем таймер в чате {chat_id}.")
return
# Если автоответ глобально выключен — выходим
if not auto_reply_enabled:
print("[BusinessMessage] Автоответ выключен, выходим.")
return
# Если пришёл текст от клиента, запускаем таймер
if ctype == 'text':
last_client_message[chat_id] = (message, time.time())
# Сбрасываем предыдущий таймер, если был
if chat_id in auto_reply_timers:
old_t = auto_reply_timers.pop(chat_id)
old_t.cancel()
new_t = threading.Timer(AUTO_REPLY_DELAY, auto_reply, args=(chat_id, bc_id))
auto_reply_timers[chat_id] = new_t
new_t.start()
else:
# Если не текст, можно тоже ответить, но по умолчанию молчим
pass
@bot.edited_business_message_handler(content_types=[
'text','photo','video','voice','document','animation','audio','sticker','location','contact'
])
def handle_edited_business_message(message: telebot.types.Message):
"""
Обрабатываем отредактированные сообщения узнаём, что было до, что стало, сообщаем владельцу.
"""
old_data = messages_log.get((message.chat.id, message.message_id), {})
old_desc = f"{old_data.get('type', '?')}: {old_data.get('content', '?')}"
new_data = {}
ctype = message.content_type
new_data["type"] = ctype
if ctype == 'text':
new_data["content"] = message.text
else:
new_data["content"] = f"[edited {ctype}]"
messages_log[(message.chat.id, message.message_id)] = new_data
chat_name = get_chat_title(message.chat)
notify_text = (
f"Сообщение отредактировано.\n"
f"Старое: {old_desc}\n"
f"Новое: {new_data['content']}\n"
f"Чат: {chat_name}"
)
bot.send_message(OWNER_ID, notify_text)
@bot.deleted_business_messages_handler()
def handle_deleted_business_messages(deleted: telebot.types.BusinessMessagesDeleted):
"""
Когда сообщение удаляют, сюда прилетает список message_ids. Мы ищем их в логах и отправляем владельцу.
"""
chat_id = deleted.chat.id
chat_name = get_chat_title(deleted.chat)
for msg_id in deleted.message_ids:
data = messages_log.pop((chat_id, msg_id), None)
if not data:
text_for_owner = (
f"Сообщение удалено, но бот не успел залогировать.\n"
f"Чат: {chat_name}, msg_id={msg_id}"
)
bot.send_message(OWNER_ID, text_for_owner)
continue
ctype = data.get("type", "unknown")
content = data.get("content", "")
caption = data.get("caption", "")
text_for_owner = (
f"Сообщение удалено.\n"
f"Тип: {ctype}\n"
f"Чат: {chat_name}\n"
)
# В зависимости от типа — отправляем текст или медиа владельцу
if ctype == "text":
text_for_owner += f"Текст: {content}"
bot.send_message(OWNER_ID, text_for_owner)
elif ctype == "photo":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_photo(OWNER_ID, content, caption=f"[deleted photo] {caption}")
elif ctype == "video":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_video(OWNER_ID, content, caption=f"[deleted video] {caption}")
elif ctype == "document":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_document(OWNER_ID, content, caption=f"[deleted doc] {caption}")
elif ctype == "voice":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_voice(OWNER_ID, content)
elif ctype == "audio":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_audio(OWNER_ID, content)
elif ctype == "animation":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_animation(OWNER_ID, content, caption=f"[deleted animation] {caption}")
elif ctype == "sticker":
bot.send_message(OWNER_ID, text_for_owner)
bot.send_sticker(OWNER_ID, content)
elif ctype == "location":
text_for_owner += f"Данные: {content}"
bot.send_message(OWNER_ID, text_for_owner)
elif ctype == "contact":
text_for_owner += f"Данные: {content}"
bot.send_message(OWNER_ID, text_for_owner)
else:
# На всякий случай, если вдруг встретится тип, не учтённый выше
text_for_owner += f"Данные: {content}"
bot.send_message(OWNER_ID, text_for_owner)
# --- Обычные команды, не бизнес ---
@bot.message_handler(commands=['enable_auto'])
def enable_auto_handler(message: telebot.types.Message):
global auto_reply_enabled
auto_reply_enabled = True
bot.reply_to(message, "Автоответ теперь ВКЛЮЧЕН для всех чатов.")
@bot.message_handler(commands=['disable_auto'])
def disable_auto_handler(message: telebot.types.Message):
global auto_reply_enabled
auto_reply_enabled = False
bot.reply_to(message, "Автоответ теперь ВЫКЛЮЧЕН для всех чатов.")
@bot.message_handler(commands=['start', 'help'])
def handle_start_help(message: telebot.types.Message):
bot.send_message(
message.chat.id,
"Это бизнес-бот с возможностью логировать удалённые сообщения и отвечать через ИИ.\n\n"
"Доступные команды:\n"
"/enable_auto – включить автоответ во всех чатах\n"
"/disable_auto – выключить автоответ во всех чатах"
)
if __name__ == "__main__":
print("Бот запущен и ждёт сообщений...")
bot.polling(none_stop=True, interval=0)