
Курсор на экране движет не программа, а рука с массой, суставами и запаздывающей обратной связью через зрение. Из-за этого человеческое движение к цели подчиняется довольно жёсткой закономерности: оно занимает предсказуемое время, зависящее от расстояния и размера цели, состоит из быстрого броска и последующей подстройки, почти всегда идёт по дуге и заметно замедляется у самой кнопки. Любой сценарий, который двигает мышь равномерно по прямой или сразу выставляет координаты клика, нарушает эту закономерность целиком, а не в деталях.
Ниже — разбор того, как страница снимает траекторию, что именно в ней меряется, почему простая рандомизация координат не спасает, и как выглядит модель движения, которая проходит проверку на физику. Тема продолжает материал про эмуляцию мыши, скролла и биометрию, но здесь фокус узкий: геометрия и тайминг пути до цели.
Закон Фиттса: откуда берётся время движения
Закономерность, описанная Полом Фиттсом ещё в середине прошлого века, связывает время наведения на цель с двумя величинами: расстоянием до неё и её размером. Чем дальше цель и чем она мельче, тем дольше движение — и зависимость не линейная, а логарифмическая. Удвоение расстояния не удваивает время; уменьшение кнопки вдвое добавляет примерно столько же, сколько удвоение дистанции.
Что из этого следует практически
Для накрутки важны три следствия. Первое: время движения нельзя задавать константой — оно обязано меняться от клика к клику в зависимости от геометрии конкретной страницы. Второе: время нельзя брать и случайным из фиксированного диапазона, потому что связь с расстоянием и размером цели проверяема. Третье: крупная кнопка у края экрана наводится заметно быстрее мелкой ссылки в середине текста, и если у вас на всё уходит одинаковое время, это видно на выборке кликов.
Почему это трудно подделать наугад
Отдельно взятое время наведения ничего не доказывает: человек может замешкаться, отвлечься, промахнуться. Но когда таких измерений сотни, строится зависимость, и у живой аудитории она имеет характерную форму. У фермы, где длительность движения берётся из генератора случайных чисел, зависимость отсутствует вовсе: время не связано ни с расстоянием, ни с размером цели. Это отсутствие связи ловится проще, чем любое конкретное «неправильное» значение.
Из чего складывается движение живой руки
Баллистическая фаза
Начало движения — быстрый бросок в направлении цели. Он выполняется почти без зрительного контроля: мозг заранее рассчитывает импульс и отпускает руку. Скорость нарастает быстро, достигает пика примерно в первой трети пути и затем начинает падать. Траектория этой фазы почти никогда не прямая: рука вращается в плечевом и локтевом суставах, поэтому путь получается дугообразным, с заметной кривизной.
Фаза коррекции
Ближе к цели включается зрительная обратная связь, и движение распадается на серию мелких подстроек. Скорость резко падает, появляются короткие остановки, иногда откаты назад. Чем мельче цель, тем больше таких подстроек и тем дольше эта фаза. Именно она даёт характерный профиль скорости: резкий подъём, длинный спад, хвост из мелких шевелений у самой кнопки.
Промахи и подводка
Человек регулярно перелетает цель и возвращается к ней. Иногда курсор заходит на кнопку, съезжает с неё и заходит снова. Иногда перед кликом он стоит на элементе неподвижно доли секунды. Эти «ошибки» — не шум, а неотъемлемая часть нормального поведения, и их отсутствие делает движение слишком чистым.
Микродрожь и субпиксельность
Даже когда рука стоит на месте, курсор слегка дрожит: мышца не умеет держать абсолютный ноль. На современных устройствах координаты указателя приходят с дробной частью, а не только целыми пикселями. Сценарий, который всегда выдаёт ровные целые значения и абсолютную неподвижность в паузах, отличается от живого ввода на уровне сырых данных, ещё до всякого анализа геометрии.
Таблица: что страница снимает с движения курсора
| Что измеряется | Как получается | Что выдаёт бота |
|---|---|---|
| Геометрия пути | последовательность координат событий | идеальная прямая или ломаная из отрезков |
| Профиль скорости | расстояние между точками, делённое на интервал | постоянная скорость без разгона и торможения |
| Ускорение и рывок | вторая и третья производные пути | мгновенные скачки, недостижимые для руки |
| Время до цели | от старта движения до клика | не зависит от расстояния и размера кнопки |
| Частота событий | интервалы между сообщениями о движении | идеально равные промежутки |
| Поведение у цели | плотность точек в зоне кнопки | нет замедления, промахов и подстройки |
Обратите внимание на третью строку. Производные пути — самый неприятный для эмуляции показатель, потому что они усиливают мелкие огрехи. Небольшой скачок координат, почти незаметный на картинке траектории, превращается в гигантский выброс ускорения, который не может дать ни одна физическая рука.
Чем себя выдают типовые реализации
Телепорт координат
Самый грубый вариант: сценарий просто выставляет курсор в точку клика и нажимает. На странице это выглядит как отсутствие промежуточных событий движения вообще. Клик без предшествующей траектории — сигнал такого уровня, что дальше можно не разбираться. То же самое относится к программному вызову клика по элементу без участия указателя: событие приходит, а пути к нему нет.
Прямая с постоянной скоростью
Вторая ступень зрелости: сценарий интерполирует путь между текущей точкой и целью равномерными шагами. Картинка появляется, но она идеальна: абсолютно прямой отрезок, одинаковые расстояния между точками, нулевое ускорение на всём пути и резкая остановка в конце. Человеческая рука так не умеет — ей нужно разогнаться и затормозить.
Кривая без физики
Более зрелая реализация рисует дугу по кривой Безье и получает красивый изогнутый путь. Проблема в том, что кривая задаёт форму, но не задаёт динамику: если точки по ней расставлены равномерно, скорость снова постоянна, просто вдоль дуги. Плюс к этому у многих генераторов кривизна всегда в одну сторону и одной и той же силы, что создаёт узнаваемый почерк.
Ровная частота событий
Отдельная беда — тайминг. Реальный ввод приходит с частотой опроса устройства, которая плавает и зависит от загрузки системы; интервалы между событиями неравномерны. Сценарий, шлющий движение строго каждые шестнадцать миллисекунд, даёт распределение интервалов в виде одного узкого пика. Это ловится без всякой геометрии, простой гистограммой.
Рандомизация координат добавляет шум в путь, но не добавляет в него физику. Дрожащая прямая с постоянной скоростью остаётся прямой с постоянной скоростью — просто грязной. Проверяют не гладкость, а наличие разгона, торможения и коррекции у цели.
Почему простой шум не работает
Распространённое заблуждение — считать, что достаточно подмешать случайное отклонение к каждой координате. Смещение точек поперёк пути делает линию неровной, но профиль скорости остаётся плоским, ускорение остаётся нулевым в среднем и скачущим в мелочах, а время до цели по-прежнему не связано с геометрией. Хуже того, некоррелированный шум по точкам создаёт неестественно высокочастотную дрожь: у живой руки отклонения плавные, они накапливаются и рассасываются, а не прыгают от точки к точке. Именно поэтому анализ производных отличает «зашумлённого бота» от человека даже легче, чем чистого.
Таблица: живая траектория против ботовой
| Характеристика | Живая рука | Типовой сценарий |
|---|---|---|
| Форма пути | дуга с переменной кривизной | прямая или дуга одной формы |
| Скорость | разгон, пик в первой трети, длинный спад | постоянная или ступенчатая |
| Подход к цели | серия мелких подстроек, паузы | остановка в точке без подстройки |
| Промахи | регулярны, с возвратом на цель | отсутствуют |
| Связь времени с дистанцией | устойчивая, логарифмическая | отсутствует |
| Интервалы между событиями | плавающие, с редкими провалами | одно фиксированное значение |
Как построить траекторию, которая проходит проверку
Двухфазная модель вместо одной кривой
Работающая схема разделяет движение на те же две фазы, что и у человека. Первая — быстрый бросок в район цели с выраженным разгоном и торможением, который намеренно не попадает точно в кнопку, а приходит в её окрестность. Вторая — одна или несколько коротких коррекций, каждая со своим маленьким разгоном и торможением, пока курсор не окажется внутри элемента. Число коррекций растёт для мелких целей и падает для крупных, ровно как предсказывает закон Фиттса.
Время берётся из геометрии, а не из генератора
Длительность движения считается по расстоянию до цели и её размеру, а уже к полученному значению добавляется индивидуальный разброс. Тогда на выборке кликов возникает правильная зависимость: дальние и мелкие цели наводятся дольше, близкие и крупные — быстрее. Разброс делает отдельные измерения непредсказуемыми, но не разрушает закономерность.
Кривизна должна быть разной
Направление и величина изгиба пути меняются от движения к движению. Полезно связывать их с направлением: движение вправо и вниз у правши даёт иную дугу, чем движение влево вверх. Профилю имеет смысл назначить ведущую руку и придерживаться её весь цикл работы, чтобы почерк был стабильным, но отличался от соседних профилей.
Шум — в динамику, а не в координаты
Вместо подмешивания случайных смещений к точкам правильнее вносить возмущения в параметры движения: в силу первоначального импульса, в момент начала торможения, в точку промаха, в число коррекций, в длительность паузы перед кликом. Тогда путь остаётся физичным, а вариативность появляется на уровне, который и меняется у живого человека.
Нерегулярный тайминг событий
Интервалы между событиями движения должны плавать, иногда с провалами — например, когда система занята. Полезно изредка пропускать кадры и выдавать чуть большее смещение за раз: так ведёт себя реальный ввод под нагрузкой. Равномерная сетка интервалов — самостоятельный маркер, независимый от геометрии.
Согласованность с заявленным устройством
У ноутбучного тачпада другой профиль движения, чем у мыши: короче броски, больше коррекций, характерные остановки при перехвате пальца. У сенсорного экрана указателя нет вовсе, и профиль, заявляющий телефон, но щедро генерирующий движения мыши, противоречит сам себе. Это тот же класс ошибок, что и рассинхрон отпечатков, о котором шла речь в разборе признаков автоматизации.
Движение вне кликов
Человек двигает курсор не только к целям. Он отводит его в сторону от текста при чтении, ставит на край экрана, бесцельно шевелит во время паузы, иногда обводит им строку. Сценарий, у которого курсор существует только на пути от кнопки к кнопке, легко отличим: между действиями у него мёртвая зона без единого события.
Чек-лист самопроверки
- Запишите сырой поток событий движения одного своего визита и постройте профиль скорости по времени. Плоская линия означает отсутствие физики.
- Посчитайте ускорение между соседними точками и найдите выбросы. Мгновенные скачки — прямой признак интерполяции.
- Постройте гистограмму интервалов между событиями. Один узкий пик означает жёсткий таймер.
- Соберите по сотне кликов пары «расстояние до цели плюс размер цели» и «время движения». Отсутствие зависимости — главная дыра.
- Проверьте зону вокруг цели: должны быть сгущение точек, замедление и хотя бы иногда промах с возвратом.
- Убедитесь, что между действиями курсор не стоит мёртво всю паузу.
- Сравните почерк разных профилей: кривизна, скорость и число коррекций не должны совпадать у всей фермы.
Разбор кейса: красивые дуги, которые не помогли
Проект переехал с примитивного сценария, который телепортировал курсор, на генератор траекторий по кривым Безье. Визуально стало не отличить от человека: плавные дуги, аккуратный подход к кнопке, никаких скачков. Ожидание было, что качество трафика вырастет. Оно не выросло, а доля сессий, не дававших эффекта, осталась прежней.
При разборе сырых данных обнаружились три вещи. Точки по кривой расставлялись равномерно, поэтому скорость была постоянной вдоль всей дуги — разгон и торможение отсутствовали как явление. Интервалы между событиями были фиксированными. И главное: время движения задавалось случайным числом из узкого диапазона, никак не связанным с расстоянием и размером цели, поэтому переход к крупной кнопке в шапке и к мелкой ссылке в футере занимал одинаковое время.
Переписали модель: движение разложили на бросок с недолётом и последующие коррекции, длительность стали считать от геометрии с индивидуальным разбросом, добавили редкие промахи с возвратом, паузу перед кликом и плавающие интервалы событий. Внешне траектории стали менее красивыми — кривоватыми, с дёрганьем у цели. Зато на записях поведение перестало читаться как машинное, а качество трафика выровнялось. Вывод, который стоит запомнить: красота траектории и её правдоподобие — разные вещи, и антифрод смотрит на второе.
Частые ошибки
- Клик без траектории. Программный вызов клика или телепорт координат не оставляет пути к цели, и это видно сразу.
- Постоянная скорость. Равномерное движение по прямой или по дуге одинаково нефизично: у руки обязаны быть разгон и торможение.
- Шум вместо динамики. Случайные смещения координат делают путь грязным, но не добавляют ни ускорения, ни коррекции у цели.
- Время движения из генератора. Отсутствие связи длительности с расстоянием и размером кнопки вскрывается на выборке кликов.
- Курсор только между кнопками. Мёртвые паузы без единого события движения не встречаются у живого пользователя.
Частые вопросы
Нужно ли имитировать промахи специально? Да, но в меру. Промах с возвратом на цель — нормальная часть человеческого наведения, особенно на мелкие элементы. Разумно делать его вероятностным и чаще для маленьких ссылок, реже для крупных кнопок. Сто процентов идеальных попаданий — такая же аномалия, как сто процентов активных вкладок.
Насколько это вообще заметно по сравнению с отпечатками? Отпечатки отвечают на вопрос «кто пришёл», траектории — на вопрос «человек ли это». Эти сигналы независимы и складываются. Профиль с безупречным отпечатком и машинным движением попадает в подозрение так же, как и наоборот, и следы этого хорошо видны в записях Вебвизора.
Как быть с мобильными профилями? На сенсорном экране мыши нет, и генерировать её движения нельзя. Там своя биометрия: площадь касания, давление, траектория пальца при скролле, характерная инерция. Смешивать десктопную и мобильную модель ввода недопустимо — получается устройство, которого не существует.
Решают ли проблему реальные устройства? В значительной мере да: живая рука на настоящем телефоне или мыши даёт правильную физику без всякой модели. Это один из аргументов в пользу схемы с реальными устройствами под ключевые задачи и качественной эмуляцией на объём.
Вывод
Движение курсора — не декорация к клику, а отдельный поток биометрических данных, который снимается без разрешений и анализируется по производным пути: скорости, ускорению, рывку, плотности точек у цели и зависимости времени наведения от расстояния и размера кнопки. Человеческая рука подчиняется физике и закону Фиттса: она идёт по дуге, разгоняется, тормозит, промахивается и подстраивается, а время наведения растёт логарифмически с дистанцией и падает с размером цели. Бот, который телепортирует курсор, ведёт его по прямой с постоянной скоростью или рисует идеально ровную дугу с фиксированным таймингом, нарушает эту физику целиком, и никакая рандомизация координат этого не лечит — она делает путь грязным, но не физичным. Работающая модель разделяет бросок и коррекцию, берёт длительность из геометрии, вносит вариативность в параметры движения, а не в точки, даёт плавающие интервалы событий, редкие промахи, паузы, бесцельные шевеления между действиями и уважает тип заявленного устройства.
Больше о поведенческом продвижении и других услугах — на главной странице ProfSEO24.
Закажите накрутку ПФ в ProfSEO24
Выводим сайты в ТОП-1 Яндекса за счёт поведенческих факторов на базе ИИ — без риска фильтров. Более 300 сайтов в ТОП-1, первые сдвиги по позициям за 3 дня. Рассчитаем стоимость под вашу нишу и регион.
Заказать накрутку ПФ Написать в TelegramКомментарии
Андрей Полетаев
Мы полгода назад перешли с телепорта на кривые Безье и были очень собой довольны. Оказалось, точки по кривой расставлены равномерно, то есть скорость постоянная. Красивая дуга без единого признака физики.
Admin
Типовая ловушка: кривая задаёт форму, а не динамику. Чинится малой кровью — оставьте свою кривую, но расставляйте по ней точки не равномерно, а по профилю скорости с разгоном и длинным спадом. Дальше добавьте недолёт и одну-две коррекции в конце. Геометрию переписывать не придётся, меняется только распределение точек во времени.
Ксения Домрачева
Мысль про связь времени наведения с размером кнопки — самая неочевидная в тексте. У нас на любое действие уходило одинаковое время, от логотипа в шапке до мелкой ссылки внизу. Даже в голову не приходило, что это проверяемо.
mouse_trap
Гистограмма интервалов между событиями движения — самая быстрая диагностика из всех. У меня там был идеальный столбик. Ни одного человека с таким распределением в природе не существует.
Валерий Ищенко
А если просто добавить случайное отклонение к каждой точке пути? Линия станет неровной, будет похоже на дрожь руки.
Admin
Станет хуже, а не лучше. Независимый шум по точкам даёт высокочастотную дрожь, которой у руки не бывает: живые отклонения плавные, они накапливаются и рассасываются за десятки миллисекунд. А поскольку ускорение — вторая производная пути, каждый такой скачок превращается в огромный выброс, физически недостижимый. Вносите вариативность в параметры движения: силу импульса, момент торможения, точку недолёта, число коррекций.
Инна Сазонова
Про мёртвую зону между действиями очень точно. У нас курсор существовал только на отрезках от кнопки к кнопке, а всё остальное время просто не двигался вообще. Человек так не сидит.
qa_avtomat
Из мира тестирования скажу: программный клик по элементу вообще не порождает пути. Мы этим пользуемся для скорости прогонов, а в накрутке это приговор. Разные задачи, одинаковый инструмент.
Григорий Мещеряков
Сколько коррекций у цели считать нормой? Боюсь переборщить и получить дёрганье на пустом месте.
Admin
Привязывайте не к абсолютному числу, а к сложности задачи. На крупную кнопку человек чаще всего попадает броском сразу либо с одной короткой подстройкой. На мелкую ссылку внутри текста подстроек больше, и они длиннее. Сделайте число коррекций функцией от размера цели с вероятностным разбросом — и проблема переборщить решится сама, потому что на больших элементах модель их почти не будет порождать.
Артур Бегишев
Закрепить за профилем ведущую руку и держать её весь цикл — здорово. Получается устойчивый почерк, который при этом у каждого свой. Забрал идею.
Эдуард Пономаренко
Тачпад и мышь дают разный профиль движения — вот об этом вообще нигде не пишут. А ведь у ноутбучного профиля должны быть короткие броски и перехваты пальца.
Жанна Вилкова
Вопрос от практика: а на мобильных профилях что делать? Мы там на всякий случай тоже генерируем движения мыши, вдруг проверят.
Admin
Наоборот, это вредит. У сенсорного экрана указателя нет, и щедрый поток движений мыши на профиле, заявляющем телефон, — противоречие того же класса, что мобильный отпечаток с десктопным разрешением экрана. На мобильных нужна своя биометрия: площадь и форма касания, инерция прокрутки, характерная кривая пальца при свайпе, паузы между касаниями. Уберите мышь оттуда полностью.
Богдан Крылов
Фраза про то, что красота траектории и правдоподобие — разные вещи, стоит всей статьи. Мы гнались за гладкостью, а надо было гнаться за физикой.
Степан Ларин
Стоит ли добавлять паузу перед кликом, когда курсор уже на элементе? Или это лишняя деталь, которая только замедлит прогон?
Admin
Стоит, и это дешёвая деталь. Человек почти всегда замирает на цели перед нажатием: доли секунды на подтверждение, что попал туда, куда хотел. Плюс у него между наведением и кликом иногда проходит заметно больше времени — отвлёкся, перечитал текст ссылки. Сделайте паузу случайной величиной с длинным хвостом, а не константой, иначе получите ровный признак вместо естественного.
Вячеслав Огнев
Проверил ускорения по своим записям — нашёл выбросы в местах, где сценарий менял целевую точку на лету. Путь визуально гладкий, а в производной разрыв. Спасибо за метод.
hand_made_seo
С ProfSEO24 работаю не первый месяц, и главное отличие от прочих — здесь объясняют, почему что-то не работает, а не уговаривают докупить объём. После разбора траекторий переписал свой генератор и наконец понимаю, что именно он делает.