Как собрать антифрод на ClickHouse и Python без магии и ручного ада
Давайте поднимем логи и посмотрим правде в глаза. Если у вас есть клики, постбеки, user-agent, IP, ASN, referrer и таймстемпы — у вас уже есть сырьё для фильтрации. ClickHouse здесь не «аналитика ради графиков», а быстрый движок для разметки аномалий: группировки по IP/UA, окна по секундам, срезы по subid и цепочкам редиректов.
Схема простая: Python пишет события в очередь или пачками в ClickHouse, затем по SQL строит признаки. Считаем: частоту кликов на IP/UA, долю одинаковых рефереров, расстояние между кликом и конверсией, повторяемость cookie, совпадение GEO и прокси-ASN. Ботнеты эволюционируют, но паттерны их поведения остаются прежними: одинаковые тайминги, пустые referrer, клоны заголовков, неестественная плотность событий.
Фильтр лучше делать не бинарным, а скоринговым:
— +3 за 20+ кликов с одного /24
— +2 за UA без вариативности
— +2 за конверсии быстрее человеческого медианного окна
— +1 за цепочку редиректов без задержек
Порогом не режьте всё подряд; сначала отправляйте в quarantine-таблицу и проверяйте ручкой. Удобно хранить сырьё отдельно от нормализованных признаков, иначе потом сами себе не объясните, почему «честный» трафик стал мусором.
Python нужен не для тяжёлой математики, а для orchestration: нормализация, enrichment, пуш в CH, периодический пересчёт правил, выгрузка алертов в Telegram или Slack. Вот технический разбор того, как именно уплывает ваш рекламный бюджет: сначала трафик выглядит живым, затем в логах начинается повторяемость, а дальше фрод просто масштабируется быстрее, чем вы успеваете открыть отчёт.
Начинайте с сырого лога и одного скоринга. Когда увидите первые кластеры, добавляйте окна, когорты и blacklist-подобные правила — без этого любой «антифрод» превращается в декоративный дашборд.
Защита от фрода в рекламе
@ad_fraud_shield_arb
Как собрать антифрод на ClickHouse и Python без магии и ручного ада
Этот пост опубликован в Telegram-канале Защита от фрода в рекламе. Подписаться можно по ссылке: @ad_fraud_shield_arb.