- Регистрация
- 16.12.2020
- Сообщения
- 1 442
- Благодарностей
- 70
- Баллы
- 48
Я попробовал на базовых действиях, с помощью css селекторов и xpath, были срабатывания через раз, было игнорирование кликов.
В качестве рабочего решения нормально себя показал js path на javascript.
js path берём из devtools:
,
что позволило нормально отработать с shadow root (opened) и клики срабатывали более стабильно.
мы берём js path и с помощью фри версии gemini просим создать клик на кнопке, иногда просто click() не срабатывает и нужен ещё и фокус, но всё равно, в итоге клик удаётся реализовать и клик принимает редит
тема подсмотрена мной на ютубе, кому интересно можете поискать по shadow root или shadow dom.
в результате того, что реддит постоянно меняет вёрстку, приходится js path обновлять и это привело к тому, что об ошибке я настроил уведомления в телеграмм бота со скриншотами
Выводы:
добавить js path в конструктор действий и контекстное меню(правой кнопкой мыши) в зеннопостер
добавить вывод оповещений, не в tg или другие сервисы, а внутри зенно, сейчас лог очень общий и туда сыпется всё подряд, сделать отдельную вкладку для важных оповещений
добавить вывод события isTrusted: true, которое только для чтения, в PM для отслеживания кликов и других действий, я так понял, что результат по этому событию отдаёт браузер и его можно получить и вывести в информер
Иллюзия «Closed» режима и как его взломать
Мы говорили, что Shadow DOM бывает open (доступен через .shadowRoot) и closed (возвращает null). Многие разработчики думают, что closed — это надежная защита от парсинга. Это не так.
твой скрипт запускается до того, как сайт создал свои компоненты (на этапе document-start), ты можешь перехватить создание теневых деревьев:
// Перехватываем нативный метод 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-х координат и клик мышью с полной эмуляцией, распределение равномерное
но, в рамках соблюдения анонимности, я не рекомендую дёргать js path или xpath каждый раз при поиске координат кнопок, а рекомендую 1 раз собрать и хранить координаты в txt файле.
прикрепляю шаблон с получением isTrusted - true с кликом по координатам
очередное обновление:
мои разрешения экранов
1903x937
1903x850
1519x820
1349x650
1349x700
и тд
xml, который я сохраняю в файл, для каждого размера экрана браузера:
файл храню на сервере и подгружаю для каждого запуска
В качестве рабочего решения нормально себя показал js path на javascript.
js path берём из devtools:
что позволило нормально отработать с shadow root (opened) и клики срабатывали более стабильно.
мы берём js path и с помощью фри версии gemini просим создать клик на кнопке, иногда просто click() не срабатывает и нужен ещё и фокус, но всё равно, в итоге клик удаётся реализовать и клик принимает редит
тема подсмотрена мной на ютубе, кому интересно можете поискать по shadow root или shadow dom.
в результате того, что реддит постоянно меняет вёрстку, приходится js path обновлять и это привело к тому, что об ошибке я настроил уведомления в телеграмм бота со скриншотами
Выводы:
добавить js path в конструктор действий и контекстное меню(правой кнопкой мыши) в зеннопостер
добавить вывод оповещений, не в tg или другие сервисы, а внутри зенно, сейчас лог очень общий и туда сыпется всё подряд, сделать отдельную вкладку для важных оповещений
добавить вывод события isTrusted: true, которое только для чтения, в PM для отслеживания кликов и других действий, я так понял, что результат по этому событию отдаёт браузер и его можно получить и вывести в информер
Иллюзия «Closed» режима и как его взломать
Мы говорили, что Shadow DOM бывает open (доступен через .shadowRoot) и closed (возвращает null). Многие разработчики думают, что closed — это надежная защита от парсинга. Это не так.
твой скрипт запускается до того, как сайт создал свои компоненты (на этапе document-start), ты можешь перехватить создание теневых деревьев:
// Перехватываем нативный метод 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-х координат и клик мышью с полной эмуляцией, распределение равномерное
но, в рамках соблюдения анонимности, я не рекомендую дёргать 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>
Вложения
-
11,1 КБ Просмотры: 6
-
16,3 КБ Просмотры: 3
Последнее редактирование:



