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. Структура записи: минимальный набор полей
| Поле | Тип | Пример | Описание |
|---|---|---|---|
| timestamp | ISO 8601 | 2025-04-27T14:32:11Z | Время попытки в UTC |
| site | string | shopify.com/example | Целевой сайт или магазин |
| bin | integer (6 digit) | 414720 | Первые 6 цифр карты |
| country_card | ISO 3166-1 alpha-2 | US | Страна эмитента карты |
| proxy_ip | string | 45.67.89.10 | IP адрес прокси |
| proxy_type | string | residential | residential, datacenter, mobile, isp |
| proxy_provider | string | webshare | Имя провайдера |
| antidetect | string | dolphin_anty | Название антидетекта |
| profile_id | string | prof_a1b2c3 | ID профиля (для связки) |
| http_status | integer | 402 | HTTP статус ответа |
| error_code | string | do_not_honor | Код ошибки от шлюза |
| error_message | string | Your card was declined | Текст ошибки |
| response_time_ms | integer | 2350 | TTFB в миллисекундах |
| amount_usd | float | 49.99 | Сумма чека |
| result | string | fail | success / fail |
| notes | text | reused 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:- Создайте сводную таблицу (Pivot Table): Данные → Сводная таблица.
- Строки: bin (или proxy_provider).
- Столбцы: result (success/fail).
- Значения: 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_honor | 42 |
| Отказов insufficient_funds | 18 |
| Отказов fraudulent | 30 |
| Отказов expired_card | 7 |
| Использовано прокси | 20 разных (15 резидентных, 5 дата-центр) |
| Использовано BIN | 15 разных (все из США) |
| Часы вбивов | в основном 14:00–18:00 UTC |
4.2. Анализ шаг за шагом
Шаг 1. Агрегируем по типам ошибок. do_not_honor (42%) — это мертвые карты. fraudulent (30%) — проблемы среды. insufficient_funds (18%) — пустые карты.Шаг 2. Строим сводную таблицу: прокси × код ошибки.
| Прокси | type | do_not_honor | fraudulent | insufficient_funds | success |
|---|---|---|---|---|---|
| proxy A | residential | 10 | 2 | 1 | 2 |
| proxy B | residential | 8 | 12 | 3 | 0 |
| proxy C | datacenter | 5 | 15 | 2 | 0 |
| proxy D | residential | 19 | 1 | 12 | 1 |
Вывод: 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 и C | fraudulent снизился с 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% ваших попыток падают. Системный анализ превращает хаос отказов в управляемый процесс оптимизации.Главные выводы:
- Логируйте всё. Каждая попытка — строка в таблице. Без этого вы обречены повторять одни и те же ошибки.
- Автоматизируйте сбор. Расширение браузера или mitmproxy сэкономят часы ручного ввода.
- Анализируйте через сводные таблицы и графики. Ищите корреляции: BIN-провайдер, прокси, время суток.
- Реальный кейс показал: проблемы часто лежат не там, где вы думаете (не в карте, а в конкретном прокси и времени).
- Итеративно улучшайте. Изменили один параметр — залогируйте 20 попыток, сравните с предыдущими.
Быстрая памятка на одну строку:
«Записал — проанализировал — изменил — записал снова. Через 100 попыток ты увидишь систему, где другие видят хаос»
