NapNodes

← Guías de Bots de Discord

Bots de Discord · actualizada el 25 de octubre de 2026

Bot de verificación para Discord en Python: un botón y una pregunta antes de entrar

Un bot de verificación deja a quien entra en un solo canal hasta que pulsa un botón y contesta una pregunta; entonces le da un rol y ve el resto del servidor. Frena las cuentas automáticas de spam sin pedir nada fuera de Discord. Aquí lo tienes completo en Python, con discord.py, y cómo dejarlo encendido.

¿Se lo pasas a tu grupo?WhatsApp

Antes del bot: lo que Discord ya trae

Discord tiene un nivel de verificación en los ajustes de cada servidor. Según su documentación, son cinco: ninguno; correo verificado; cuenta con más de 5 minutos en Discord; más de 10 minutos dentro de tu servidor; y teléfono verificado. Súbelo antes de nada: no cuesta nada y para mucho spam.

En los servidores de comunidad también se puede pedir que acepten las normas antes de escribir. Mientras no las aceptan, Discord los deja como «pendientes», y la documentación de Discord dice que un miembro pendiente no puede usar botones ni comandos. Si lo tienes activado, el orden es: primero aceptan las normas y después pulsan el botón de tu bot.

El bot añade lo que Discord no hace: una pregunta que una cuenta automática no contesta, y un rol que abre los canales solo a quien la ha contestado.

¿Prefieres no montarlo tú? Hosting de bots de Discord desde 1,50 € al mes, sin permanencia y con devolución íntegra en 72 horas. O crea un bot de Discord gratis, sin tarjeta.

1. Prepara el servidor: un rol y un canal

  1. Crea el rol «Verificado»

    En los ajustes del servidor → «Roles», crea un rol «Verificado» con el permiso «Ver canales». A @everyone quítale «Ver canales»: así, sin el rol no se ve nada.

  2. Crea el canal de verificación

    Un canal de texto, por ejemplo #verificación, que @everyone sí pueda ver (en «Editar canal» → «Permisos», «Ver canales» permitido para @everyone y «Enviar mensajes» denegado: solo hace falta el botón).

  3. Copia el ID del rol

    Activa el modo desarrollador (ajustes de usuario → «Avanzado»), haz clic derecho en el rol «Verificado» y «Copiar ID del rol». Lo pondrás en el .env.

2. Invita al bot con «Gestionar roles»

Si aún no tienes la aplicación ni el token, sigue el primer paso de la guía del bot de Discord en Python. Para este bot, en el enlace de invitación marca «bot» y «applications.commands» y los permisos «Ver canales», «Enviar mensajes» y «Gestionar roles». Te saca el enlace la calculadora de permisos de bot.

Lo que más falla: un bot solo puede dar roles que estén por debajo del suyo. En «Roles», arrastra el rol del bot (se llama como él) por encima de «Verificado». No necesita ningún intent privilegiado: no lee mensajes, solo atiende el botón.

3. El código completo

Tres ficheros. El botón no caduca (timeout=None y un custom_id fijo) y setup_hook lo vuelve a registrar al arrancar, así que el mensaje que publiques sigue funcionando después de cada reinicio. La pregunta es una suma que cambia cada vez, en una ventana de Discord, y las respuestas solo las ve quien pulsa (ephemeral).

requirements.txt
discord.py
python-dotenv
.env
DISCORD_TOKEN=pega-aquí-tu-token
ROL_VERIFICADO=el-id-del-rol
app.py
import os
import random

import discord
from discord import app_commands
from dotenv import load_dotenv

load_dotenv()

ROL_VERIFICADO = int(os.environ["ROL_VERIFICADO"])  # el ID del rol que da acceso


class Pregunta(discord.ui.Modal, title="Una pregunta rápida"):
    def __init__(self):
        super().__init__()
        # Una suma nueva cada vez que alguien pulsa el botón
        self.a, self.b = random.randint(2, 9), random.randint(2, 9)
        self.respuesta = discord.ui.TextInput(label=f"¿Cuánto es {self.a} + {self.b}?", max_length=3)
        self.add_item(self.respuesta)

    async def on_submit(self, interaction: discord.Interaction):
        if self.respuesta.value.strip() != str(self.a + self.b):
            await interaction.response.send_message("No es correcto. Pulsa el botón y prueba otra vez.", ephemeral=True)
            return
        rol = interaction.guild.get_role(ROL_VERIFICADO)
        await interaction.user.add_roles(rol, reason="Ha pasado la verificación")
        await interaction.response.send_message("¡Listo! Ya puedes ver el resto del servidor.", ephemeral=True)


class Verificar(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)  # sin caducidad: el botón sirve siempre

    @discord.ui.button(label="Verificarme", style=discord.ButtonStyle.success, custom_id="verificacion:boton")
    async def verificar(self, interaction: discord.Interaction, button: discord.ui.Button):
        if interaction.user.get_role(ROL_VERIFICADO):
            await interaction.response.send_message("Ya estás verificado.", ephemeral=True)
            return
        await interaction.response.send_modal(Pregunta())


class MiBot(discord.Client):
    def __init__(self):
        super().__init__(intents=discord.Intents.default())
        self.tree = app_commands.CommandTree(self)

    async def setup_hook(self):
        # Vuelve a atender los botones publicados antes de reiniciar
        self.add_view(Verificar())
        await self.tree.sync()


client = MiBot()


@client.tree.command(name="publicar-verificacion", description="Publica el mensaje con el botón de verificación")
@app_commands.default_permissions(administrator=True)
@app_commands.guild_only()
async def publicar(interaction: discord.Interaction):
    await interaction.channel.send(
        "👋 ¡Bienvenido! Pulsa «Verificarme» y contesta una pregunta para ver el resto del servidor.",
        view=Verificar(),
    )
    await interaction.response.send_message("Publicado.", ephemeral=True)


client.run(os.environ["DISCORD_TOKEN"])

4. Publica el botón y pruébalo

  1. Arranca el bot

    En tu ordenador, con Python 3.10 o más nuevo: pip install -r requirements.txt y python app.py. Si el comando no sale al escribir /, puede tardar un rato la primera vez: por qué no aparecen los comandos de barra.

  2. Publica el mensaje

    En #verificación escribe /publicar-verificacion. Solo lo ven los administradores (default_permissions). El bot deja el mensaje con el botón «Verificarme»; se publica una vez y sirve para siempre.

  3. Pruébalo con otra cuenta

    Entra con una cuenta que no sea administradora (un administrador lo ve todo de todas formas), pulsa el botón, contesta la suma y comprueba que aparecen los canales.

Si el botón falla

«Missing Permissions» (403) en la consola al dar el rol: al bot le falta «Gestionar roles» o su rol está por debajo de «Verificado». Sube su rol en la lista.

Discord dice que la interacción ha fallado («This interaction failed», con Discord en inglés): el bot está apagado, o no se ha registrado el botón al arrancar (falta self.add_view en setup_hook, o el custom_id del código no es el del mensaje publicado). Un botón publicado solo funciona mientras su bot esté encendido.

El rol se da pero no se ven los canales: es un permiso de canal. Algún canal deniega «Ver canales» a «Verificado» o lo permite solo a otro rol; revísalo en «Editar canal» → «Permisos».

¿Prefieres JavaScript? En discord.js es lo mismo con ButtonBuilder, ModalBuilder y member.roles.add; la base del bot está en la guía de discord.js.

Ojo con los «bots de verificación» falsos

Hay estafas con forma de verificación: un bot o un enlace que, para «verificarte», te pide escanear un código QR, entrar con tu cuenta en una web que no es discord.com o ejecutar algo en tu navegador. Con eso se llevan la sesión de tu cuenta. En GitHub hay incluso repositorios que lo dicen en su propia descripción.

La verificación de esta guía nunca sale de Discord: un botón, una ventana de Discord con una pregunta y un rol. Si copias un bot de verificación de internet, lee el código antes de ponerle tu token, y no pidas nada que no sea pulsar un botón. Y si tu token se ha visto alguna vez en público, cámbialo en el portal de desarrolladores («Reset Token»).

Tenerlo encendido siempre

Este bot tiene que estar encendido a todas horas: si está apagado cuando alguien entra, el botón falla y esa persona se queda fuera. En tu ordenador eso es tenerlo encendido día y noche; mejor alojarlo. Opciones gratis y de pago, comparadas, en dónde alojar tu bot de Discord.

En NapNodes hay un bot gratis de 256 MB que no se apaga por estar vacío; se renueva cada 7 días con «Encender» (sus pegas, en esta guía). Créalo, pásalo a Python en «Configuración» → «Lenguaje», sube los tres ficheros en «Archivos» y pulsa «Encender»: las librerías de requirements.txt se instalan solas y app.py es el fichero de inicio que viene puesto. Para que no tengas que renovarlo, el plan Mini (512 MB) está siempre encendido.

Preguntas frecuentes

¿Cómo hago un bot de verificación en Discord?

Con un rol «Verificado» que abre los canales, un canal que todos ven y un bot que da ese rol al pulsar un botón y contestar una pregunta. En discord.py son unas 60 líneas: un View con timeout=None, un Modal con la pregunta y member.add_roles.

¿Por qué mi bot no puede dar el rol de verificado?

Porque le falta «Gestionar roles» o porque su rol está por debajo del que quiere dar. Un bot solo da roles que estén por debajo del suyo: súbelo en «Roles».

¿Por qué el botón de verificación dejó de funcionar al reiniciar el bot?

Porque el botón no se registró otra vez al arrancar. Usa un View con timeout=None, un custom_id fijo y client.add_view() en setup_hook.

¿Es seguro un bot de verificación que pide escanear un QR?

No. Una verificación de verdad no pide escanear un QR ni entrar con tu cuenta en otra web: así se roban cuentas de Discord.

¿Te ha servido esta guía?

¿Lo montamos?

Hosting de bots de Discord desde 1,50 € al mes, sin sobreventa: tu RAM es solo tuya. Y si quieres empezar sin pagar, tienes un bot de Discord gratis, sin tarjeta.

Herramienta gratis: Permisos de un bot de Discord. Marca los permisos de tu bot en castellano y sal con el número y el enlace de invitación; o pega un número y mira qué permisos da.

Sigue leyendo

Todas las guías de Bots de Discord, ordenadas →