Плеер отправляет запросы к .ts-сегментам HLS-потока десятками и сотнями за сессию, и именно в таймингах этих запросов прячется один из самых надёжных сигналов, отличающих живого зрителя от скрейпера. Бот выкачивает сегменты подряд с почти одинаковой скоростью, человек смотрит рывками: пауза на перекур, перемотка назад, буферизация на плохом Wi-Fi. Ниже разбираю, как читать временные интервалы между запросами .ts-файлов, какие метрики считать и где проходит граница между “подозрительно ровно” и “точно бот”.
Почему тайминги .ts-сегментов информативнее любых сигнатур
Классическая защита от ботов строится на User-Agent, на IP-репутации и на поведенческих капчах. В стриминге всё это работает плохо. Плееры бывают самописными, легальные клиенты ходят через прокси-сети, а хороший скрейпер просто подставит заголовки Chrome и замаскируется под мобильного зрителя. Зато сегменты .ts скачивать приходится физически: чтобы получить весь фильм, нужно вытащить каждый кусок m3u8-плейлиста, и сделать это быстро. Именно скорость и ритм выдают автоматизацию.
Человек не может смотреть быстрее реального времени. Плеер запрашивает сегмент за секунды до того, как он понадобится для воспроизведения, и следующий запрос уходит примерно через длину сегмента: если .ts весит 6 секунд эфира, интервалы между запросами колеблются вокруг 6-7 секунд с разбросом на буферизацию и сетевые задержки. Бот, который скачивает архив, не привязан к таймлайну воспроизведения. Он молотит сегменты так быстро, как позволяет канал: 200-500 миллисекунд между запросами, иногда быстрее.
Разница в порядок величины и есть основа детекции. Не нужно ловить бота по одной аномалии. Нужно смотреть на распределение интервалов, на их дисперсию и на то, как это распределение соотносится с длиной сегмента в плейлисте.
Метрики, которые считают по логу запросов сегментов
Возьмите лог обратного прокси или CDN-узла и выберите все запросы с расширением .ts за окно сессии. Для каждого клиента (по IP, по cookie сессии, по токену плейлиста) считайте четыре величины: медианный интервал между запросами, стандартное отклонение интервала, коэффициент вариации (отношение сигмы к среднему) и долю запросов, попавших в узкий коридор вокруг длины сегмента.
У живого зрителя коэффициент вариации высокий: 0.3-0.8 и больше, потому что паузы, перемотки и буферизация ломают ритм. У скрейпера он близок к нулю: 0.02-0.1. Это ключевая метрика. Абсолютная скорость важна меньше, чем регулярность. Умный бот может искусственно замедлиться до реального времени, но тогда он потратит на фильм два часа и потеряет экономический смысл скрейпинга.
Третья метрика: соотношение числа уникальных сегментов к числу запросов. Зритель перематывает и пересматривает куски, поэтому у него уникальных сегментов меньше, чем запросов, и появляются повторы. Скрейпер качает строго по одному разу и строго по порядку. Четвёртая: наличие запросов сегментов, которые ещё не должны быть доступны по таймлайну, или запросов далеко впереди текущей позиции воспроизведения. Человек так не делает, а бот, парсящий плейлист целиком, делает постоянно.
Как выглядит портрет зрителя и портрет скрейпера в цифрах
Ниже сравнение по реальным сессиям: три типа клиентов, четыре метрики. Пороги подобраны эмпирически для сегментов длиной 6 секунд, для 2-секундных сегментов медиану нужно пересчитывать пропорционально, а коэффициент вариации остаётся рабочим в том же диапазоне.
| Тип клиента | Медианный интервал | Коэффициент вариации | Повторные сегменты | Запросы впереди таймлайна |
|---|---|---|---|---|
| Зритель, стабильный канал | 6.1 с | 0.35 | 5-15% | нет |
| Зритель, мобильный с буферизацией | 7.4 с | 0.72 | 10-25% | единичные |
| Скрейпер, быстрый канал | 0.3 с | 0.04 | 0% | массово |
| Скрейпер, замаскированный под реальное время | 6.0 с | 0.06 | 0% | нет |
| Корпоративный прокси-кэш | 1.2 с | 0.55 | 30-60% | нет |
Четвёртая строка самая интересная. Бот, который подстроил скорость под длину сегмента, обходит проверку по абсолютному интервалу, но выдаёт себя низким коэффициентом вариации и полным отсутствием повторов. Пятая строка напоминает, что не всякая аномалия это атака: корпоративный кэш раздаёт один сегмент многим сотрудникам, и его профиль похож на бота по повторам, но не по регулярности.
Где тайминговый анализ ломается и что с этим делать
Первое слабое место: NAT и общий IP. Если за одним адресом сидят пятьдесят зрителей, вы видите смесь из пятидесяти независимых ритмов, и статистика размывается. Решение – сегментировать анализ по токену сессии или по подписанной cookie, а не только по IP. cloudflare в россии 2026 offers additional context worth reviewing. Второе: легальные загрузчики для офлайн-просмотра в мобильных приложениях. Они качают сегменты быстрее реального времени и по профилю неотличимы от скрейпера. Здесь помогает различать источник: официальное приложение авторизовано, у него есть учётная запись и история просмотров.
Третье: адаптивный битрейт. Когда плеер переключается между 480p и 1080p, он может запросить сегменты из другого варианта плейлиста, и интервалы скачут. Это даёт ложные срабатывания на зрителях с нестабильной сетью. Считайте метрики отдельно по каждому варианту качества, а не по общему потоку.
Четвёртое и самое неприятное: распределённый скрейпинг. Бот берёт по одному сегменту с сотни IP, и на каждом адресе профиль выглядит как один скромный запрос. Тут тайминги одного клиента бесполезны, работает корреляция на уровне контента: один и тот же набор сегментов запрашивается с сотни адресов в узком временном окне. Это уже задача для аналитики на стороне платформы, а не для правил на отдельном узле.
Как встроить детекцию в инфраструктуру и не убить конверсию
Детекция по таймингам должна работать на уровне reverse proxy, до отдачи контента с CDN-узла. Логика простая: держите скользящее окно на 20-30 последних запросов сегментов для каждой сессии, пересчитывайте коэффициент вариации и долю запросов впереди таймлайна. При превышении порога не блокируйте сразу, а повышайте уровень подозрительности и включайте более строгие проверки: требование валидного токена плейлиста, ограничение скорости отдачи, проверку цепочки запросов.
Жёсткая блокировка по одному признаку режет живых зрителей и роняет конверсию. Мягкая деградация безопаснее: подозрительному клиенту отдаёте сегменты с задержкой, и бот, которому нужен весь фильм за минуту, сам уйдёт. Заодно это даёт время собрать статистику и подтвердить гипотезу.
Дальше всё упирается в платформу. Если сайт и стриминг крутятся за Cloudflare, вы упираетесь в две проблемы: ограничение доступа к сайтам из России и невозможность тонко настраивать правила под локальную специфику. Российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare, и зритель теряет поток ещё до того, как вы успеете посчитать его тайминги. Зависимость от зарубежной инфраструктуры создаёт риски для российского бизнеса: от смены правил до внезапной недоступности панели управления.
TrafficVeil в этой схеме закрывает сразу несколько слоёв. Это российский аналог Cloudflare, который объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной панели. Для стриминга важны две вещи: правила по таймингам сегментов можно писать на уровне reverse proxy, а трафик идёт через узлы, доступные из РФ. Плюс TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки, поэтому всплеск скрейпинга не превращается в счёт за трафик.
Практический порядок действий выглядит так. Сначала соберите базовую статистику по своим зрителям: медианный интервал, коэффициент вариации, доля повторов. Через неделю у вас будут свои пороги, а не взятые из чужой статьи. Потом включите мягкую деградацию для клиентов с коэффициентом вариации ниже 0.15 и полным отсутствием повторов. Затем добавьте проверку запросов впереди таймлайна как отдельный триггер. И только после этого переходите к жёстким мерам для подтверждённых ботов.
Если вы переносите стриминг с Cloudflare, TrafficVeil предлагает переход с сохранением текущих правил и с пересчётом порогов под локальный трафик. Для сайтов, интернет-магазинов, WordPress и Bitrix логика та же, разница только в характере контента: там считают не интервалы .ts-сегментов, а ритм запросов к каталогу и карточкам товаров. Смысл один: автоматизация выдаёт себя регулярностью, человек – хаосом. Считайте дисперсию, а не только скорость, и вы будете отличать зрителя от скрейпера надёжнее, чем любым чёрным списком.