pnclFEED Clave gratuita

Notas de quickstart

Automatiza el sondeo de cuotas en Windows con el Programador

Usa el Programador de tareas para el quickstart de Python en Windows: una solicitud por ejecución, archivo de cursor, wrapper de variables y log como chequeo.

Windows no tiene cron, pero no lo necesita para este trabajo. El quickstart de Python sondea la API de cuotas en un bucle; en una máquina Windows, el mismo horario corre en el Programador de tareas, con la misma regla que la versión con cron: una ejecución hace una solicitud y termina, y un pequeño archivo lleva el cursor entre ejecuciones. A una ejecución cada 15 minutos tienes 96 solicitudes al día, dentro del presupuesto publicado de la clave gratuita de 100 solicitudes al día y 20 por minuto, como indica la página de precios, verificado el 2026-10-21.

Una ejecución, una solicitud

Saca el bucle del script. Cada ejecución lee el cursor, lo envía como since, imprime lo que cambió, guarda el nuevo cursor y termina:

import json, os, sys, requests

BASE = os.environ["ODDS_BASE_URL"]
KEY = os.environ["ODDS_API_KEY"]
CURSOR = r"C:\odds\cursor.txt"

since = None
if os.path.exists(CURSOR):
    since = open(CURSOR).read().strip()

params = {"sport_id": 2}
if since:
    params["since"] = since

r = requests.get(BASE + "/kit/v1/markets", params=params,
                 headers={"x-portal-apikey": KEY}, timeout=10)
r.raise_for_status()
data = r.json()
open(CURSOR, "w").write(str(data["last"]))
print(f"{len(data['events'])} changed events")

Una ejecución que falla sale con código de error y no hace nada más. La siguiente ejecución programada es el reintento, y el cursor queda intacto, así que nada se pide dos veces y nada se salta.

El wrapper que lleva el entorno

El Programador de tareas inicia las tareas con un entorno mínimo, y las dos variables que el script necesita no están ahí por defecto. La solución limpia es un archivo bat que las define y luego llama a Python:

@echo off
set ODDS_BASE_URL=https://your-base
set ODDS_API_KEY=your-key
"C:\Python312\python.exe" C:\odds\fetch.py >> C:\odds\odds.log 2>&1

Dos detalles suelen morder. Pon la ruta del intérprete entre comillas si tiene espacios y, al crear la tarea, rellena el campo Iniciar en con la carpeta del script, porque el directorio de trabajo de la tarea no es el directorio del script. Las rutas relativas dentro del script se resuelven contra Iniciar en, y por eso la ruta del cursor de arriba es absoluta.

La tarea en sí

Un comando schtasks crea la programación:

schtasks /create /tn OddsPoll /sc minute /mo 15 /tr "C:\odds\run.bat" /rl highest /f

Esto ejecuta el wrapper cada 15 minutos. Abre la tarea en la ventana del Programador de tareas una vez y ajusta la política de solapamiento a no iniciar una nueva instancia: una ejecución lenta nunca se cruza con la siguiente, el mismo papel que flock hace en Linux. La columna Resultado de la última ejecución es el primer lugar a mirar cuando algo falla; 0x0 es éxito y cualquier otro valor es una ejecución fallida, con el motivo en el log.

Mira el log, no la tarea

Sin demonio, el log acumulado es el chequeo de salud. Una línea por ejecución con el recuento de eventos cambiados basta: un día de líneas prueba el ritmo, y un log que deja de crecer apunta a la tarea, no a la API. Revisa primero las rutas entre comillas y las dos variables; ambas fallan en silencio en un contexto programado.

La forma supera al Programador de tareas exactamente donde la versión en bucle lo supera: cuotas más rápidas que una vez por minuto, o caídas que te lleguen solas, pertenecen a una conexión mantenida abierta y a un servicio, no a un programador. Para todo lo que la clave gratuita puede marcar el ritmo, una tarea, un wrapper y un archivo de cursor son la instalación completa.