feature!: добавлен механизм обхода антибот защиты
This commit is contained in:
1 parent
f5871710ab
commit
1d2fdeae70
17 files changed
+735
-16
No files matched your search
@@ -0,0 +1,62 @@
|
||||
"""
|
||||
человекоподобные движения мыши (безье+ускорение), тайминги кликов
|
||||
|
||||
Camoufox — это форк Firefox, заточенный под антидетект-автоматизацию (спуфинг fingerprint'а, WebGL, canvas,
|
||||
шрифтов и т.д.), с Python-обёрткой поверх Playwright-протокола (Juggler).
|
||||
|
||||
У него есть параметр humanize при запуске:
|
||||
|
||||
```
|
||||
from camoufox.sync_api import Camoufox
|
||||
|
||||
with Camoufox(humanize=True) as browser:
|
||||
...
|
||||
```
|
||||
|
||||
Или с указанием максимального времени на движение:
|
||||
|
||||
```
|
||||
Camoufox(humanize=1.5) # курсор доберётся до цели не более чем за 1.5 сек
|
||||
```
|
||||
|
||||
Когда humanize включён, при вызовах вроде page.click() / locator.click() библиотека:
|
||||
|
||||
- строит траекторию курсора от текущей позиции до цели не по прямой, а по кривой (используется подход,
|
||||
похожий на ghost-cursor — Безье-путь с шумом),
|
||||
- разбивает движение на промежуточные точки с нелинейной скоростью (ускорение/замедление к цели, как у реальной руки),
|
||||
- добавляет небольшую случайную задержку перед самим кликом.
|
||||
|
||||
Это реализовано на уровне их собственного форка драйвера, а не через голый Playwright API — обычный Playwright (
|
||||
page.click()) телепортирует курсор мгновенно и такого не делает.
|
||||
"""
|
||||
import random
|
||||
import string
|
||||
|
||||
from playwright.async_api import Page
|
||||
|
||||
|
||||
async def typing(page: Page, locator: str, text: str):
|
||||
element = page.locator(locator)
|
||||
|
||||
await element.scroll_into_view_if_needed()
|
||||
assert await element.is_visible()
|
||||
assert await element.is_enabled()
|
||||
assert await element.is_editable()
|
||||
await element.focus()
|
||||
await element.click()
|
||||
|
||||
for char in text:
|
||||
await page.keyboard.press(char)
|
||||
|
||||
if char in string.ascii_lowercase:
|
||||
delays = (50, 100)
|
||||
elif char in string.ascii_uppercase:
|
||||
delays = (100, 150)
|
||||
elif char in string.digits:
|
||||
delays = (100, 150)
|
||||
elif char in string.punctuation:
|
||||
delays = (100, 200)
|
||||
else:
|
||||
raise SystemError("character not supported: {}".format(char))
|
||||
|
||||
await page.wait_for_timeout(random.uniform(*delays))
|
||||
Reference in new issue
Block a user