⎯ TL;DR
  • Человеческое поведение статистически не uniform. Живые юзеры — логнормаль, боты — uniform. Это основное различие для anti-spam.
  • Три измерения: session entropy (длительности сессий), swipe patterns (траектория прокрутки), pause entropy (задержки между действиями).
  • Плюс rotating fingerprint — стабильный per-account, разный между аккаунтами. Моделирует реальную популяцию Telegram users.
  • Математика: log-normal для durations, bezier curves + micro-jitter для траекторий, Poisson для discrete events.
  • Реализация требует осторожности: одна ошибка (uniform где должно быть log-normal) — и вся модель видна.

Большинство anti-detection решений для Telegram-рассылок останавливаются на «добавь random delays». В 2022 этого было достаточно. Сегодня SpamBot видит распределение задержек и отличает `random.uniform(30, 60)` от живого пользователя за 20-30 попыток.

Чтобы пройти behavioral detection в 2026, нужно не просто «рандомизировать», а корректно моделировать человеческое поведение по распределениям, наблюдаемым в реальной популяции.

01 · Session entropy

Измерение 1: длительности сессий

Сколько минут живой юзер сидит в Telegram за один вход? Зависит от типа действия:

Распределение не нормальное (как думают многие). Оно логнормальное — симметричное в log-пространстве, но смещённое в линейном:

import numpy as np import matplotlib.pyplot as plt # Параметры человеческой сессии, из эмпирических наблюдений: mu = np.log(600) # медиана ~600 секунд (10 мин) sigma = 0.9 # широкий разброс # Сгенерировать 10 000 "сессий" sessions = np.random.lognormal(mu, sigma, 10000) # Распределение: много коротких, редкие очень длинные # Медиана: ~600s. Mean: ~900s (сдвинут вверх длинным хвостом) # P99: ~4000s (~67 минут)

Ключевое: нельзя использовать нормальное распределение — у живых юзеров есть длинный хвост длинных сессий. Нельзя и uniform — у живых нет чёткой верхней границы.

Проверка: если твои «сессии» все от 2 до 20 минут без редких 2-часовых — это не человек, это скрипт с random.uniform(120, 1200).

02 · Swipe patterns

Измерение 2: траектория прокрутки

Когда юзер скроллит чат-лист, его палец (или курсор) движется не по прямой. У пальца есть:

Математически — bezier curve с двумя контрольными точками плюс случайный jitter:

def human_swipe(start_y, end_y, duration_ms=500): # Bezier P0=(0, start_y), P3=(1, end_y) # Контрольные P1, P2 — для S-кривой p1_t, p1_y = 0.25, start_y + (end_y - start_y) * 0.15 p2_t, p2_y = 0.75, start_y + (end_y - start_y) * 0.85 points = [] for frame in range(int(duration_ms / 16)): t = frame / (duration_ms / 16) y = bezier(t, start_y, p1_y, p2_y, end_y) # Micro-jitter по X x_jitter = np.random.normal(0, 2) # std=2px points.append((200 + x_jitter, y)) return points # Бот с random.uniform: прямая линия, видно за 3 свайпа # Живой человек: S-кривая с дрожью по X, как у нас

В контексте Telegram Desktop / Mobile — это относится к скорости прокрутки чат-листа, к задержкам между ответами в беседе, к «заходит/возвращается» навигации.

«У людей палец дрожит. У ботов — не дрожит. Это один из самых простых сигналов для detection.»
03 · Pause entropy

Измерение 3: задержки между действиями

Между тем, как юзер открыл диалог и отправил сообщение, обычно проходит 5-30 секунд: прочитать → подумать → напечатать → отправить. Бот: 100-500ms (просто фаза исполнения скрипта).

Распределение этих задержек — ключевой сигнал. Ключевое: паузы зависят от контекста:

КонтекстМедиана паузы (живой)Типичный бот
Response на входящее сообщение20-60s<1s
Между своими сообщениями (в одном диалоге)30-120sfixed delay
Между разными target'ами в рассылке60-600s (логнормаль)uniform
Typing indicator → message sent1-4s0 или отсутствует

Критичное наблюдение: между разными контекстами паузы не коррелируют у живых, коррелируют у ботов (один и тот же scheduler).

04 · Rotating fingerprint

Измерение 4: разнообразие устройств

Четвёртое измерение — не «temporal», а «categorical». Каждая сессия Telegram имеет метаданные: device_model, app_version, system_version, lang_code.

В реальной популяции 950M+ Telegram users эти значения распределены: ~50% на iPhone, ~40% на Android, ~10% desktop. Внутри iPhone — разные модели (13, 14, 15, SE), разные версии iOS. Такая же диверсификация у Android.

Схема «один и тот же Samsung Galaxy S24 для всех 50 аккаунтов» — явный сигнал фермы. Правильная схема — sampling из реалистичного распределения:

device_distribution = [ ("iPhone 14", 0.08), ("iPhone 15", 0.12), ("iPhone 15 Pro", 0.09), ("Samsung Galaxy S23", 0.07), ("Samsung Galaxy S24", 0.06), ("Xiaomi Redmi Note 12", 0.05), # ... и т.д. ~50 моделей ] def assign_fingerprint(account_id): # Deterministic — для account_id всегда один и тот же device # (чтобы между сессиями fingerprint не дрифтил) np.random.seed(hash(account_id)) return weighted_choice(device_distribution)

Важно: fingerprint стабилен для аккаунта. Юзер не меняет телефон каждый день. Рандомизация между сессиями — сигнал фермы.

05 · Combined model

Всё вместе

Behavioral Rotator комбинирует все 4 измерения в единой модели:

  1. Session entropy — log-normal распределение для длительностей
  2. Swipe patterns — bezier curves с micro-jitter для траекторий
  3. Pause entropy — context-aware delays с разными распределениями
  4. Rotating fingerprint — sampling из реалистичной популяции, стабильное per-account

Все эти модели работают параллельно. Session длится столько-то → сэмпл из log-normal. Внутри сессии действия с такими-то паузами → context-aware. Прокрутка рендерится с bezier-easing. Fingerprint стабильный.

Результат: статистически, поведение аккаунта неотличимо от живого пользователя Telegram на уровне агрегированных сигналов. SpamBot не видит паттерна — не потому что «мы его спрятали», а потому что его нет.

⎯ скачать

TG:ON для macOS · Windows · Linux

Desktop-приложение, 160 MB. Работает локально, твои ключи остаются у тебя. 3 дня триала без карты.

Скачать бесплатно
⎯ tech → product

Всё это уже в TG:ON.
Без кодинга.

Behavioral Rotator — не открытая технология и не «API», а встроенный движок TG:ON. 3 дня триала — прогоняешь на своих аккаунтах и видишь 0 банов.

Начать триал