Клики с помощью JS path на JavaScript, как получить isTrusted:true действиями Zennoposter. v1.10

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Я попробовал на базовых действиях, с помощью css селекторов и xpath, были срабатывания через раз, было игнорирование кликов.

В качестве рабочего решения нормально себя показал js path на javascript.

js path берём из devtools:
141193
,
что позволило нормально отработать с shadow root (opened) и клики срабатывали более стабильно.

мы берём js path и с помощью фри версии gemini просим создать клик на кнопке, иногда просто click() не срабатывает и нужен ещё и фокус, но всё равно, в итоге клик удаётся реализовать и клик принимает сайт

тема подсмотрена мной на ютубе, кому интересно можете поискать по shadow root или shadow dom.

в результате того, что сайты постоянно меняют вёрстку, приходится js path обновлять и это привело к тому, что об ошибке я настроил уведомления в телеграмм бота со скриншотами



Выводы:
  • добавить js path в конструктор действий и контекстное меню(правой кнопкой мыши) в зеннопостер
  • добавить вывод оповещений, не в tg или другие сервисы, а внутри зенно, сейчас лог очень общий и туда сыпется всё подряд, сделать отдельную вкладку для важных оповещений
  • добавить вывод события isTrusted: true, которое только для чтения, в PM для отслеживания кликов и других действий, я так понял, что результат по этому событию отдаёт браузер и его можно получить и вывести в информер
  • https://zenno.club/discussion/threads/kliki-s-pomoschju-js-path-na-javascript-kak-poluchit-istrusted-true-dejstvijami-zennoposter.132374/post-877090 предложение по развитию интерфейса

Иллюзия «Closed» режима и как его взломать
Мы говорили, что Shadow DOM бывает open (доступен через .shadowRoot) и closed (возвращает null). Многие разработчики думают, что closed — это надежная защита от парсинга. Это не так.

твой скрипт запускается до того, как сайт создал свои компоненты (на этапе document-start), ты можешь перехватить создание теневых деревьев:

Как обойти Closed режим Shadow Root:
// Перехватываем нативный метод attachShadow
const originalAttachShadow = Element.prototype.attachShadow;
Element.prototype.attachShadow = function(options) {
    // Принудительно делаем ВСЕ закрытые деревья открытыми
    if (options.mode === 'closed') {
        options.mode = 'open';
    }
    return originalAttachShadow.call(this, options);
};

клик на с# по js path срабатывает для instance.ActiveTab.MainDocument.EvaluateScript("document.querySelector('...').click();");

клик, который отдаёт isTrusted true instance.ActiveTab.FullEmulationMouseClick("left", "click"); по координатам:

прикрепляю шаблон 7.8.15 с 3 действиями - поиск координат по js path, split по разделителю для получения 4-х координат и клик мышью с полной эмуляцией, распределение равномерное
141365


но, в рамках соблюдения анонимности, я не рекомендую дёргать js path или xpath каждый раз при поиске координат кнопок, а рекомендую 1 раз собрать и хранить координаты в txt файле.

прикрепляю шаблон с получением isTrusted - true с кликом по координатам

очередное обновление:
мои разрешения экранов для кликов по координатам

1903x937
1903x850
1519x820
1349x650
1349x700
и тд

xml, который я сохраняю в файл, для каждого размера экрана браузера:

xml для координат кликов по кнопкам:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <objectName>{-Variable.displayx-}</objectName>
  <display{-Variable.displayx-}>
    <Avatar name="Avatar">
      <coords x1="{-Variable.x1-}" y1="{-Variable.y1-}" x2="{-Variable.x2-}" y2="{-Variable.y2-}" />
    </Avatar>
    <usermenu name="usermenu">
      <coords x1="{-Variable.x1usermenu-}" y1="{-Variable.y1usermenu-}" x2="{-Variable.x2usermenu-}" y2="{-Variable.y2usermenu-}" />
    </usermenu>
        <downloadbanner name="downloadbanner">
      <coords x1="{-Variable.x1downloadbanner-}" y1="{-Variable.y1downloadbanner-}" x2="{-Variable.x2downloadbanner-}" y2="{-Variable.y2downloadbanner-}" />
    </downloadbanner>
        <upload name="upload">
      <coords x1="{-Variable.x1upload-}" y1="{-Variable.y1upload-}" x2="{-Variable.x2upload-}" y2="{-Variable.y2upload-}" />
    </upload>
        <savebanner name="savebanner">
      <coords x1="{-Variable.x1savebanner-}" y1="{-Variable.y1savebanner-}" x2="{-Variable.x2savebanner-}" y2="{-Variable.y2savebanner-}" />
    </savebanner>
  </display{-Variable.displayx-}>
</root>
файл храню на сервере и подгружаю для каждого запуска

Помощь с JS path и сайтами закрытыми с помощью Shadow Dom - бесплатно!
 

Вложения

Последнее редактирование:

kagorec

Client
Регистрация
24.08.2013
Сообщения
1 137
Благодарностей
647
Баллы
113
Хороший конкурс и статьи забавные
 

smartmail

Client
Регистрация
18.04.2015
Сообщения
471
Благодарностей
246
Баллы
43
Последнее редактирование модератором:
  • Спасибо
Реакции: kagorec и seodamage

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
пишите по теме конкурсной работы в комментариях, все остальные комментарии перенесите в другие разделы и пишите изначально там
@smartmail @kagorec
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Друзья!
в рамках конкурса я готов помочь вам с js path и кодом для эмуляции кликов по вашим элементам, пишите заявки в этой теме, будем обсуждать и искать решение!
 
  • Спасибо
Реакции: Sergodjan

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
было обновление, где я добавил про поиск координат, сплит и клик по кнопке, будут ещё обновления, ждите и заходите проверяйте обновления!
 
Последнее редактирование:

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
новое обновление.
пример, как получить isTrusted - true, если вы знаете другой способ, кроме как по координатам - пишите тут.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление.
у меня настроены разные разрешения экранов. поэтому координаты кликов меняются. Смотрите очередное обновление внизу статьи. какие разрешения экранов браузера используете вы - пишите тут, будем обсуждать.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление.
я готов ответить на ваши вопросы в рамках блока «Вопрос-ответ», самые лучшие вопросы будут вынесены в основную статью
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
разместить в шапке, где песочные часы, добавить к текущей записи дополнительных событий:
141397

т.е. создать 4 новых кнопки для:
1. уже есть - css селектор, разделить, сделать отдельно от xpath
2. добавить клики по xpath - есть, но надо переключать внутри действия и будет собираться и css селектор и xpath сразу, а нужно что-то одно, т.е. разделить, чтобы не было 2 обращения к сайту, когда достаточно одного обращения
3. добавить клики по js path
4. добавить клики по координатам, с заданием площадей, скрин добавляю, для равномерных кликов
141395

5. добавить клики по картинкам
141396

любое обращение к css селектору, xpath, js path может логироваться для отслеживания ботов
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление.
Разберём ситуацию по выявлению причин и обновлению проекта:
1. результаты по проекту совсем пропали;
2. мы начинаем проверять сайт, с которым работаем;
3. в результате находим, что появился блок на сайте, который логирует количество обращений к xpath, js path или css селекторам или isTrusted;
4. переводим проект на клики по координатам или по клики по картинкам, предварительно проверив эффективность руками в 2-3 или более прогонов;
5. проект заработал и снова приносит результат.

всегда начинай проверку с ручного метода, а только потом переноси в автоматизацию на zennoposter. это может тебе сэкономить много времени.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
как я себе вижу информер isTrusted:
  • true;
  • false;
  • клик не определяется isTrusted.
141408
и так для всех действий, где есть клик или input или другое действие, определяемое isTrusted
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление от ИИ
В современных браузерах (особенно в Safari и Chrome на экранах с высокой плотностью пикселей) события PointerEvent и TouchEvent могут содержать дробные значения координат (например, clientX: 100.5). В то же время старые методы эмуляции часто оперируют только целыми числами. Использование исключительно целых координат на устройствах, которые по своему отпечатку (fingerprint) должны поддерживать дробную точность, является статистической аномалией, используемой для детекции ботов.
у нас при клике по координатам нет десятичных, сотых и тд, есть предложение добавить в возможности
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление.
задача на обсуждение для антифрода.
ситуация-кейс:
  • нужно отследить ботов на сайте;
  • на сайте не использовали js path, xpath, css селекторы при разработке;
  • настраиваем логи на js path, xpath, css селекторы;
  • в случае использования посетителем js path, xpath или css селекторов получаем триггер об этом;
  • очень большая вероятность, что те посетители, которые используют js path, xpath, css селекторы на сайте, который в разработке не использует js path, xpath, css селекторы - боты;
  • выводим таким посетителям страницу-заглушку с капчами и уведомлениями о том, что они боты и могут уйти на другой сайт;
результат - получаем на основании логирования js path, xpath, css селекторы чуть более чистую, от ботов, аудиторию, которую можно более качественно обрабатывать в дальнейших наработках.

P.S. эта ситуация описана как одна из возможных, но не единственное решение, т.е. я не рекомендую отключать все остальные системы антифрода и оставлять только логирование и триггеры описанные выше.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
поговорим про "шум"
задача-кейс:
  • нужно выполнить клик;
  • мы сначала подводим мышку;
  • ждём пока выплывет title или alt или по другому описание во всплывающем окне;
  • дрожим мышкой;
  • делаем, так называемые
    • рывки,
    • плавные замедления
    • микро-промахи (overshoot)
    • корректировки
    • фокус
  • только потом кликаем на кнопке, картинке или другом элементе;
эти все настройки дают human-like - человекоподобное поведение - "шум" - биохакинг движения мыши - биоэмуляцию поведения

аномалии при клике могут, но не исключая, триггернуть системы антифрода
а также повтор уникального поведения, о чём поговорим в следующих комментариях
 
Последнее редактирование:

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
пишите, что бы вам было интересно обсудить, из того, что я описал в теме статьи, в комментариях
тематики комментариев:
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Почему подмена isTrusted возможна, но не будет работать:
  • Свойство isTrusted в интерфейсе Event помечено как readonly;
  • JS-код не имеет прав доступа к изменению состояния этой инициализации.
 
Последнее редактирование:

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
фокус->действие
  • наведение мышки фокус - клик;
  • наведение мышки фокус - двойной клик;
  • наведение мышки фокус - уточнение наведения мышки со сдвигом - клик;
  • наведение мышки фокус - проверка, нет ли перекрывающего невидимого окна - клик;
  • наведение мышки фокус - проверка, нет ли перекрывающего невидимого окна - уточнение наведения мышки со сдвигом или несколькими сдвигами - клик;
к этому всему, можно ещё добавить ожидание, пока всплывёт title или alt или по другому методу описание во всплывающем окне.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление
Поговорим про ловушки ботов на сайтах.
Элементы на сайтах могут прятаться за:
  • opacity: 0;
  • display: none;
  • вывод за пределы видимости с помощью index;
  • Shadow DOM инкапсулирует элементы, делая их полностью недоступными для стандартных методов глобального поиска, таких как document.querySelector или document.getElementById;
  • другие методы.
Могут показываться в рандомное время.
Могут быть дубли, один основной элемент и много ловушек, которые расположены в коде раньше вашей с похожими тегами и атрибутами.
Всё это тригерит поведенческие аномалии.

Можно использовать как решения:
  • клик по координатам;
  • клик по картинке;
оба нужно тестировать, логировать и проверять наработки на большой выборке.

Друзья! Всем успешных выборок и топовых позиций при накрутке!

Берегитесь DOM-приманок (Honeypots)!!!
 
Последнее редактирование:

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
обновление.
Детектирование: Не был ли изменен document.querySelector.
  • Проверка: document.querySelector.toString() может вернуть function querySelector() { [native code] }. Если вы изменили метод, toString может выдать ваш код или измененную структуру, что является 100% сигналом для антибота.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
я не рекомендую дёргать js path
Логирование вызовов querySelector / querySelectorAll
Это самый эффективный метод, если вы хотите узнать, когда и какой JS path запрашивается. Вы перехватываете стандартный метод document.querySelector и внедряете туда свой логгер.

Логирование вызовов querySelector / querySelectorAll. Код для работы с сайтом со стороны посетителя:
(function() {
    const originalQuery = document.querySelector;

    document.querySelector = function(selector) {
        // Логируем обращение
        console.log(`[DOM Access] Selected: "${selector}"`);
     
        // Опционально: можно добавить фильтр, чтобы не засорять консоль
        // if (selector.includes('my-target-element')) { debugger; }

        return originalQuery.apply(this, arguments);
    };
})();
Нюанс для ZennoPoster: Вставляйте этот код в самом начале выполнения проекта. Поскольку ZennoPoster работает в рамках текущей сессии браузера, этот «хук» будет действовать до перезагрузки страницы или навигации.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Логирование взаимодействий с элементом (Proxy)
Если ваша задача — не просто узнать, что элемент был «найден», а отследить, что с ним делают (кликнули, изменили value, считали текст), используйте Proxy.

Вы можете обернуть результат поиска в прокси-объект, который будет записывать любое обращение к методам или свойствам элемента:

Логи для querySelector с помощью proxyElement:
function proxyElement(el) {
    return new Proxy(el, {
        get(target, prop) {
            const value = Reflect.get(target, prop);
            if (typeof value === 'function') {
                return function(...args) {
                    console.log(`[Interaction] Method: ${prop}, Element:`, target);
                    return value.apply(this, args);
                };
            }
            return value;
        },
        set(target, prop, value) {
            console.log(`[Interaction] Property set: ${prop} = ${value}`);
            return Reflect.set(target, prop, value);
        }
    });
}

// Пример использования:
const el = proxyElement(document.querySelector('.my-element'));
el.click(); // В консоли появится лог обращения
при необходимости, вы можете вынести результаты не в лог devtools, а в переменные zennoposter или с отдельный txt файл для дальнейшей обработки
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 365
Благодарностей
903
Баллы
113
при необходимости, вы можете вынести результаты не в лог devtools, а в переменные zennoposter или с отдельный txt файл для дальнейшей обработки
Ну так сразу и показывайте как это делать. Зачем нам лекции по основам JS? Нужно каждый пример адаптировать под использования в ZP
 
  • Спасибо
Реакции: FantomaSkaRus1 и prostors

ALLIN

Client
Регистрация
04.05.2024
Сообщения
143
Благодарностей
13
Баллы
18
и эта интересная тоже я в замешательстве)
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Ну так сразу и показывайте как это делать. Зачем нам лекции по основам JS? Нужно каждый пример адаптировать под использования в ZP
вывод в переменную массива history, а не в консоль devtools:
function createTrackedProxy(el) {
    const history = [];

    const proxy = new Proxy(el, {
        get(target, prop, receiver) {
            const value = Reflect.get(target, prop, receiver);

            if (typeof value === 'function') {
                return function(...args) {
                    history.push({
                        type: 'method_call',
                        name: prop,
                        args,
                        timestamp: Date.now()
                    });
                    return value.apply(target, args);
                };
            }
            return value;
        },
        set(target, prop, value, receiver) {
            history.push({
                type: 'property_set',
                prop,
                value,
                timestamp: Date.now()
            });
            return Reflect.set(target, prop, value, receiver);
        }
    });

    return { proxy, history };
}

// --- Пример использования ---
// const { proxy, history } = createTrackedProxy(document.querySelector('.my-element'));
// proxy.style.color = 'blue';
// proxy.click();
// console.log(history); // Вся информация здесь
код взят из ИИ
 
Последнее редактирование:
Регистрация
07.08.2019
Сообщения
92
Благодарностей
105
Баллы
43
вывод в переменную массива history, а не в консоль devtools:
function createTrackedProxy(el) {
    const history = [];

    const proxy = new Proxy(el, {
        get(target, prop, receiver) {
            const value = Reflect.get(target, prop, receiver);

            if (typeof value === 'function') {
                return function(...args) {
                    history.push({
                        type: 'method_call',
                        name: prop,
                        args,
                        timestamp: Date.now()
                    });
                    return value.apply(target, args);
                };
            }
            return value;
        },
        set(target, prop, value, receiver) {
            history.push({
                type: 'property_set',
                prop,
                value,
                timestamp: Date.now()
            });
            return Reflect.set(target, prop, value, receiver);
        }
    });

    return { proxy, history };
}

// --- Пример использования ---
// const { proxy, history } = createTrackedProxy(document.querySelector('.my-element'));
// proxy.style.color = 'blue';
// proxy.click();
// console.log(history); // Вся информация здесь
код взят из ИИ
Тестировался ли этот код в Zennoposter? Выводит ли он то, что должен выводить?
 
  • Спасибо
Реакции: prostors

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Тестировался ли этот код в Zennoposter? Выводит ли он то, что должен выводить?
если код тестировался, то я бы приложил шаблон с кодом, который у меня воспроизводится. пока что это на уровне - запрос в ИИ - ответ от ИИ

т.е. тестов и практических применений - нет.
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 365
Благодарностей
903
Баллы
113
  • Спасибо
Реакции: kagorec

prostors

Client
Регистрация
16.12.2020
Сообщения
1 469
Благодарностей
73
Баллы
48
Ясно. В общем вы устроили публичный тренинг по промтингу. Ну удачи))
следите за обновлениями, сейчас версия 1.9, возможно ещё будет материал в комментариях, с тестами наработок, полученных в результате промтинга ИИ
 

Alex.A

Client
Регистрация
14.11.2020
Сообщения
561
Благодарностей
319
Баллы
63
Проголосовал. Спасибо за статью!
 
  • Спасибо
Реакции: prostors

Кто просматривает тему: (Всего: 7, Пользователи: 5, Гости: 2)