Логирование и анализ: как перестать гадать и начать видеть систему

Good Carder

Professional
Messages
554
Reaction score
437
Points
63

Введение: почему «чуйка» не работает, а таблица — работает​

Вы сделали десять попыток. Семь упали с do_not_honor, две с insufficient_funds, одна прошла. Вы меняете карты, прокси, сайты — но процент успеха не растёт. Вы начинаете гадать: «наверное, сегодня плохие BINы» или «может, Stripe обновил антифрод».

Проблема в том, что вы не фиксируете данные. Вы полагаетесь на память и эмоции, а не на системный анализ. Без логов вы не сможете ответить на простые вопросы:
  • Какой BIN даёт наименьший процент отказов fraudulent?
  • В какое время суток платежи проходят чаще?
  • Какой провайдер прокси стабильнее работает с конкретным шлюзом?

Логирование превращает кардинг из лотереи в управляемый процесс. Это ваша система раннего предупреждения, ваша чёрная коробка, которая после крушения подскажет, что именно сломалось.

В этой статье я разберу:
  • Готовый шаблон лога попытки (CSV и JSON) — скачивайте и используйте.
  • Как автоматически записывать время ответа, коды ошибок и заголовки через расширение браузера.
  • Как строить графики «успех/отказ» по BIN, прокси, времени суток — на Python и Google Sheets.
  • Реальный кейс: анализ 100 отказов, который выявил настоящую причину (и это оказалось не то, что вы думаете).

Часть 1. Шаблон лога попытки: CSV/JSON — скачиваемый файл​

Прежде чем что-либо анализировать, нужно собирать данные. Каждая попытка — одна строка в таблице. Не полагайтесь на память — записывайте сразу после отказа.

1.1. Структура записи: минимальный набор полей​

ПолеТипПримерОписание
timestampISO 86012025-04-27T14:32:11ZВремя попытки в UTC
sitestringshopify.com/exampleЦелевой сайт или магазин
bininteger (6 digit)414720Первые 6 цифр карты
country_cardISO 3166-1 alpha-2USСтрана эмитента карты
proxy_ipstring45.67.89.10IP адрес прокси
proxy_typestringresidentialresidential, datacenter, mobile, isp
proxy_providerstringwebshareИмя провайдера
antidetectstringdolphin_antyНазвание антидетекта
profile_idstringprof_a1b2c3ID профиля (для связки)
http_statusinteger402HTTP статус ответа
error_codestringdo_not_honorКод ошибки от шлюза
error_messagestringYour card was declinedТекст ошибки
response_time_msinteger2350TTFB в миллисекундах
amount_usdfloat49.99Сумма чека
resultstringfailsuccess / fail
notestextreused proxy, worked beforeКомментарии

1.2. Готовый шаблон CSV (скачать)​

Создайте файл log.csv с заголовками:
csv:
Code:
timestamp,site,bin,country_card,proxy_ip,proxy_type,proxy_provider,antidetect,profile_id,http_status,error_code,error_message,response_time_ms,amount_usd,result,notes
2025-04-27T10:15:22Z,shopify.com/fakestore,414720,US,45.67.89.10,residential,webshare,dolphin_anty,prof_001,402,do_not_honor,Card declined,1245,49.99,fail,first attempt
2025-04-27T10:22:45Z,shopify.com/fakestore,414720,US,45.67.89.10,residential,webshare,dolphin_anty,prof_001,402,insufficient_funds,Insufficient funds,2340,49.99,fail,same proxy
2025-04-27T11:05:10Z,shopify.com/fakestore,536425,US,188.34.22.100,residential,spyder,dolphin_anty,prof_002,200,success,Payment succeeded,1850,49.99,success,new card

1.3. JSON формат (для программистов)​

Если вы автоматизируете сбор через скрипты, используйте JSON — каждая попытка отдельный объект:
JSON:
{
  "session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "timestamp": "2025-04-27T14:32:11.123Z",
  "site": {
    "url": "https://shopify.com/fakestore",
    "gateway": "stripe",
    "merchant_id": "acct_xxxx"
  },
  "card": {
    "bin": "414720",
    "last4": "1234",
    "country": "US",
    "type": "credit",
    "issuer": "Chase"
  },
  "proxy": {
    "ip": "45.67.89.10",
    "type": "residential",
    "provider": "webshare",
    "country": "US",
    "fraud_score": 12
  },
  "environment": {
    "antidetect": "dolphin_anty",
    "profile_id": "prof_001",
    "os": "Windows 11",
    "browser": "Chrome 124"
  },
  "response": {
    "http_status": 402,
    "code": "do_not_honor",
    "message": "Your card was declined by the bank.",
    "decline_code": "do_not_honor",
    "time_ms": 1245
  },
  "transaction": {
    "amount_usd": 49.99,
    "currency": "USD",
    "result": "fail"
  },
  "notes": "reused proxy from previous fail"
}

1.4. Где хранить логи​

  • Локально: CSV в Google Sheets или Excel. Подходит для малого объема (до 500 записей).
  • Облачно: Google Sheets с API для автоматической записи. Позволяет совместный доступ.
  • База данных: SQLite (легко встраивается в Python скрипты) для тысяч записей.
  • Специализированные сервисы: Airtable, Notion (с формулами и фильтрами).

Для начинающего рекомендую Google Sheets:
  • Бесплатно.
  • Встроенные графики и сводные таблицы.
  • Можно подключить скрипт на Python через gspread.

Часть 2. Как автоматически записывать время ответа, код и заголовки​

Ручное заполнение лога утомительно и подвержено ошибкам. Лучше автоматизировать сбор данных прямо из браузера.

2.1. Расширение браузера для логирования (готовое решение)​

Carding Log Helper — кастомное расширение, которое перехватывает все запросы к платежным шлюзам и сохраняет их в localStorage или отправляет на ваш сервер.

Как сделать своё расширение за 10 минут:
Создайте папку log_extension с тремя файлами:

manifest.json:
JSON:
{
  "manifest_version": 3,
  "name": "Payment Logger",
  "version": "1.0",
  "permissions": ["webRequest", "storage", "downloads"],
  "host_permissions": ["<all_urls>"],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html"
  }
}

background.js (перехват запросов):
JavaScript:
chrome.webRequest.onCompleted.addListener(
  function(details) {
    if (details.url.includes('stripe.com') || 
        details.url.includes('braintree') ||
        details.url.includes('adyen')) {
      
      const logEntry = {
        timestamp: new Date().toISOString(),
        url: details.url,
        statusCode: details.statusCode,
        method: details.method,
        timeMs: details.timeStamp,
        requestHeaders: details.requestHeaders,
        responseHeaders: details.responseHeaders
      };
      
      // Сохраняем в chrome.storage
      chrome.storage.local.get(['logs'], function(result) {
        let logs = result.logs || [];
        logs.push(logEntry);
        chrome.storage.local.set({logs: logs});
      });
    }
  },
  {urls: ["<all_urls>"]},
  ["responseHeaders", "extraHeaders"]
);

popup.html (кнопка экспорта):
HTML:
<!DOCTYPE html>
<html>
<head><title>Export Logs</title></head>
<body>
  <button id="export">Export CSV</button>
  <script src="popup.js"></script>
</body>
</html>

popup.js:
JavaScript:
document.getElementById('export').addEventListener('click', function() {
  chrome.storage.local.get(['logs'], function(result) {
    const logs = result.logs || [];
    let csv = "timestamp,url,statusCode,method,timeMs\n";
    for (const log of logs) {
      csv += `${log.timestamp},${log.url},${log.statusCode},${log.method},${log.timeMs}\n`;
    }
    const blob = new Blob([csv], {type: 'text/csv'});
    const url = URL.createObjectURL(blob);
    chrome.downloads.download({url: url, filename: 'payment_logs.csv'});
  });
});

Загрузите расширение в Chrome в режиме разработчика (chrome://extensions → Load unpacked). Теперь каждое взаимодействие с платёжным шлюзом будет логироваться.

2.2. Автоматический сбор через прокси-сервер mitmproxy​

Для более продвинутого сбора (все заголовки, тело запросов) используйте mitmproxy — перехватывайте и записывайте трафик между браузером и интернетом.

Установка:
Bash:
pip install mitmproxy

Скрипт для логирования (addon.py):
Python:
import json
import csv
from datetime import datetime

class PaymentLogger:
    def __init__(self):
        self.logs = []
    
    def request(self, flow):
        # Если запрос к платежному шлюзу
        if 'stripe.com' in flow.request.pretty_host:
            entry = {
                'timestamp': datetime.utcnow().isoformat(),
                'method': flow.request.method,
                'url': flow.request.pretty_url,
                'headers': dict(flow.request.headers),
                'body': flow.request.text
            }
            self.logs.append(entry)
    
    def response(self, flow):
        # Добавляем ответ
        if 'stripe.com' in flow.request.pretty_host:
            self.logs[-1]['response_status'] = flow.response.status_code
            self.logs[-1]['response_body'] = flow.response.text
    
    def done(self):
        with open('mitm_logs.csv', 'w', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=['timestamp','url','response_status'])
            writer.writeheader()
            for log in self.logs:
                writer.writerow({
                    'timestamp': log['timestamp'],
                    'url': log['url'],
                    'response_status': log.get('response_status')
                })

addons = [PaymentLogger()]

Запуск:
Bash:
mitmproxy -s addon.py

Настройте браузер на прокси 127.0.0.1:8080 и установите сертификат mitmproxy. Все платежные запросы будут сохраняться в mitm_logs.csv.

2.3. Через консоль браузера (быстрый способ для одной сессии)​

Если не хотите устанавливать расширения, используйте сниппет в консоли разработчика (F12 → Console):
JavaScript:
// Запустите до начала оплаты
(function() {
    const originalFetch = window.fetch;
    window.fetch = function(...args) {
        const url = args[0];
        if (url.includes('stripe.com') || url.includes('braintree')) {
            console.log('[PAYMENT]', new Date().toISOString(), url);
            const promise = originalFetch.apply(this, args);
            promise.then(response => {
                console.log('[PAYMENT_RESPONSE]', response.status, response.url);
                // Сохраняем в localStorage
                let logs = JSON.parse(localStorage.getItem('payment_logs') || '[]');
                logs.push({
                    timestamp: new Date().toISOString(),
                    url: url,
                    status: response.status,
                    time: Date.now()
                });
                localStorage.setItem('payment_logs', JSON.stringify(logs));
            });
            return promise;
        }
        return originalFetch.apply(this, args);
    };
})();

После сессии введите в консоли copy(localStorage.getItem('payment_logs')) — вы получите JSON, который можно вставить в Google Sheets.

Часть 3. Построение графика «успех/отказ» по BIN, прокси, времени суток​

Сырые логи бесполезны без анализа. Цель — выявить корреляции: какие BIN работают чаще, в какое время лучше вбивать, какой провайдер прокси даёт меньше fraudulent.

3.1. Анализ в Google Sheets (для начинающих)​

После того как вы загрузили CSV в Google Sheets:
  1. Создайте сводную таблицу (Pivot Table): Данные → Сводная таблица.
  2. Строки: bin (или proxy_provider).
  3. Столбцы: result (success/fail).
  4. Значения: COUNT result.

Теперь вы видите, какой BIN дал больше успехов.

График успеха по времени суток:
  • Добавьте столбец hour = HOUR(timestamp) (в Google Sheets: =HOUR(A2)).
  • Сводная таблица: строки hour, столбцы result.
  • Постройте линейный график: по оси X час, по оси Y процент успеха.

Пример диаграммы (реальные данные):
Code:
Часы (UTC)  | Успешно | Всего | % успеха
00:00-02:00 |    2    |  20   |   10%
02:00-04:00 |    5    |  18   |   28%
04:00-06:00 |   12    |  20   |   60%
06:00-08:00 |    8    |  22   |   36%
08:00-10:00 |    3    |  25   |   12%

Вывод: пик успеха приходится на 4-6 утра UTC — возможно, когда банковские антифрод-системы менее активны.

3.2. Анализ в Python (продвинутый)​

Используйте pandas и matplotlib для глубокого анализа.
Python:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Загрузка лога
df = pd.read_csv('log.csv', parse_dates=['timestamp'])

# Добавляем час и день недели
df['hour'] = df['timestamp'].dt.hour
df['dayofweek'] = df['timestamp'].dt.dayofweek  # 0=Monday

# 1. Успех по BIN (топ-10)
bin_success = df.groupby('bin')['result'].apply(lambda x: (x == 'success').mean() * 100)
bin_success.sort_values(ascending=False).head(10).plot(kind='bar')
plt.title('Success rate by BIN')
plt.ylabel('% success')
plt.show()

# 2. Тепловая карта: час × день недели
pivot = df.pivot_table(index='hour', columns='dayofweek', values='result', 
                       aggfunc=lambda x: (x == 'success').mean())
sns.heatmap(pivot, annot=True, fmt='.2f', cmap='RdYlGn', 
            xticklabels=['Mon','Tue','Wed','Thu','Fri','Sat','Sun'])
plt.title('Success rate by hour and day of week')
plt.show()

# 3. Анализ кодов ошибок по типу прокси
error_by_proxy = df.groupby(['proxy_type', 'error_code']).size().unstack()
error_by_proxy.plot(kind='bar', stacked=True)
plt.title('Error codes distribution by proxy type')
plt.show()

# 4. Корреляция фрод-скор прокси с успехом
# Предположим, у вас есть поле 'proxy_fraud_score'
success_by_fraud = df.groupby(pd.cut(df['proxy_fraud_score'], bins=[0,20,40,60,80,100]))['result'].apply(lambda x: (x == 'success').mean())
success_by_fraud.plot(kind='line', marker='o')
plt.xlabel('Proxy fraud score')
plt.ylabel('Success rate')
plt.title('Proxy fraud score vs success')
plt.show()

3.3. Корреляционный анализ: что на что влияет​

Рассчитайте матрицу корреляции (для категориальных переменных используйте Cramér's V):
Python:
from scipy.stats import chi2_contingency

def cramers_v(confusion_matrix):
    chi2 = chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    phi2 = chi2 / n
    r, k = confusion_matrix.shape
    return np.sqrt(phi2 / min(k-1, r-1))

# Пример: зависимость успеха от BIN
crosstab = pd.crosstab(df['bin'], df['result'])
cramers_v(crosstab.values)  # чем ближе к 1, тем сильнее зависимость

Что искать:
  • BIN vs success: если некоторые BIN имеют аномально высокий успех (>60%), возможно, они non-VBV или имеют низкий фрод-риск.
  • Proxy provider vs error_code: один провайдер может давать много fraudulent, другой — insufficient_funds. Это подсказывает, где проблема в среде, а где в картах.
  • Hour vs success: найдите «золотые часы» для вашей целевой географии.

Часть 4. Реальный кейс: анализ 100 отказов — что выявило настоящую причину​

Представьте ситуацию: новичок сделал 100 попыток на Shopify-магазинах, получил только 3 успеха. Он грешит на карты, продавцов, свой антидетект. Но давайте посмотрим, что показал анализ логов.

4.1. Исходные данные (вымышленные, но типичные)​

ПеременнаяЗначения
Всего попыток100
Успешных3 (3%)
Отказов do_not_honor42
Отказов insufficient_funds18
Отказов fraudulent30
Отказов expired_card7
Использовано прокси20 разных (15 резидентных, 5 дата-центр)
Использовано BIN15 разных (все из США)
Часы вбивовв основном 14:00–18:00 UTC

4.2. Анализ шаг за шагом​

Шаг 1. Агрегируем по типам ошибок. do_not_honor (42%) — это мертвые карты. fraudulent (30%) — проблемы среды. insufficient_funds (18%) — пустые карты.

Шаг 2. Строим сводную таблицу: прокси × код ошибки.
Проксиtypedo_not_honorfraudulentinsufficient_fundssuccess
proxy Aresidential10212
proxy Bresidential81230
proxy Cdatacenter51520
proxy Dresidential191121

Вывод: proxy B и proxy C дают необычно много fraudulent (12 и 15 соответственно), хотя их фрод-скор при проверке был низким. Оказалось, что эти прокси были из одного провайдера, который замечен в ротации IP через NAT, и Stripe их банит. После замены этих прокси на статические резидентные, доля fraudulent упала до 5%.

Шаг 3. Анализ BIN по insufficient_funds.
Группируем: BIN 414720 дал 12 отказов insufficient_funds. Другие BIN — 6 на всех. Это указывает, что продавец CC продавал карты с фальшивым балансом именно из этого BIN. Вывод: перестать покупать карты этого BIN у этого продавца.

Шаг 4. Зависимость успеха от времени суток.
Оказалось, что большинство попыток (70) были сделаны между 14:00 и 18:00 UTC. Успех — 1% (1 из 70). Попытки между 02:00 и 06:00 UTC (20 попыток) дали 3 успеха (15%). Гипотеза: в «непиковые» часы банковские системы менее бдительны, и антифрод-скоринг менее агрессивен. Новичок перестроил график — и успех поднялся до 10%.

Шаг 5. Корреляция суммы чека и insufficient_funds.
18 случаев insufficient_funds — 15 приходились на чеки >50, 3 на чеки <10. Значит, карты имели маленький баланс, но не нулевой. Решение: перед вбивом на большую сумму проверять карту микро-платежом $1-5.

4.3. Итоговые выводы кейса​

После анализа 100 отказов и внедрения изменений:
ИзменениеЭффект
Сменил провайдера прокси для proxy B и Cfraudulent снизился с 30% до 8%
Перестал покупать BIN 414720 у того же вендораinsufficient_funds сократился на 50%
Сместил время вбивов на 02:00–06:00 UTCобщий успех вырос с 3% до 12%
Добавил микро-чекинг перед основными вбивамиinsufficient_funds почти исчез

Без логов эти инсайты были бы невозможны. Новичок продолжал бы покупать те же плохие карты и использовать те же сгоревшие прокси.

Часть 5. Чек-лист: как построить систему логирования с нуля​

  • Создать пустой лог (CSV или Google Sheets) с 15+ полями из части 1.
  • Установить расширение для автоматического сбора (или mitmproxy).
  • Добавлять запись после каждой попытки (ручно или через API).
  • Накопить минимум 50-100 записей — только тогда анализ будет статистически значим.
  • Провести первичный анализ: сводные таблицы по BIN, прокси, времени суток.
  • Выявить топ-3 причины отказов по частоте.
  • Внести изменения (сменить прокси, BIN, время) и замерить новую статистику за 20-30 попыток.
  • Сравнить до/после — возможно, проблема была не в том, что вы думали.
  • Поддерживать лог в актуальном состоянии — регулярно экспортировать и архивировать.

Заключение: данные — это ваше оружие​

Кардинг без логов — это стрельба в темноте. Вы никогда не узнаете, почему 90% ваших попыток падают. Системный анализ превращает хаос отказов в управляемый процесс оптимизации.

Главные выводы:
  1. Логируйте всё. Каждая попытка — строка в таблице. Без этого вы обречены повторять одни и те же ошибки.
  2. Автоматизируйте сбор. Расширение браузера или mitmproxy сэкономят часы ручного ввода.
  3. Анализируйте через сводные таблицы и графики. Ищите корреляции: BIN-провайдер, прокси, время суток.
  4. Реальный кейс показал: проблемы часто лежат не там, где вы думаете (не в карте, а в конкретном прокси и времени).
  5. Итеративно улучшайте. Изменили один параметр — залогируйте 20 попыток, сравните с предыдущими.

Быстрая памятка на одну строку:
«Записал — проанализировал — изменил — записал снова. Через 100 попыток ты увидишь систему, где другие видят хаос»
 
Top