Как AI помог автоматизировать борьбу с AI: пайплайн детекции на Claude + Cloudflare Workers

Divisor

Client
Регистрация
26.02.2024
Сообщения
28
Благодарностей
40
Баллы
13
Как AI помог автоматизировать борьбу с AI: пайплайн детекции на Claude + Cloudflare Workers

«We did everything they allowed us to» — девиз расширения Debloat
Введение

Google вставляет AI Overview в поисковую выдачу. Microsoft пропихивает Copilot в каждый угол Edge. Оба добавляют shopping-виджеты, спонсорский контент и телеметрию, которая стучит на десятки эндпоинтов при каждом запуске браузера.

Я сделал браузерное расширение Debloat, которое всё это блокирует. Но проблема в том, что Google и Microsoft обновляют свои AI-вставки каждую неделю — новые классы, новые контейнеры, shadow DOM. Отслеживать вручную — бесконечная работа.

Решение: автоматический детектор новых AI-элементов — Debloat AI Scout. Пайплайн, который сам находит изменения, создаёт тикеты, и обновляет правила блокировки.

Весь код — и расширение, и пайплайн — написан с помощью Claude Code (терминальный AI-агент от Anthropic). Это статья о том, как AI помог построить автоматизацию, которая борется с другим AI. Мета-ирония прилагается.

———

Часть 1. Проблема: AI-элементы как движущаяся мишень

Когда я начал работу над Debloat, задача казалась простой: найти CSS-селекторы AI-блоков, написать правила, готово. Реальность оказалась другой.

Google меняет разметку AI Overview примерно раз в 1–2 недели. Элемент может быть div#ai-overview-card, а через неделю стать безымянным контейнером внутри shadow DOM с динамическим ID. Edge вставляет Copilot sidebar через отдельный iframe, но периодически меняет endpoint и способ инъекции. Shopping-виджеты появляются и исчезают в зависимости от региона, языка и A/B-теста на стороне Google.

Один слой блокировки не справляется. Нужна система, которая:
1. Обнаруживает новые AI-элементы автоматически
2. Отличает их от обычных элементов поисковой выдачи
3. Создаёт тикет с достаточной информацией для написания правила
4. Учится на обратной связи — не повторяет ложные срабатывания

Это классическая задача веб-автоматизации: мониторинг DOM, эвристический анализ, реакция на изменения. Только вместо ZennoPoster — Cloudflare Workers + GitHub Issues.

———

Часть 2. Расширение Debloat: три слоя блокировки

Прежде чем говорить о детекции, нужно понять что именно мы блокируем и как.

Debloat использует три слоя, каждый закрывает свой класс угроз:

Диаграмма: Три слоя блокировкиоткрыть в Mermaid Live

Слой 1 — declarativeNetRequest. Блокирует HTTP-запросы на сетевом уровне. Телеметрия Google/Microsoft, эндпоинты shopping API, фиды спонсорского контента — всё режется до того, как браузер получит ответ. Это самый эффективный слой: нет запроса — нет контента.

Слой 2 — CSS injection (document_start). CSS правила инжектируются ДО рендера страницы. Элементы с известными селекторами скрываются мгновенно, без мерцания. Это покрывает статические AI-блоки с предсказуемой разметкой.

Слой 3 — DOM Mutation Observer. Ловит динамически вставленные элементы, которые CSS не может таргетировать — например, контейнеры внутри shadow DOM или элементы с рандомизированными классами. Observer следит за мутациями и удаляет найденные блоки.

Что блокируется:

КатегорияПримеры
AI FeaturesGoogle AI Overview, Gemini, Copilot sidebar, Help Me Write, Visual Search, window.ai
SponsoredMSN/News feed, sponsored tiles, Discover cards, рекомендованные статьи
ShoppingShopping Assistant, сравнение цен, купоны, express checkout
ТелеметрияGoogle/Microsoft/Mozilla диагностика, crash reporting, Firefox Studies
AnnoyancesRewards, баннеры фич, «Сделать по умолчанию», DALL-E темы

Всё это работает без прав администратора, без enterprise policies — обычное расширение, которое может поставить любой пользователь.

———

Часть 3. AI Scout: автоматический детектор новых AI-вставок

Вот здесь начинается собственно автоматизация.

Архитектура

Диаграмма: Архитектура Scoutоткрыть в Mermaid Live

Как работает пайплайн

Шаг 1: Сбор данных. Расширение Debloat (с согласия пользователя, opt-in) обнаруживает подозрительные элементы на поисковых страницах и отправляет анонимный репорт на Worker. Репорт содержит DOM-сниппет, позицию элемента, его атрибуты и контекст — но никаких персональных данных.

Шаг 2: Эвристический скоринг. Worker прогоняет каждый кандидат через детектор:

Диаграмма: Эвристический скоринготкрыть в Mermaid Live

Keyword signals — текст элемента содержит маркеры AI/sponsored/shopping (настраиваемые списки в configs/keywords.ts)
Placement analysis — где расположен элемент относительно органических результатов
Action buttons — наличие кнопок «Показать больше», «Попробовать», «Спросить AI» и подобных
Shadow DOM — элемент внутри shadow root (типичный паттерн для AI-вставок Google)

Шаг 3: Фильтрация. Отсеиваем ложные срабатывания: структурные элементы страницы, органические результаты поиска, слишком большие контейнеры (вероятно, обёртка всей выдачи), вложенные дубликаты.

Шаг 4: Fingerprinting. Каждый кандидат получает FNV-1a хеш на основе его DOM-свойств. Этот fingerprint стабилен между сканами — один и тот же элемент на разных машинах даёт один и тот же hash. Проверяем по KV: если fingerprint уже известен — дедупликация.

Шаг 5: Baseline diff. Сравниваем с текущим baseline (список известных элементов). Категоризация: added / removed / changed / unchanged. Только added и changed — actionable.

Шаг 6: GitHub Issue. Для нового обнаружения создаётся Issue с DOM-сниппетом, сигналами скоринга, метадатой. Лейбл needs-human-review ставится автоматически.

Шаг 7: Feedback loop. Разработчик проверяет Issue и закрывает с лейблом:

ЛейблЭффект
false-positiveSuppression на 30 дней в KV
fixedCandidate baseline → stable
accepted-baseline-updateОбновление baseline
duplicate-detectionSuppression

Webhook на Worker обрабатывает событие closed и обновляет KV. Система учится.

Стек

КомпонентТехнологияНазначение
Worker APICloudflare Workers + HonoОбработка репортов, пайплайн детекции, GitHub API
StateCloudflare KVBaseline'ы, fingerprint'ы, feedback, статистика
ArtifactsCloudflare R2Скриншоты, метадата сканов
CrawlerPlaywright (GitHub Actions)Опциональное smoke-тестирование
TestsVitest61 юнит-тест

———

Часть 4. Роль Claude в разработке

Оба проекта — Debloat и AI Scout — написаны с помощью Claude Code, терминального AI-агента от Anthropic. Это не «я попросил ChatGPT написать код». Это итеративная разработка с полным контролем.

Как выглядит процесс

Диаграмма: Процесс разработкиоткрыть в Mermaid Live

Спецификация сначала. В репозитории Debloat лежат debloat-spec-v1.2.md и debloat-spec-v1.3.md — это не README для пользователя, а техническое задание для Claude. Каждая версия спеки описывает что должно быть реализовано, какие граничные случаи учесть, какие тесты написать.

Маленькие файлы, одна задача на файл. Структура проекта разбита так, чтобы один файл отвечал за одну вещь. src/detectors/ — эвристики скоринга, src/fingerprint/ — хеширование, src/scoring/ — пороги. Claude работает гораздо лучше когда видит файл на 100 строк, а не монолит на 2000.

Тесты как контракт. 61 юнит-тест в AI Scout — это не «Claude, напиши тесты». Это: я описываю ожидаемое поведение, Claude пишет реализацию и тесты, если тесты падают — Claude видит ошибку и исправляет. Цикл повторяется.

Что Claude делал хорошо

Эвристики скоринга. Дал ему описание «вот как выглядят AI-элементы Google, вот признаки» — и получил рабочую систему скоринга с первой попытки. Keyword matching, placement analysis, scoring weights — всё сгенерировано корректно.
Hono routing. Worker API на Hono с CORS, роутами, middleware — шаблонный код который Claude пишет идеально.
Тесты. Vitest тесты с happy-dom — Claude генерирует и реализацию, и тесты, и проверяет их согласованность.
TypeScript strict mode. Ни одного any в проекте. Claude понимает типы и работает с ними корректно.

Где Claude ошибался

Первые baseline'ы были слишком агрессивные. Claude классифицировал обычные элементы навигации Google как «подозрительные». Пришлось вручную настраивать пороги в configs/scoring.ts и добавлять structural element filter.
FNV-1a fingerprinting. Первая реализация давала разные хеши для одного элемента на разных машинах из-за учёта нестабильных атрибутов (динамические ID, timestamps). Пришлось специфицировать какие свойства DOM включать в хеш, а какие игнорировать.
False-positive на вложенных элементах. Если parent-контейнер уже обнаружен как AI-блок, child-элементы тоже получали высокий score. Добавил nested dedup — но это потребовало 3 итерации с Claude.

Главный вывод

AI не заменяет архитектора. Claude отлично исполняет задачи когда у него есть чёткая спецификация, конкретный scope, и тесты как обратная связь. Но проектирование пайплайна, выбор эвристик, определение порогов, решение «что считать false-positive» — это человеческая работа. AI — отличный исполнитель, посредственный архитектор.

———

Часть 5. Параллели с ZennoPoster

Для тех, кто работает с ZennoPoster, архитектура AI Scout покажется знакомой. Это те же паттерны веб-автоматизации, реализованные на другом стеке:

Диаграмма: Параллели с ZennoPosterоткрыть в Mermaid Live

ZennoPosterAI ScoutСуть
Ожидание появления элементаDOM Mutation ObserverМониторинг изменений на странице
Условия и фильтры в шаблонеHeuristic scoring + false-positive filtersРешение: это целевой элемент или нет?
Действие при обнаруженииGitHub Issue creationРеакция на находку
Проверка «изменилось ли?»Baseline diff (added/removed/changed)Отслеживание изменений между запусками
Корректировка шаблонаWebhook → suppression/baseline updateОбучение на обратной связи
Логирование результатовCloudflare KV + R2 (stats, artifacts)Хранение состояния между запусками

Принципиальная разница — в инфраструктуре. ZennoPoster работает на выделенной машине, AI Scout — serverless: Cloudflare Workers (бесплатный тир покрывает нагрузку), KV для состояния, R2 для артефактов, GitHub Actions для опционального краулинга. Нет сервера, нет обслуживания, нет масштабирования.

Но паттерны — те же. Веб-автоматизация — это веб-автоматизация, независимо от стека.

———

Часть 6. Предложения для продуктов ZennoLab

На основе опыта разработки AI Scout вижу несколько направлений, где AI мог бы усилить продукты ZennoLab:

1. AI-ассистент для генерации селекторов

Сейчас: открываешь DevTools, ищешь элемент, копируешь XPath, вставляешь в ZennoPoster. Если разметка меняется — шаблон ломается.

С AI: описываешь элемент на естественном языке — «кнопка отправки формы обратной связи» или «блок с ценой товара» — и AI генерирует устойчивый селектор. Не жёсткий XPath /html/body/div[3]/form/button, а комбинацию CSS-селекторов, текстовых маркеров и позиционных эвристик.

2. Автоматическая адаптация шаблонов

В AI Scout реализован baseline diff: система знает как страница выглядела «нормально» и детектит отклонения. Тот же подход в ZennoPoster: шаблон запоминает baseline DOM-структуры целевой страницы. Если при следующем запуске структура изменилась — шаблон не просто падает с ошибкой, а запускает AI-адаптацию: находит новый селектор для того же логического элемента.

3. Эвристический детектор anti-bot

Вместо жёстких правил «если есть reCAPTCHA — сделай X» — скоринговая модель: набор сигналов (fingerprint checks, timing analysis, honeypot fields) с весами. Порог адаптируется автоматически. Как в Scout: не бинарное решение «есть/нет», а score с threshold.

4. Генерация экшенов из описания

«Зайди на сайт, найди форму обратной связи, заполни имя и email из таблицы, отправь, сохрани результат.» → AI генерирует последовательность экшенов в формате ZennoPoster. Не готовый шаблон — черновик, который пользователь проверяет и корректирует.

5. Feedback loop в шаблонах

В AI Scout закрытие GitHub Issue с лейблом обновляет правила. Аналог для ZennoPoster: шаблон логирует результаты (успех/ошибка/partial), AI анализирует паттерны ошибок и предлагает корректировки. Не автоматическая правка — а рекомендации: «элемент X не найден 15 раз за последние 100 запусков, вот 3 варианта нового селектора».

———

Часть 7. Выводы

AI ускоряет, но не заменяет. Claude Code написал ~95% кода Debloat и AI Scout. Но архитектуру пайплайна, выбор эвристик, пороги скоринга, решения о том что считать false-positive — всё это проектировал человек. AI — инструмент, не архитектор.

Спецификация — главное. Разница между «AI написал мусор» и «AI написал рабочий код» — в качестве ТЗ. Файлы debloat-spec-v1.2.md и debloat-spec-v1.3.md в репозитории — это не документация, а контракт между мной и Claude. Чем точнее контракт, тем лучше результат.

Тесты — обратная связь. 61 юнит-тест — это не бюрократия. Это способ сказать AI «ты ошибся, вот почему». Без тестов Claude уходит в галлюцинации. С тестами — итеративно приходит к правильному решению.

Маленькие файлы, маленькие задачи. Один файл — одна ответственность. Claude ломается на файлах в 500+ строк. На файлах в 50–100 строк работает почти идеально.

Serverless — не хуже десктопа. Весь пайплайн AI Scout работает на бесплатном тире Cloudflare Workers. Никакого сервера, никакого обслуживания. Для задач мониторинга и детекции serverless — идеальная архитектура.

И напоследок — о деньгах, точнее об их отсутствии. Весь этот пайплайн работает на бесплатных тирах чужой инфраструктуры:

Cloudflare Workers (free tier) — 100K запросов/день. Хватает с огромным запасом
Cloudflare KV (free tier) — хранение baseline'ов, fingerprint'ов, suppression-правил
Cloudflare R2 (free tier) — 10GB под скриншоты и артефакты сканов
GitHub Issues — бесплатный тикет-трекер, который ещё и API отдаёт
GitHub Actions — CI/CD и опциональный Playwright-краулинг, бесплатно для публичных репо
Эвристический анализ — выполняется внутри Worker'а, никаких внешних AI-API, никаких токенов за деньги

Итого: $0/мес за продакшн-пайплайн с детекцией, дедупликацией, feedback loop и нотификациями. Ни одного своего сервера, ни одной платной подписки.

Единственное на что я потратился — Claude Code для написания кода. Но код написан один раз, а пайплайн крутится бесплатно.

Если это не «ИИ для автоматизации» на минимальном бюджете — я не знаю что.


———

Ссылки

Debloat (расширение): github.com/investblog/debloat · debloat.click
Debloat AI Scout (пайплайн): github.com/investblog/debloat-ai-scout
Проекты с открытым кодом: wpps.ru

Весь код — open source, MIT.
 
Последнее редактирование:
  • Спасибо
Реакции: deskuznetsov

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)