Python-библиотека для Flask, Django и FastAPI. Автоматически определяет пользователей Яндекс Браузера и переходы с поисковика Яндекс — и показывает им капчу с вопросами из ЕГЭ.
Детекция ведётся по нескольким независимым сигналам:
pip install git+https://github.com/RUdolf1517/KremleXYZ-Detect.git
pip install "git+https://github.com/RUdolf1517/KremleXYZ-Detect.git#egg=kremle-detect[flask]"
pip install "git+https://github.com/RUdolf1517/KremleXYZ-Detect.git#egg=kremle-detect[django]"
pip install "git+https://github.com/RUdolf1517/KremleXYZ-Detect.git#egg=kremle-detect[fastapi]"
Обновление до последней версии:
pip install --force-reinstall git+https://github.com/RUdolf1517/KremleXYZ-Detect.git
from flask import Flask from kremle_detect.integrations.flask_ext import KremleFlask app = Flask(__name__) app.secret_key = 'your-secret' kremle = KremleFlask( app, categories=['math', 'physics', 'russian', 'literature'], question_count=15, max_errors=3, ) # Redis для продакшена (несколько воркеров) # from kremle_detect import RedisStorage # kremle = KremleFlask(app, storage=RedisStorage(url='redis://localhost:6379/0'))
# settings.py MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', # ... 'kremle_detect.integrations.django_ext.KremleDjangoMiddleware', ] KREMLE_CATEGORIES = ['math', 'physics', 'russian', 'literature'] KREMLE_QUESTION_COUNT = 15 KREMLE_MAX_ERRORS = 3 # urls.py from kremle_detect.integrations.django_ext import kremle_urls urlpatterns = [ path('kremle/', kremle_urls()), ]
from fastapi import FastAPI from kremle_detect.integrations.fastapi_ext import KremleFastAPI app = FastAPI() kremle = KremleFastAPI( app, categories=['math', 'physics'], question_count=10, secret='your-secret', )
React SPA + FastAPI: включи headless=True на бэке — middleware вернёт JSON 403 вместо редиректа.
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from kremle_detect.integrations.fastapi_ext import KremleFastAPI app = FastAPI() app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"]) kremle = KremleFastAPI(app, secret='your-secret', headless=True)
Пакет kremle-react — готовый React-компонент и хук для SPA. Работает в паре с FastAPI в режиме headless=True.
# Из репозитория: npm install /path/to/KremleXYZ-Detect/kremle-react # Собрать пакет самому: cd kremle-react && npm install && npm run build
import { KremleChallenge } from 'kremle-react' // Показать капчу при 403 от бэкенда function App() { return ( <KremleChallenge challengeUrl="/kremle/challenge" verifyUrl="/kremle/verify" onPass={() => window.location.reload()} onFail={(r) => console.log(`ошибок: ${r.errors}/${r.total}`)} /> ) }
import { useKremle } from 'kremle-react' function MyCaptcha() { const { questions, answers, setAnswer, submit, loading, result } = useKremle() if (loading) return <div>Загрузка...</div> return ( <form onSubmit={(e) => { e.preventDefault(); submit() }}> {questions.map((q, qi) => ( <div key={qi}> <p>{q.q}</p> {q.opts.map((opt, oi) => ( <label key={oi}> <input type="radio" onChange={() => setAnswer(qi, oi)} /> {opt} </label> ))} </div> ))} <button type="submit">Отправить</button> </form> ) }
После установки доступна команда kremle-detect. Для блоклиста, вайтлиста и логов нужен Redis.
kremle-detect help
Redis URL можно задать через переменную окружения: KREMLE_REDIS_URL=redis://localhost:6379/0
Встроенный банк — 60 вопросов ЕГЭ по математике, физике, русскому и литературе. Можно добавить свои или полностью заменить.
MY_QUESTIONS = [
{
"q": "Столица России?",
"opts": ["Москва", "Санкт-Петербург", "Новосибирск", "Казань"],
"ans": 0, # индекс правильного варианта (с нуля)
"category": "geo", # необязательно
},
]
from questions import MY_QUESTIONS # Добавить к встроенным kremle = KremleFlask(app, extra_questions=MY_QUESTIONS) # Только свои (без ЕГЭ) kremle = KremleFlask(app, extra_questions=MY_QUESTIONS, only_extra=True)
Ошибки формата выбрасываются при старте приложения — неверный вопрос не дойдёт до пользователя.