Эмуляция поведения реального покупателя: скрипты, которые не палятся

Good Carder

Professional
Messages
1,014
Reaction score
692
Points
113
От кардера — кардерам. Ты настраиваешь OpenBullet 2, заливаешь карты, запускаешь — и через 5 минут все твои прокси сгорают, а BIN попадает в чёрный список. Почему? Потому что твой скрипт слишком идеален. Он заполняет форму за 2 секунды, кликает строго по центру кнопки и не делает ошибок. Для антифрода это кричащий сигнал: «Я бот». В этой статье я покажу, как заставить твой скрипт выглядеть как человек. Человек ошибается, колеблется, двигается криво. Твой скрипт должен делать то же самое.

Часть 1. Почему стандартные скрипты OpenBullet сгорают за 5 минут​

OpenBullet и SilverBullet — мощные инструменты, но их стандартные настройки созданы для скорости, а не для скрытности. Они отправляют запросы с идеальными интервалами, без задержек, с одинаковыми заголовками. Антифрод видит это за секунды.

1.1. Идеальные интервалы — смерть​

Стандартный конфиг OpenBullet отправляет запросы с фиксированной задержкой (например, 500 мс). Человек так не делает. Он может задуматься на 2 секунды, потом быстро заполнить поле, потом снова задуматься. Его ритм хаотичен.

Решение: добавь случайные задержки. В OpenBullet 2 есть параметр Random Delay. Установи его в диапазон 200–1500 мс. Но даже этого недостаточно — нужно менять задержки в зависимости от действия.

1.2. Идеальные движения мыши — красный флаг​

OpenBullet не эмулирует мышь. Он просто отправляет POST-запросы. Но если ты используешь браузерные решения (Playwright, Puppeteer), движения мыши по прямой линии — это мгновенный бан. Человек двигается по кривой, с ускорениями и замедлениями.

Решение: используй библиотеки ghost-cursor или @extra/humanize для эмуляции естественных движений.

1.3. Отсутствие ошибок — признак бота​

Человек никогда не вводит данные идеально с первого раза. Он может ошибиться в цифре, стереть её и ввести заново. Если твой скрипт заполняет форму без единой ошибки — это подозрительно.

Решение: добавь 1–2 ошибки на форму. Намеренно введи неправильный символ, потом удали его и введи правильный.

1.4. Одинаковые User-Agent и заголовки​

Если все запросы идут с одного User-Agent и одинаковым набором заголовков — это легко детектится.

Решение: используй ротацию User-Agent и подмену заголовков для каждого запроса.

Часть 2. Настройка задержек: человеческие паузы​

2.1. Базовые задержки​

ДействиеЧеловеческая задержкаБотовая задержка (палится)
Между символами50–150 мс0–10 мс
Между полями200–600 мс0–50 мс
Перед кликом200–500 мс0–50 мс
После загрузки страницы1000–3000 мс0–500 мс

2.2. Реализация в Python (Playwright)​

Python:
import random
import time
from playwright.sync_api import sync_playwright

def human_delay(min_ms=100, max_ms=500):
    time.sleep(random.randint(min_ms, max_ms) / 1000)

def human_type(page, selector, text):
    page.click(selector)
    human_delay(200, 600)
    for char in text:
        page.keyboard.type(char, delay=random.randint(50, 150))
        # Иногда делаем паузу внутри слова (человек думает)
        if random.random() < 0.05:
            human_delay(200, 800)

2.3. Варьирование скорости​

Не все поля заполняются с одинаковой скоростью. Имя и фамилию человек вводит быстро, адрес — медленнее, номер карты — с паузами между группами.
Python:
def type_card_number(page, card_number):
    groups = card_number.split(' ')
    for i, group in enumerate(groups):
        for char in group:
            page.keyboard.type(char, delay=random.randint(30, 80))
        if i < len(groups) - 1:
            human_delay(200, 600)  # пауза между группами

Часть 3. Эмуляция движений мыши​

3.1. Почему прямые линии палятся​

Антифрод-системы анализируют траекторию мыши. Если курсор движется по прямой линии из точки А в точку Б — это признак бота. Человек двигается по кривой Безье, с ускорением в начале и замедлением в конце.

3.2. Использование ghost-cursor (Puppeteer/Playwright)​

JavaScript:
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const ghostCursor = require('ghost-cursor');

puppeteer.use(StealthPlugin());

(async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();
    await page.goto('https://example.com/checkout');
    const cursor = ghostCursor.createCursor(page);

    // Движение к полю ввода
    const input = await page.$('#card-number');
    const box = await input.boundingBox();
    await cursor.moveTo({
        x: box.x + box.width / 2 + (Math.random() - 0.5) * 20,
        y: box.y + box.height / 2 + (Math.random() - 0.5) * 20
    });

    // Клик с hover-паузой
    await page.waitForTimeout(random.randint(200, 500));
    await cursor.click();

    await browser.close();
})();

3.3. Реализация кривой Безье на Python (без внешних библиотек)​

Python:
import math
import random
import pyautogui

def bezier_curve(p0, p1, p2, p3, t):
    """Расчёт точки на кривой Безье третьего порядка"""
    x = (1-t)**3 * p0[0] + 3*(1-t)**2*t * p1[0] + 3*(1-t)*t**2 * p2[0] + t**3 * p3[0]
    y = (1-t)**3 * p0[1] + 3*(1-t)**2*t * p1[1] + 3*(1-t)*t**2 * p2[1] + t**3 * p3[1]
    return (x, y)

def human_move(start, end, steps=50):
    # Генерация контрольных точек для кривой
    cp1_x = start[0] + (end[0] - start[0]) * 0.25 + random.randint(-30, 30)
    cp1_y = start[1] + (end[1] - start[1]) * 0.25 + random.randint(-30, 30)
    cp2_x = start[0] + (end[0] - start[0]) * 0.75 + random.randint(-30, 30)
    cp2_y = start[1] + (end[1] - start[1]) * 0.75 + random.randint(-30, 30)
    p0 = start
    p1 = (cp1_x, cp1_y)
    p2 = (cp2_x, cp2_y)
    p3 = end

    for i in range(steps + 1):
        t = i / steps
        point = bezier_curve(p0, p1, p2, p3, t)
        pyautogui.moveTo(point[0], point[1], duration=0.01)
        # Случайная задержка между точками
        time.sleep(random.uniform(0.005, 0.015))

3.4. Overshoot и микрокоррекции​

Человек часто «перелётывает» мимо цели и возвращается. Добавь это в скрипт.
Python:
# Перелёт
human_move(start, (end[0] + 20, end[1] + 20), steps=30)
# Возврат к цели
human_move((end[0] + 20, end[1] + 20), end, steps=20)

Часть 4. Эмуляция ошибок​

4.1. Зачем нужны ошибки​

Антифрод-системы анализируют не только то, что ты ввёл, но и как ты это делаешь. Если ты вводишь данные идеально с первого раза — это признак бота. Ошибки и их исправления — это человеческая черта.

4.2. Типы ошибок​

Тип ошибкиЧастотаПример
Опечатка в имени5–10%Ввёл Jhon вместо John
Опечатка в номере карты3–5%Ввёл 4242 4242 4242 4243 вместо 4242 4242 4242 4242
Опечатка в CVV2–4%Ввёл 123 вместо 321
Лишний символ5–8%Ввёл JOhn вместо John

4.3. Реализация ошибок в скрипте​

Python:
def type_with_errors(page, selector, text, error_rate=0.05):
    page.click(selector)
    human_delay(200, 600)
    for i, char in enumerate(text):
        # Иногда вводим неправильный символ
        if random.random() < error_rate:
            # Вводим случайный символ
            wrong_char = chr(random.randint(97, 122))
            page.keyboard.type(wrong_char, delay=random.randint(30, 80))
            human_delay(200, 500)  # пауза перед исправлением
            page.keyboard.press('Backspace')
            human_delay(100, 300)
        page.keyboard.type(char, delay=random.randint(30, 80))

4.4. Ошибки в выборе товара​

Человек может добавить товар, потом удалить, потом добавить другой. Имитируй это.
Python:
# Добавление товара
page.click('.add-to-cart')
human_delay(500, 1500)
# Пауза — человек думает
human_delay(2000, 5000)
# Удаление
page.click('.remove-from-cart')
human_delay(500, 1500)
# Добавление другого товара
page.click('.add-to-cart-alternative')

Часть 5. Реальные примеры скриптов на Python (Playwright)​

5.1. Полный скрипт для оформления заказа с человеческим поведением​

Python:
import random
import time
from playwright.sync_api import sync_playwright

def human_delay(min_ms=100, max_ms=500):
    time.sleep(random.randint(min_ms, max_ms) / 1000)

def human_move(page, start, end, steps=30):
    # ... реализация кривой Безье ...
    pass

def type_with_errors(page, selector, text, error_rate=0.05):
    page.click(selector)
    human_delay(200, 600)
    for char in text:
        if random.random() < error_rate:
            wrong_char = chr(random.randint(97, 122))
            page.keyboard.type(wrong_char, delay=random.randint(30, 80))
            human_delay(200, 500)
            page.keyboard.press('Backspace')
            human_delay(100, 300)
        page.keyboard.type(char, delay=random.randint(30, 80))

def main():
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=False,
            args=['--no-sandbox', '--disable-setuid-sandbox']
        )
        context = browser.new_context(
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/132.0.0.0 Safari/537.36'
        )
        page = context.new_page()

        # Шаг 1: Переход на сайт
        page.goto('https://example.com/checkout')
        human_delay(1000, 3000)

        # Шаг 2: Заполнение email (с ошибкой)
        type_with_errors(page, '#email', 'test@example.com', error_rate=0.03)
        human_delay(500, 1500)

        # Шаг 3: Заполнение номера карты (с ошибкой)
        type_with_errors(page, '#card-number', '4242424242424242', error_rate=0.02)
        human_delay(500, 1500)

        # Шаг 4: Заполнение срока
        type_with_errors(page, '#expiry', '1226', error_rate=0.02)
        human_delay(500, 1500)

        # Шаг 5: Заполнение CVV (с ошибкой)
        type_with_errors(page, '#cvv', '123', error_rate=0.04)
        human_delay(500, 1500)

        # Шаг 6: Клик по кнопке с задержкой и overshoot
        button = page.locator('#submit')
        box = button.bounding_box()
        target_x = box['x'] + box['width']/2
        target_y = box['y'] + box['height']/2
        # Перелёт
        human_move(page, (500, 300), (target_x + 30, target_y + 20), steps=25)
        human_delay(200, 400)
        # Возврат
        human_move(page, (target_x + 30, target_y + 20), (target_x, target_y), steps=20)
        human_delay(200, 500)
        page.click('#submit')

        browser.close()

if __name__ == '__main__':
    main()

5.2. Интеграция с OpenBullet (через API, а не браузер)​

Если ты используешь OpenBullet 2, ты не можешь эмулировать мышь. Но ты можешь эмулировать задержки и ошибки на уровне запросов, используя переменные и функции внутри конфига.

Пример LoliScript с задержками и вариативностью:
Code:
SET card_number = {WORD}
SET delay_random = {RANDOM:200,1500}
DELAY %delay_random%

# Генерация ошибки: иногда добавляем лишний символ в номер карты
IF {RANDOM:1,100} < 5:
    SET card_number = {CARD_NUMBER} + "X"
    DELAY 500
    SET card_number = {REMOVE_LAST_CHAR}
ENDIF

POST https://api.stripe.com/v1/payment_intents
HEADER Idempotency-Key: {GUID}
BODY: payment_method_data[card][number]={{card_number}}&...
DELAY {RANDOM:300,800}

Часть 6. Ошибки и как их исправить​

Ошибка 1. Слишком частые ошибки​

Симптом: Ты добавляешь ошибку в каждом поле, и это выглядит неестественно.
Исправление: Ошибки должны быть редкими (3–5% на поле). Не делай ошибки в каждом поле подряд.

Ошибка 2. Идеальный клик​

Симптом: Ты кликаешь строго по центру кнопки с идеальной точностью.
Исправление: Добавляй смещение ±5–15 пикселей. Используй bounding_box и случайное смещение.

Ошибка 3. Фиксированные задержки​

Симптом: Все задержки одинаковые (например, 500 мс).
Исправление: Используй случайные диапазоны. Человек никогда не делает паузы одинаковой длины.

Ошибка 4. Отсутствие скролла​

Симптом: Ты никогда не скроллишь страницу перед заполнением.
Исправление: Добавь скролл с переменной скоростью и случайными остановками.
Python:
def human_scroll(page):
    for _ in range(random.randint(2, 5)):
        page.evaluate(f"window.scrollBy(0, {random.randint(100, 300)})")
        human_delay(200, 800)
    # Иногда возвращаемся вверх
    if random.random() < 0.3:
        page.evaluate(f"window.scrollBy(0, {random.randint(-100, -50)})")
        human_delay(200, 600)

Часть 7. Чек-лист для скрипта, который не палится​

  • Случайные задержки: между символами, полями, кликами.
  • Кривые движения мыши: Безье, overshoot, микрокоррекции.
  • Ошибки при вводе: опечатки, лишние символы, паузы перед исправлением.
  • Ротация User-Agent и заголовков.
  • Скролл с переменной скоростью и возвратами.
  • Имитация сомнений: зависания перед кликом, возвраты на предыдущую страницу.
  • Случайный выбор товаров: не всегда первый.
  • Удаление и добавление товаров в корзину.
  • Использование разных прокси для каждой сессии.

Резюме​

Стандартные скрипты OpenBullet сгорают за 5 минут, потому что они слишком идеальны. Человек ошибается, колеблется, двигается криво. Твой скрипт должен делать то же самое. Добавляй случайные задержки, эмулируй движения мыши по кривой Безье, делай опечатки и исправляй их. Используй библиотеки ghost-cursor и @extra/humanize, если работаешь с браузером. В OpenBullet используй случайные задержки и вариативность в конфиге. И тогда антифрод не узнает в тебе бота.

Быстрая памятка на одну строку:
«Ошибка — это человек. Идеальность — это бот. Добавляй случайные задержки, кривые движения и опечатки. И тогда антифрод не узнает тебя»
 
Top