Skip to content

aiogram adapter

Install: pip install "captchakit[aiogram]".

The adapter exposes a single thin helper — send_captcha — which issues a challenge, uploads the rendered PNG to Telegram via bot.send_photo, and returns the challenge id. State management (pairing the id with the user's eventual reply) belongs to your FSM.

Helper

from captchakit.adapters.aiogram import send_captcha

challenge_id = await send_captcha(
    bot,
    chat_id=user_id,
    manager=manager,
    caption="Solve this to join:",   # optional
    filename="captcha.png",          # optional
)

End-to-end: chat-join verification

from aiogram import F
from aiogram.fsm.context import FSMContext
from captchakit import CaptchaManager, ImageRenderer, MathChallengeFactory, MemoryStorage
from captchakit.adapters.aiogram import send_captcha

manager = CaptchaManager(
    MathChallengeFactory(), ImageRenderer(), MemoryStorage(),
)

@dp.chat_join_request()
async def on_join(req, state: FSMContext):
    cid = await send_captcha(req.bot, req.from_user.id, manager)
    await state.update_data(captcha_id=cid, join_chat_id=req.chat.id)

@dp.message(F.text)
async def on_reply(msg, state: FSMContext):
    data = await state.get_data()
    cid = data.get("captcha_id")
    if cid is None:
        return
    if await manager.verify(cid, msg.text):
        await msg.bot.approve_chat_join_request(
            data["join_chat_id"], msg.from_user.id,
        )
        await state.clear()