¿Cómo crear un bot de Telegram que prediga el resultado de un partido?

Cómo funciona el bot de Telegram para predicciones deportivas

Un bot de Telegram con predicciones deportivas no es «magia», sino una combinación de varios componentes comprensibles. El usuario envía un comando o mensaje al bot, el bot procesa la solicitud, consulta una API deportiva externa para obtener datos frescos sobre el partido, cuotas y estadísticas, luego calcula la probabilidad del resultado y envía el resultado de vuelta al chat. Un punto importante: Telegram en sí solo es responsable del intercambio de mensajes, mientras que toda la «analítica» y el procesamiento de datos son manejados por su servidor, que está integrado con la API deportiva.

El proceso esquemático se ve así: el usuario selecciona un deporte (fútbol, baloncesto, tenis, deportes electrónicos, etc.), luego un torneo o un partido específico. El bot recupera una lista de eventos disponibles a través de la API, filtrándolos por fecha, torneo o equipo. Después de seleccionar un partido, el script solicita información detallada: alineaciones, estadísticasDelPartido (disparos, posesión, métricas similares a xG), eventos en vivo y bloque oddsBase con coeficientes de casas de apuestas. Basado en estos indicadores, el bot construye un algoritmo de pronóstico simple o avanzado y genera una respuesta en un formato amigable para el usuario.

Usando los datos proporcionados por API de eventos deportivos, es posible implementar no solo predicciones previas al partido, sino también recomendaciones dinámicas en modo en vivo: reaccionando a goles, tarjetas rojas, una serie de ataques peligrosos y cambios en los coeficientes. El bot de Telegram se convierte en un asistente analítico completo que monitorea partidos de fútbol, hockey, baloncesto, tenis de mesa y deportes electrónicos 24/7. Pronto, esto se complementará con un formato de actualización aún más rápido a través de WebSocket y escenarios utilizando modelos de IA para un análisis en profundidad.

Elegir una API para eventos deportivos para predecir los resultados de los partidos

La clave para un bot de Telegram útil y preciso es la elección correcta de la API deportiva. Para tareas de pronóstico, no solo necesitas una lista de partidos, sino datos detallados: el estado actual de la reunión, el marcador, alineaciones, estadísticas avanzadas y coeficientes de casas de apuestas. Esto permite construir modelos que tienen en cuenta tanto la historia como la forma de los equipos, así como las expectativas del mercado. La plataforma api-sport.pro proporciona una API unificada para deportes populares: fútbol, hockey, baloncesto, tenis, tenis de mesa, deportes electrónicos y otras disciplinas que se añaden regularmente al catálogo.

Al elegir un proveedor de datos para tu bot, es importante prestar atención a varios criterios. Primero, la completitud de la información: la disponibilidad de endpoints para partidos, torneos, equipos, jugadores y datos históricos. Segundo, la frecuencia de actualizaciones y el soporte para modo en vivo: sin esto, el bot no podrá responder de manera oportuna a eventos clave en el partido. Tercero, la presencia de un bloque de coeficientes oddsBase, que permite confiar en las estimaciones del mercado sobre los resultados (1X2, totales, hándicaps y otros mercados). Cuarto, documentación transparente y detallada: especificación OpenAPI, ejemplos de solicitudes, descripciones de campos y códigos de error.

Una ventaja separada de la API de api-sport.ru es un formato unificado para diferentes deportes y una estructura de respuesta estable. Por ejemplo, para fútbol, trabajas con la ruta /v2/fútbol/partidos, para baloncesto — con /v2/basketball/matches, pero la lógica de los filtros (fecha, torneo, equipo, estado) sigue siendo predecible. Esto simplifica enormemente el desarrollo del bot: hoy lanzas predicciones para fútbol, y mañana, sin una reestructuración seria del código, agregas hockey o deportes electrónicos. En el futuro, con la aparición de funciones de WebSocket e IA, la API se convertirá en una herramienta aún más conveniente para construir sistemas de pronóstico inteligentes.

Cómo obtener una clave y conectar la API deportiva al bot de Telegram

Para que el bot de Telegram acceda a la API de deportes, necesitas una clave de acceso personal (clave API). El proceso de conexión comienza con el registro en el sistema. Ve a la cuenta personal de API Sport, crea una cuenta y elige el plan tarifario deseado. Después de la activación de las tarifas en la interfaz, aparecerá tu clave API única, que debe ser utilizada en cada solicitud al servidor. Esta clave se pasa en el encabezado Autorización y sirve para la identificación y protección de tu aplicación.

Antes de la integración, se recomienda probar la clave en un entorno de prueba: envía varias solicitudes a los puntos finales /v2/deporte (lista de deportes), /v2/{sportSlug}/partidos (partidos por fecha) y /v2/{sportSlug}/matches/{matchId} (detalles de un evento específico). De esta manera, te asegurarás de que la clave esté activa, los límites estén configurados correctamente y se devuelva un conjunto completo de campos, incluyendo estadísticasDelPartido, eventosEnVivo и oddsBase, que serán necesarios para construir predicciones.

En el código del bot, la conexión se ve lo más simple posible: estableces la URL base https://api.api-sport.ru, formas los encabezados y realizas solicitudes HTTP utilizando tu biblioteca favorita (por ejemplo, solicitudes en Python). A continuación se muestra un ejemplo mínimo de una solicitud para una lista de partidos de fútbol en una fecha específica, que luego puede ser integrada en los controladores del bot de Telegram.

import requests
API_KEY = "ВАШ_API_КЛЮЧ"
BASE_URL = "https://api.api-sport.ru"
headers = {
    "Authorization": API_KEY,
}
params = {
    "date": "2025-09-03",  # дата в формате YYYY-MM-DD
}
response = requests.get(f"{BASE_URL}/v2/football/matches", params=params, headers=headers)
response.raise_for_status()
data = response.json()
print("Всего матчей:", data.get("totalMatches"))

Obtención de datos de partidos y estadísticas de equipos a través de la API

Después de obtener la clave y configurar la conexión básica, puedes pasar a la tarea principal: recopilar datos para predicciones. El punto final de trabajo principal para la mayoría de los escenarios — /v2/{sportSlug}/partidos. Con su ayuda, tu bot de Telegram recibe una lista de partidos filtrados por fecha, torneo, temporada, equipo o estado (por ejemplo, solo eventos próximos con el estado no comenzado o partidos en vivo actuales con el estado en progreso). Esto le da al usuario opciones flexibles: desde «partidos de mi equipo esta semana» hasta «todos los partidos de la Liga de Campeones de hoy».

Para un análisis detallado de un evento específico, se utiliza el punto final /v2/{sportSlug}/matches/{matchId}. En la respuesta, recibes un objeto de partido extendido: torneo, temporada, estadio, alineaciones, marcador actual, minuto del juego (minutoDelPartidoActual), matriz eventosEnVivo y el bloque clave para pronósticos. estadísticasDelPartido — estadísticas estructuradas sobre la posesión del balón, tiros, momentos peligrosos, duelos y otras métricas. También hay oddsBase — un conjunto de mercados con cuotas que se pueden utilizar para evaluar las expectativas de las casas de apuestas y construir tu propio modelo de probabilidad.

A continuación se muestra un ejemplo de una solicitud simple para información detallada del partido y la selección de bloques necesarios para un análisis posterior en el bot. Tal código se puede llamar desde el manejador de comandos /partido o haciendo clic en un botón para un juego específico.

import requests
API_KEY = "ВАШ_API_КЛЮЧ"
BASE_URL = "https://api.api-sport.ru"
SPORT = "football"
MATCH_ID = 14570728  # пример ID матча
headers = {"Authorization": API_KEY}
resp = requests.get(f"{BASE_URL}/v2/{SPORT}/matches/{MATCH_ID}", headers=headers)
resp.raise_for_status()
match = resp.json()
statistics = match.get("matchStatistics", [])
odds_markets = match.get("oddsBase", [])
print("Статистика по периодам:", len(statistics))
print("Доступно рынков коэффициентов:", len(odds_markets))

El mismo esquema se puede aplicar a otros deportes: solo cambia sportSlug (por ejemplo, a baloncesto or deportes electrónicos). Un enfoque unificado de la estructura de datos permite construir bots de Telegram interdeportivos, donde el usuario recibe pronósticos para fútbol, hockey, baloncesto, tenis y tenis de mesa en una sola interfaz. Y con el desarrollo del servicio y la aparición de nuevas disciplinas, tu bot solo se beneficiará, sin requerir una revisión completa de la arquitectura.

Cómo calcular predicciones de resultados de partidos basadas en estadísticas y cuotas

El algoritmo de pronóstico puede ser simple o muy complejo, pero siempre se basa en datos reales. La forma más rápida de obtener una estimación razonable de las probabilidades es utilizar las cuotas de las casas de apuestas del bloque oddsBase. Para el mercado 1X2, tomas las cuotas decimales para la victoria en casa, el empate y la victoria fuera, las conviertes en probabilidades utilizando la fórmula p = 1 / k y las normalizas para que la suma sea igual a uno. De esta manera, el bot obtendrá una evaluación básica de las posibilidades, que ya tiene en cuenta la gran cantidad de análisis incorporados en las líneas de las casas de apuestas.

Además de esta evaluación básica, puedes aplicar ajustes basados en estadísticas de estadísticasDelPartido y datos históricos. Por ejemplo, si un equipo tiene un alto porcentaje de victorias en casa, muchos tiros a puerta y una ventaja en métricas similares a xG, aumentas su probabilidad final en 2-5 puntos porcentuales. De manera similar, puedes reaccionar a eventos en vivo: tarjetas rojas, una serie de momentos peligrosos o dominio en la posesión del balón. Tales reglas se pueden formalizar fácilmente como un conjunto de coeficientes y condiciones en el código del bot, complicando gradualmente el modelo.

Un ejemplo de la función más simple para convertir cuotas 1X2 en probabilidades, que se puede llamar desde el manejador del bot de Telegram después de recibir datos de la API:

def implied_probability(decimal_odds: float) -> float:
    return 1.0 / decimal_odds

def normalize_probabilities(odds_home: float, odds_draw: float, odds_away: float):
    p_home = implied_probability(odds_home)
    p_draw = implied_probability(odds_draw)
    p_away = implied_probability(odds_away)
    total = p_home + p_draw + p_away
    return p_home / total, p_draw / total, p_away / total

# пример использования
odds_home, odds_draw, odds_away = 1.80, 3.50, 4.20
ph, pd, pa = normalize_probabilities(odds_home, odds_draw, odds_away)
print(f"Победа хозяев: {ph:.2%}, ничья: {pd:.2%}, победа гостей: {pa:.2%}")

Puedes mejorar aún más este modelo básico con cualquier factor: forma del equipo en las últimas rondas, estadísticas de enfrentamientos directos, calendario (fatiga después de un calendario apretado), ajustes para un deporte específico. En el futuro, a medida que surjan herramientas de IA en el ecosistema de api-sport.ru, estas tareas se volverán más fáciles de resolver utilizando modelos de aprendizaje automático que se adaptan automáticamente a nuevos datos y comportamientos del mercado.

Código de ejemplo para un bot de Telegram en Python utilizando una API deportiva

A continuación se muestra un ejemplo simplificado de un bot de Telegram en Python, que al recibir el comando /predecir selecciona el partido de fútbol más cercano del día actual, consulta la API de eventos deportivos, extrae las cuotas del mercado 1X2 y calcula las probabilidades de los resultados. Para ejecutarlo, necesitarás un token de bot (obtenido de BotFather) y una clave API del servicio de datos deportivos. Se utiliza el paquete popular como la biblioteca de Telegram. python-telegram-bot, y para solicitudes HTTP — solicitudes.

import os
import datetime as dt
import requests
from telegram import Update
from telegram.ext import Updater, CommandHandler, CallbackContext
API_KEY = os.getenv("SPORT_API_KEY", "ВАШ_API_КЛЮЧ")
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN", "ВАШ_TELEGRAM_ТОКЕН")
BASE_URL = "https://api.api-sport.ru"
SPORT = "football"

def implied_probability(decimal_odds: float) -> float:
    return 1.0 / decimal_odds

def normalize_probabilities(odds_home: float, odds_draw: float, odds_away: float):
    p_home = implied_probability(odds_home)
    p_draw = implied_probability(odds_draw)
    p_away = implied_probability(odds_away)
    total = p_home + p_draw + p_away
    return p_home / total, p_draw / total, p_away / total

def get_today_match():
    today = dt.date.today().isoformat()
    headers = {"Authorization": API_KEY}
    params = {"date": today, "status": "notstarted"}
    resp = requests.get(f"{BASE_URL}/v2/{SPORT}/matches", params=params, headers=headers)
    resp.raise_for_status()
    data = resp.json()
    matches = data.get("matches", [])
    return matches[0] if matches else None

def build_prediction_text(match: dict) -> str:
    home = match["homeTeam"]["name"]
    away = match["awayTeam"]["name"]
    odds_markets = match.get("oddsBase", [])
    market_1x2 = None
    for m in odds_markets:
        if m.get("group") == "1X2":
            market_1x2 = m
            break
    if not market_1x2:
        return f"Матч {home} — {away}Коэффициенты 1X2 недоступны."
    odds_map = {c["name"]: c["decimal"] for c in market_1x2.get("choices", [])}
    odds_home = odds_map.get("1")
    odds_draw = odds_map.get("X")
    odds_away = odds_map.get("2")
    if not all([odds_home, odds_draw, odds_away]):
        return f"Матч {home} — {away}Не удалось получить полный набор коэффициентов."
    ph, pd, pa = normalize_probabilities(odds_home, odds_draw, odds_away)
    text = [
        f"Матч: {home} — {away}",
        f"Дата: {match['dateEvent']}",
        "",
        "Коэффициенты 1X2:",
        f"1: {odds_home}, X: {odds_draw}, 2: {odds_away}",
        "",
        "Оценка вероятностей:",
        f"Победа хозяев: {ph:.1%}",
        f"Ничья: {pd:.1%}",
        f"Победа гостей: {pa:.1%}",
    ]
    return "".join(text)

def start(update: Update, context: CallbackContext) -> None:
    update.message.reply_text(
        "Здравствуйте! Я бот-прогнозист. "
        "Отправьте /predict, чтобы получить прогноз на ближайший матч сегодня."
    )

def predict(update: Update, context: CallbackContext) -> None:
    match = get_today_match()
    if not match:
        update.message.reply_text("На сегодня не найдено предстоящих матчей.")
        return
    # при необходимости можно дополнительно запросить подробности матча по ID
    headers = {"Authorization": API_KEY}
    match_id = match["id"]
    resp = requests.get(f"{BASE_URL}/v2/{SPORT}/matches/{match_id}", headers=headers)
    resp.raise_for_status()
    full_match = resp.json()
    text = build_prediction_text(full_match)
    update.message.reply_text(text)

def main():
    updater = Updater(TELEGRAM_TOKEN)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("predict", predict))
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

Este ejemplo se puede expandir casi infinitamente: añadiendo selección de deportes, filtrando por torneos, soportando predicciones en vivo, mostrando resúmenes en video del campo momentosDestacados, trabajando con Webhook en lugar de polling largo, e integrando con módulos de IA externos. Lo principal es que la base ya está lista: el bot puede interactuar de forma segura con la API, obtener cuotas reales y devolver una predicción estructurada al usuario.

Lanzar y alojar un bot de Telegram con predicciones deportivas en un servidor

Una vez que se implementa la lógica del bot y se configura la integración de la API, el siguiente paso es un lanzamiento adecuado en producción. La forma más fácil es alojar el script en un VPS o servidor dedicado con Python instalado. Es necesario configurar un entorno virtual, instalar dependencias (python-telegram-bot, solicitudes y otros), establecer variables de entorno para el token de Telegram y la clave API del servicio deportivo, y luego ejecutar el proceso en modo 24/7. Para esto, es conveniente usar systemd, supervisor o Docker — de esta manera evitarás tiempos de inactividad durante actualizaciones y reinicios del servidor.

Desde la perspectiva de Telegram, tienes dos modos de operación: polling largo (como en el código de demostración) y Webhook. El primero es más fácil de configurar y adecuado para proyectos pequeños, el segundo es más eficiente y conveniente para escalar, pero requiere un dominio accesible por HTTPS y configuración de solicitudes inversas de Telegram a tu servidor. Al mismo tiempo, puedes trabajar con la API de eventos deportivos utilizando tanto solicitudes HTTP clásicas como, en el futuro, a través de WebSocket, que se planea lanzar en la plataforma. Esto reducirá significativamente la carga al eliminar el polling frecuente de endpoints y recibir actualizaciones sobre partidos y cuotas en modo push.

Para un proyecto serio con predicciones basadas en datos api-sport.pro Es importante pensar en la monitorización y el registro.