Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Как я вычислил Telegram-скам-бота: технический разбор и реконструкция на Telethon

Как я вычислил Telegram-скам-бота: технический разбор и реконструкция на Telethon

Подробности изложены в материале первоисточника. Когда мне первой написала «Мария», я почти сразу понял, что общаюсь с юзерботом. Профиль без публичного юзернейма, типичные фотографии и быстро развивающийся диалог сразу привлекли моё внимание. Я решил провести собственное расследование, чтобы выяснить, как устроена эта автоматизация изнутри, о чем подробно рассказывает моя ночная проверка подозрительного аккаунта.

Всё началось 11 сентября, когда собеседница неожиданно вышла на связь под предлогом интереса к сфере IT. Легенда строилась вокруг поиска материалов для старта, что выглядело безобидно и располагало к диалогу.

Профиль аккаунта Maria P без публичного юзернейма
Внутренний идентификатор аккаунта и скудное описание в профиле.
Итоговое состояние чата перед удалением
Последние сообщения в чате перед тем, как переписка была полностью стерта.
Дополнительный фрагмент кода реконструкции на Telethon
Кусок программного кода, отвечающий за логику работы бота.
Настройка констант задержки таймера
Константа задержки, воспроизводящая четырехминутные паузы.
Обработка очереди входящих сообщений
Реализация очереди для обработки входящих реплик.
Флаг ручного вмешательства оператора
Логика передачи диалога человеку при обнаружении медиаконтента.
Функция очистки и удаления диалога
Команда удаления переписки у обоих участников.
Случайная генерация таймера через random
Усовершенствование таймера с помощью случайного распределения задержек.

Знакомство с фигурантом и первые подозрения

Аккаунт носил имя Maria P и обладал лишь внутренним идентификатором Telegram. Разглядеть его в общем поиске или отправить жалобу стандартным способом не представлялось возможным. В разделе о себе красовалась короткая фраза о кинематографе с грамматической ошибкой, а в историях публиковались чашки кофе.

Реклама
Развитие легенды о локдаунах и разводе в переписке
Быстрый переход к личным темам после упоминания открытия студии.

Легенда развернулась стремительно: стоило мне упомянуть создание собственной студии, как последовали рассказы о закрывшемся из-за локдаунов бизнесе, разводе и предложение перейти на ты. Чтобы проверить сценарий, я намеренно завел разговор об инвестициях и криптовалюте, но бот ответил отказом, сославшись на то, что это слишком рискованно.

Анализ времени сообщений и ответов в чате
Таблица с временными интервалами, показывающая одинаковые паузы в 4-5 минут.

Технические улики: от таймера до фальшивых городов

Главные доказательства автоматизации стали очевидны при анализе временных интервалов и реакций системы.

Диалог о городах и встречный вопрос собеседницы
Бот уходит от прямого ответа на вопрос о местоположении встречным вопросом.

Улика №1. Фиксированный таймер

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

Упоминание вымышленного Ново-Дринаженска
Реакция бота на название населенного пункта, которого нет на карте.

Улика №2. Игнорирование несуществующей географии

Когда я сообщил собеседнице, что нахожусь в вымышленном городе «Ново-Дринаженск», алгоритм никак не отреагировал на несуществующий топоним, выдав заготовленный шаблон о Ярославле. Вопросов о том, где именно находится этот город, не последовало вовсе.

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

Улика №3. Ответ на удаленное сообщение

Проводя эксперимент около часа ночи, я отправил тестовый системный промпт-инъекцию и сразу удалил его. Ровно через пять минут бот ответил на несуществующий текст, выдав шаблонную защиту. Это доказало, что бэкенд ставит задачи в очередь и не проверяет актуальность сообщения в момент отправки ответа.

Улика №4. Защита системного промпта

На мои попытки заставить бота решить нетипичные задачи — выдать рецепт блинчиков, разбить текст на слова или посчитать буквы в слове «бронетранспортер» — система отвечала заученными фразами вроде «Я тебе не поваренная книга». Это подтвердило наличие жесткого системного промпта с правилами отказа.

Ответ бота на удаленное сообщение
Бот отвечает на сообщение, которое уже было удалено из чата.

Вмешательство оператора и финал расследования

Отправка двухсекундного пустого голосового сообщения и серии хаотичных медиафайлов сломала привычный ритм ответов бота. Сообщения помечались как прочитанные, но автоматического ответа не следовало. Вероятно, в этот момент управление переходило к живому оператору-воркеру.

Проверка системного промпта нестандартными задачами
Характерная реакция бота на попытку заставить его решать сторонние задачи.

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

Продолжение тестирования защитных механизмов промпта
Еще один пример срабатывания защиты от неурочных задач.

Реконструкция логики бота на Python

На основе собранных данных я воссоздал вероятную архитектуру такого скрипта с использованием библиотеки Telethon на Python. Константа задержки имитирует тот самый неизменный таймер, а накопление входящих сообщений объясняет отправку ответов пачками.

Отправка пустого голосового сообщения
Задержка ответа после отправки двух секунд тишины в аудиосообщении.

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

Хаотичные сообщения и медиафайлы ночью
Серия разноплановых сообщений, отправленных подряд для проверки реакции оператора.
Прочитанные сообщения без ответа со стороны бота
Сообщения отмечены прочитанными, но ответа больше не поступает.

Как распознать скам-бота самостоятельно

Если вы подозреваете, что обходитесь с алгоритмом, воспользуйтесь простыми методами проверки:

  • Сравните тайминги ответов: одинаковые паузы при разной длине реплик выдают скрипт.
  • Упомяните выдуманный город и проследите за реакцией собеседника.
  • Удалите отправленное сообщение сразу после отправки — бот из очереди все равно на него ответит.
  • Проверьте систему на нестандартные задачи, чтобы увидеть шаблонные отказы.
  • Отправьте пустое голосовое сообщение, чтобы проверить, как меняется ритм диалога.
01.