Bueno, pues hoy he mirado si ha habido error a las 5 a.m. y efectivamente lo ha habido, pero el log no lo ha recogido, y le he preguntado a chatgpt que por qué, y me dice que el error que recogía el bat, era por desconexión, y después caí en la cuenta que a las IA hay que ponerles las peticiones y preguntas muy mascaditas, para que no haya lugar a dudas o interpretación, pues nada, se lo he vuelto a explicar, con mucha paciencia, y me ha creado otro script, que se supone que hace eso, ya veremos mañana cuando lo mire si el error sigue, que seguramente seguirá. También le pregunté a que era debido el error, le pasé el error y la respuesta que me dio fue esta:
Lo que pasa es:
A veces el servidor no reconoce bien el identificador de la estación o la firma (*SIG=... o *COD=...), y te devuelve 401 Unauthorized.
Otras veces sí lo acepta y te responde 202 Accepted.
El warning "Undefined array key 'uin'" indica que al servidor le está llegando la petición sin un parámetro que espera (probablemente el User Identification Number (UIN) o similar en la cabecera/JSON).
👉 Conclusión:
No es un fallo en tu script, sino intermitente en el servidor de Meteoclimatic, que unas veces interpreta bien los datos y otras no.
Vuelvo a pasar el script de meteoclimatic.bat con la corrección para que todos los errores que salgan en los envíos por el motivo que sea, sean incluidos en el log de errores, id comprobándolo ustedes, si te coge despierto a las 5 a.m. jajaja, lo puedes mirar, yo no lo miraré hasta mañana por la mañana, le ha puesto 3 reintentos de envío, a 30 segundos por si falla alguno, si no lo logra, ya espera al siguiente que sería a los 5 minutos:
@echo off
rem #########################################################
REM ## CONFIGURA TU APIKEY AQUÍ ##
REM #########################################################
set apikey=xxxxxxxxxxxxxxxxxxxxxxxx
rem #########################################################
REM ######## NO MODIFICAR NADA A PARTIR DE AQUI #########
rem #########################################################
rem Obtiene la ruta del directorio actual del script
for %%I in (%0) do set "script_dir=%%~dpI"
rem Define la ruta del archivo meteoclimatic.htm
set "datafile=%script_dir%meteoclimatic.html"
rem Define el archivo de log
set "logfile=%script_dir%envios.log"
:loop
rem Comprueba si el archivo meteoclimatic.htm existe
if not exist "%datafile%" (
echo [%date% %time%] El archivo meteoclimatic.html no existe en "%script_dir%". >> "%logfile%"
echo El archivo meteoclimatic.html no existe en "%script_dir%".
goto wait
)
rem Lee el archivo meteoclimatic.html y extrae el codigo de la estacion
for /F "tokens=2 delims==" %%A in ('type "%datafile%" ^| findstr /C:"*COD="') do set "stationCode=%%A"
rem Comprueba si se ha encontrado el codigo de la estacion
if "%stationCode%"=="" (
echo [%date% %time%] No se ha encontrado el codigo de la estacion en el archivo. >> "%logfile%"
echo No se ha encontrado el codigo de la estacion en el archivo.
goto wait
)
rem Define la URL de envio
set "url=https://api.m11c.net/v2/rainbow/weather.txt"
set "resposta=%script_dir%resposta.txt"
rem Intentos de envio
set retries=0
:setcurl
curl --data-urlencode "stationCode=%stationCode%" --data-urlencode "rawData2@%datafile%" -H "APIkey: %apikey%" -X POST -k -o "%resposta%" "%url%"
set err=%errorlevel%
rem Analiza la respuesta del servidor
set "status="
for /f "tokens=2 delims=:" %%S in ('findstr /i "status" "%resposta%"') do set status=%%S
if %err% neq 0 (
echo [%date% %time%] ERROR: Fallo en la ejecucion de la solicitud. Codigo: %err% >> "%logfile%"
echo Fallo en la ejecucion de la solicitud. Reintentando en 30 segundos...
set /a retries+=1
if %retries% leq 2 (
timeout /t 30 /nobreak >nul
goto setcurl
)
goto wait
)
if /i "%status: =%"=="fail" (
echo [%date% %time%] ERROR en envio: >> "%logfile%"
type "%resposta%" >> "%logfile%"
set /a retries+=1
if %retries% leq 2 (
echo Reintentando en 30 segundos...
timeout /t 30 /nobreak >nul
goto setcurl
)
goto wait
)
rem Si todo correcto, muestra respuesta
echo ===============================
echo Respuesta del servidor:
type "%resposta%"
echo ===============================
:wait
rem Espera 5 minutos antes del siguiente envio
timeout /t 300 /nobreak >nul
goto loop