
CAPTCHA доказывает, что вы человек. HATCHA доказывает, что вы не человек.
CAPTCHA доказывает, что вы человек. HATCHA доказывает, что вы нет.
HATCHA (Hyperfast Agent Test for Computational Heuristic Assessment — сверхбыстрый агентный тест для вычислительной эвристической оценки) — это обратная CAPTCHA, которая ограничивает доступ задачами, тривиальными для ИИ-агентов, но мучительными для людей: умножение больших чисел, реверс строк, двоичное декодирование и т.д.
npm install @mondaycom/hatcha-react @mondaycom/hatcha-server
// app/api/hatcha/[...hatcha]/route.ts
import { createHatchaHandler } from "@mondaycom/hatcha-server/nextjs";
const handler = createHatchaHandler({
secret: process.env.HATCHA_SECRET!,
});
export const GET = handler;
export const POST = handler;
// app/layout.tsx
import { HatchaProvider } from "@mondaycom/hatcha-react";
import "@mondaycom/hatcha-react/styles.css";
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
<HatchaProvider>{children}</HatchaProvider>
</body>
</html>
);
}
"use client";
import { useHatcha } from "@mondaycom/hatcha-react";
function AgentModeButton() {
const { requestVerification } = useHatcha();
return (
<button
onClick={() =>
requestVerification((token) => {
console.log("Агент подтверждён!", token);
})
}
>
Войти в режим агента
</button>
);
}
# .env.local
HATCHA_SECRET=ваш-случайный-секрет-здесь
Клиент Сервер
│ │
│ GET /api/hatcha/challenge │
│────────────────────────────────►│
│ │ Генерация задачи
│ │ Хэширование ответа
│ │ HMAC-подпись { hash, срок }
│ { challenge (без ответа), token }
│◄────────────────────────────────│
│ │
│ Агент решает задачу │
│ │
│ POST /api/hatcha/verify │
│ { answer, token } │
│────────────────────────────────►│
│ │ Проверка HMAC-подписи
│ │ Проверка срока
│ │ Сравнение хэша ответа
│ { success, verificationToken } │
│◄────────────────────────────────│
Ответ никогда не попадает к клиенту. Подписанный токен непрозрачен и содержит только хэшированный ответ + срок. Проверка не имеет состояния — база данных не нужна.
import { registerChallenge } from "@mondaycom/hatcha-server";
registerChallenge({
type: "hex",
generate() {
const n = Math.floor(Math.random() * 0xffffff);
return {
display: {
type: "hex",
icon: "0x",
title: "Шестнадцатеричное декодирование",
description: "Преобразуйте это шестнадцатеричное число в десятичное.",
prompt: `0x${n.toString(16).toUpperCase()}`,
timeLimit: 30,
answer: String(n),
},
answer: String(n),
};
},
});
HATCHA использует CSS-переменные, ограниченные пространством имён --hatcha-*. Переопределите их на любом родительском элементе:
[data-hatcha-theme] {
--hatcha-accent: #3b82f6;
--hatcha-accent-light: #60a5fa;
--hatcha-bg: #060b18;
--hatcha-fg: #e4eaf6;
--hatcha-success: #22c55e;
--hatcha-danger: #ef4444;
}
Передайте theme="dark", theme="light" или theme="auto" в <HatchaProvider> или <Hatcha>.
import express from "express";
import { hatchaRouter } from "@mondaycom/hatcha-server/express";
const app = express();
app.use(express.json());
app.use("/api/hatcha", hatchaRouter({ secret: process.env.HATCHA_SECRET! }));
app.listen(3000);
| Пакет | Описание |
|---|---|
@mondaycom/hatcha-core |
git clone https://github.com/mondaycom/HATCHA.git
cd HATCHA
pnpm install
pnpm build
cd examples/nextjs-app
pnpm dev
Вклад приветствуется! Инструкции по настройке и руководство см. в CONTRIBUTING.md.
| Тип | Иконка | Что делает | Ограничение по времени |
|---|
math | × | Умножение 5-значных чисел | 30 с |
string | ↔ | Реверс строки из 60–80 случайных символов | 30 с |
count | # | Подсчёт определённого символа в ~250 символах | 30 с |
sort | ⇅ | Сортировка 15 чисел, вернуть k-е наименьшее | 30 с |
binary | 01 | Декодирование двоичных октетов в ASCII | 30 с |
| Генерация задач и криптографическая проверка |
@mondaycom/hatcha-react | React-компонент, провайдер и стили |
@mondaycom/hatcha-server | Обработчики для Next.js и Express |