Cómo crear un Bot para avisar de tus nuevos vídeos de YouTube en Discord (Sin consumir la API)

Si eres creador de contenido, sabes lo tedioso que es publicar manualmente cada nuevo vídeo en todas tus redes. Aunque existen bots de Discord que hacen esto, muchos son de pago o fallan constantemente por las limitaciones de la API oficial de YouTube.

Hoy vamos a crear nuestro propio script en Python que utiliza el feed RSS oculto de YouTube y los Webhooks de Discord. ¿El resultado? Notificaciones instantáneas, gratuitas y sin límites de cuota, ideal para dejarlo corriendo en un servidor, NAS o Raspberry Pi.

🛠️ Requisitos previos

Para que esto funcione, necesitamos preparar nuestro entorno. Solo necesitas dos cosas:

1. Crear un Webhook en tu servidor de Discord

Los Webhooks son URLs únicas que permiten a aplicaciones externas enviar mensajes a un canal de Discord sin necesidad de programar un Bot complejo.

  1. Ve a tu servidor de Discord y haz clic en la rueda dentada (⚙️) junto al canal donde quieres los avisos.
  2. Navega a Integraciones > Webhooks.
  3. Haz clic en Nuevo Webhook, ponle el nombre y la foto de tu canal, y pulsa Copiar URL del Webhook. Guárdala bien.

2. Instalar Python (Tutorial para Windows)

Si vas a probar o ejecutar el script en tu ordenador con Windows, necesitas tener Python instalado:

  1. Ve a la página oficial python.org/downloads y descarga la última versión para Windows.
  2. Abre el instalador. ¡Paso crucial! Antes de darle a instalar, marca la casilla abajo del todo que dice «Add Python to PATH» (o «Add python.exe to PATH»). Si no marcas esto, los comandos no funcionarán.
  3. Haz clic en Install Now y espera a que termine.
  4. Abre la consola de comandos de Windows (pulsa la tecla Windows, escribe cmd y dale a Enter).
  5. Instala las librerías necesarias ejecutando este comando:
pip install requests feedparser

🔍 El truco: Obtener tu Channel ID real de YouTube

El feed RSS de YouTube no entiende las URLs modernas con arroba (ej: @GambaGamer). Necesitamos tu ID interno que empieza por UC.

Para sacarlo rápido:

  1. Ve a la página principal de tu canal en el navegador.
  2. Haz clic derecho en el fondo y selecciona Ver código fuente de la página (Ctrl + U).
  3. Pulsa Ctrl + F para buscar y escribe: externalId
  4. Justo al lado verás tu ID (algo como "externalId":"UC-V2rbUb3CBa7J2V1t8sncg"). Copia solo la parte que empieza por UC.

💻 Versión 1: Script para un solo canal

Si solo gestionas un canal de YouTube, este código es perfecto para ti. Crea un archivo llamado discord_bot.py y pega esto, recordando cambiar las variables de configuración por tus datos:

import time
import requests
import feedparser
import os

# --- CONFIGURACIÓN ---
WEBHOOK_URL = "PEGA_AQUI_TU_URL_DEL_WEBHOOK"
CHANNEL_ID = "PEGA_AQUI_TU_CHANNEL_ID_QUE_EMPIEZA_POR_UC" 
RSS_URL = f"https://www.youtube.com/feeds/videos.xml?channel_id={CHANNEL_ID}"

LAST_VIDEO_FILE = "ultimo_video.txt"

def get_last_published():
    if os.path.exists(LAST_VIDEO_FILE):
        with open(LAST_VIDEO_FILE, "r") as f:
            return f.read().strip()
    return None

def save_last_published(video_id):
    with open(LAST_VIDEO_FILE, "w") as f:
        f.write(video_id)

def check_new_video():
    try:
        feed = feedparser.parse(RSS_URL)
        if not feed.entries:
            return

        latest_video = feed.entries[0]
        video_id = latest_video.yt_videoid
        video_url = latest_video.link
        title = latest_video.title

        if video_id != get_last_published():
            print(f"Nuevo vídeo detectado: {title}")

            mensaje = {
                "content": f"¡Nuevo vídeo publicado! 🚀\n**{title}**\n{video_url}"
            }

            response = requests.post(WEBHOOK_URL, json=mensaje)

            if response.status_code == 204:
                print("Notificación enviada a Discord.")
                save_last_published(video_id)

    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    print("Bot iniciado...")
    while True:
        check_new_video()
        time.sleep(900) # Comprueba cada 15 minutos (900 segundos)

🚀 Versión 2: Script Multicanal (Recomendado)

Si tienes varios canales (por ejemplo, un canal principal y otro de gameplays), ejecutar varios scripts es ineficiente. Esta versión mejorada utiliza un diccionario para revisar todos tus canales en un solo barrido y guarda el estado en un archivo .json.

import time
import requests
import feedparser
import os
import json

# --- CONFIGURACIÓN ---
WEBHOOK_URL = "PEGA_AQUI_TU_URL_DEL_WEBHOOK"

# Añade tantos canales como quieras: "ID_DEL_CANAL": "Nombre del Canal"
CANALES = {
    "UC-V2rbUbxxxxxxxx": "1º Canal",
    "UC_ID_DEL_SEGUNDO_CANAL_AQUI": "Canal Principal" 
}

STATE_FILE = "estado_canales.json"

def load_state():
    if os.path.exists(STATE_FILE):
        with open(STATE_FILE, "r") as f:
            return json.load(f)
    return {}

def save_state(state):
    with open(STATE_FILE, "w") as f:
        json.dump(state, f)

def check_new_videos():
    state = load_state()
    estado_actualizado = False

    for channel_id, channel_name in CANALES.items():
        rss_url = f"https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"

        try:
            feed = feedparser.parse(rss_url)
            if not feed.entries:
                continue

            latest_video = feed.entries[0]
            video_id = latest_video.yt_videoid
            video_url = latest_video.link
            title = latest_video.title

            if state.get(channel_id) != video_id:
                print(f"Nuevo vídeo en {channel_name}: {title}")

                mensaje = {
                    "content": f"¡Nuevo vídeo en **{channel_name}**! 🚀\n**{title}**\n{video_url}"
                }

                response = requests.post(WEBHOOK_URL, json=mensaje)

                if response.status_code == 204:
                    state[channel_id] = video_id
                    estado_actualizado = True

        except Exception as e:
            print(f"Error comprobando {channel_name}: {e}")

    if estado_actualizado:
        save_state(state)

if __name__ == "__main__":
    print("Bot multicanal iniciado...")
    while True:
        check_new_videos()
        time.sleep(900)

Para probar cualquiera de los scripts en tu ordenador, solo abre la consola cmd en la carpeta donde lo hayas guardado y ejecuta: python discord_bot.py.


🐳 Bonus: Cómo dejarlo 24/7 usando Docker

Si tienes un servidor, un NAS con OpenMediaVault o una Raspberry Pi, la forma más limpia de mantener este script funcionando para siempre es Docker.

Crea dos archivos junto a tu script discord_bot.py:

**1. requirements.txt**

requests
feedparser

**2. docker-compose.yml**

services:
  discord-youtube-bot:
    image: python:3.11-slim
    container_name: bot_discord_youtube
    restart: unless-stopped
    working_dir: /app
    volumes:
      - .:/app
    environment:
      - TZ=Europe/Madrid
    command: >
      bash -c "pip install --no-cache-dir -r requirements.txt && python discord_bot.py"

Abre la terminal de tu servidor en esa carpeta y ejecuta docker compose up -d. ¡Listo! Tu bot ya está dockerizado, funcionando en segundo plano y te avisará en Discord automáticamente cada vez que subas un vídeo.


Categories:


Comments

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies