Good Carder
Professional
- Messages
- 1,014
- Reaction score
- 692
- Points
- 113
От кардера — кардерам. Ты настраиваешь OpenBullet 2, заливаешь карты, запускаешь — и через 5 минут все твои прокси сгорают, а BIN попадает в чёрный список. Почему? Потому что твой скрипт слишком идеален. Он заполняет форму за 2 секунды, кликает строго по центру кнопки и не делает ошибок. Для антифрода это кричащий сигнал: «Я бот». В этой статье я покажу, как заставить твой скрипт выглядеть как человек. Человек ошибается, колеблется, двигается криво. Твой скрипт должен делать то же самое.
Решение: добавь случайные задержки. В OpenBullet 2 есть параметр Random Delay. Установи его в диапазон 200–1500 мс. Но даже этого недостаточно — нужно менять задержки в зависимости от действия.
Решение: используй библиотеки ghost-cursor или @extra/humanize для эмуляции естественных движений.
Решение: добавь 1–2 ошибки на форму. Намеренно введи неправильный символ, потом удали его и введи правильный.
Решение: используй ротацию User-Agent и подмену заголовков для каждого запроса.
Пример LoliScript с задержками и вариативностью:
Исправление: Ошибки должны быть редкими (3–5% на поле). Не делай ошибки в каждом поле подряд.
Исправление: Добавляй смещение ±5–15 пикселей. Используй bounding_box и случайное смещение.
Исправление: Используй случайные диапазоны. Человек никогда не делает паузы одинаковой длины.
Исправление: Добавь скролл с переменной скоростью и случайными остановками.
Быстрая памятка на одну строку:
«Ошибка — это человек. Идеальность — это бот. Добавляй случайные задержки, кривые движения и опечатки. И тогда антифрод не узнает тебя»
Часть 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 |
| Опечатка в CVV | 2–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 используй случайные задержки и вариативность в конфиге. И тогда антифрод не узнает в тебе бота.Быстрая памятка на одну строку:
«Ошибка — это человек. Идеальность — это бот. Добавляй случайные задержки, кривые движения и опечатки. И тогда антифрод не узнает тебя»