Autor Tema: Script que envía un email si no están subiendo datos a meteoclimatic  (Leído 1294 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Hola actualmente uso 2 script que me envían un email si el fichero realtime.txt (fichero que sube CumulusMX cada 10 segundos mi web) no se actualiza o si vuelve actualizarse. Script original https://jcweather.us/flatline-check.zip

Tengo otro que creo jmviper que me envía un email si llueve, vuelve a llover, o si la cantidad de lluvia es superior a una cantidad que se le indique.
Script aquí (ojo hay una actualización del código del script en la 2 pagina del post) https://forum.meteoclimatic.net/index.php/topic,3439.0.html

Me he animado y he "creado", mas bien con lo que ya tenia he apañado otro script  utilizando el original flatline-check que me avisa si no se están subiendo datos a meteoclimatic, igualmente vuelve a avisar cuando vuelve a enviarlo. Creo que puede estar bien por si nuestra estacion se queda atontada y nos avise que no se esta actualizando meteoclimatic.
Estos script los tengo en el servidor web, y no en la raspberry pi, es mas fácil quedarme yo sin Internet,  que falle el sitio web, con lo cual no nos avisaría por eso mejor a la nube. Se programa desde cron cada 8 o 10 minutos y listo.
Primero capturo de la plantilla de meteoclimatic la fecha y hora
Para ello utilice esto:
https://deerme.org/php/capturar-datos-de-otra-web-en-php
Luego utilizo el primer script con alguna pequeña modificacion (con sendmail funcionaba el remitente "From:" pero con ssmtp no) A parte le añadi hora del envió en el asunto, así evito el anidamiento de los mensajes
Código: [Seleccionar]
<?php

$data 
file_get_contents("laurldelaplantillameteoclimatic/");
 
if ( 
preg_match('|<a href="xxxxxxxxxxxxxxxxxxxx(.*?)yyyyyyyyyyyyyyyyy|is' $data $cap ) )
{
   
// echo "".$cap[1];
}
// en xxxxxxxxxxxxx ponemos justo lo que hay delante de fecha y hora y en yyyyyyyy lo que hay después (mejor revisar link esta mejor explicado)
// Configuration
date_default_timezone_set("Europe/Madrid");       // Zones available at http://us2.php.net/manual/en/timezones.php

$ultima $cap[1];                                                       // Valor creado para captura la hora
$ahora date('H:i:s');                                                  //Obtener hora actual y dar formato
$cachefile '/var/www/html/alertameteoclimatic.txt';                 // File to hold cached data for comparison Ruta total a fichero cache
$watchfile '/var/www/html/meteoclimatic.txt';                        // Data file to watch for changes Ruta Total a fichero con los datos capturados
file_put_contents($watchfile$ultima);                     // Esta linea escribe en el fichero el campo capturado
$delimit   " ";                                   // Delimeter used in that file
$offset1   2;                                     //  Uso el 2 en todas, que es el campo hora
$offset2   2;                                     // 
$offset3   2;                                     //  
$offset4   2;                                     // 
$offset5   2
$maxage    1;                                    // Minutes that the data can remain unchanged w/o email. Recommend minimum 30
$to       = 'tuemailaqui@gmail.com';                   // EMail info
$from      'Datos del remitente';
$subject   = ("Los datos no se estan subiendo a Meteoclimatic. "). $ahora//Asunto si no se actualiza
$subject2  = ("Los datos se estan subiendo a Meteoclimatic. "). $ahora;    //Asunto si se esta actualizando
$body      '. Ultima actualizacion a las ';  // Will go between current date/time & last good date/time in the EMail Body.
//$HTMLMsg   = '<div style="text-align:center;">ALERTA, los datos meteorologicos no estan actualizados.</div>'; 
// End of configurable items
$now time();
$newdata get_contents$watchfile $delimit);        // read the target file
$current " (" $newdata[$offset1] . " " $newdata[$offset2] . " " $newdata[$offset3] . " " $newdata[$offset4] . " " $newdata[$offset5] . ")";
$cachedata get_contents$cachefile ",");           // read the cache file
$cachetime $cachedata[0];
if (
$newdata[0] != -9999 && $cachedata[0] != -9999) {   // was able to read the files
$flat = ($newdata[$offset1] == $cachedata[1]) &&
($newdata[$offset2] == $cachedata[2]) &&
($newdata[$offset3] == $cachedata[3]) &&
($newdata[$offset4] == $cachedata[4]) &&
($newdata[$offset5] == $cachedata[5]);      // compare various offsets
$status substr(trim($cachedata[6]), 04);        // capture the "sent" if it's already there
$WatchSpan round(($now $cachetime) / 60);       // minutes since last data change
if ($flat) {
if ($WatchSpan >= $maxage) {                    // wait time is expired
if ( $status != "sent" ) {                  // mail hasn't been sent yet
mail($to$subject date("m-d-y H:i") . $body date"m-d-y H:i"$cachetime) . $current'From: ' $from);
$status ="sent "  date("m-d-y H:i"$now);
} else {
$status trim($cachedata[6]);         // carry over the original entry
}
 $HTMLMsg;                                       // put the message on the screen
} else {
$status="Escuchando desde: " date("g:i a"$cachetime) . ", ahora a las " date("g:i a"$now) . ", sin cambios desde hace " $WatchSpan " min";
}
$now $cachetime;                                     // leave timestamp as it was for now
} else {
if ( $status == "sent" ) {           // mail previously sent
mail($to$subject2 ,"Vuelve a estar activo a las " date("m-d-y g:i a") . $current'From: ' $from);
}
$status="active " date("m-d-y g:i a"$now);
}
$fp fopen($cachefile"w") or die("SUGERENCIA: Sube un fichero llamado " $cachefile " y dale permisos de (CHMOD 666).");
fputs($fp$now "," $newdata[$offset1] . "," $newdata[$offset2] . "," $newdata[$offset3] . "," $newdata[$offset4] . "," $newdata[$offset5] . ", " $status);
fclose($fp);
}   
// else we couldn't read one of the files

function get_contents$rawfile $delimiter) {
    
$rawdata = array();
    
$fd fopen($rawfile"r");
    if (
$fd) {
        
$rawinfo '';
        while (! 
feof ($fd) ) {
            
$rawinfo .= fread($fd8192);
        }
        
fclose($fd);
$rawinfo preg_replace("/\x0D/"""$rawinfo);
$rawinfo preg_replace("/\x0A/"""$rawinfo);
        
$rawdata explode ($delimiter$rawinfo);
    } else {
        
$rawdata[0]= -9999;
    }
    return 
$rawdata;
}

?>




Si hay algún problema con el script o no se puede hacer Scraping, lo borro.

P.D. No se por que motivo si existe algún echo loquesea ademas de ponerlo en pantalla del php al ejecutarlo en el navegador, me los envía por email cada vez que cron se ejecuta, mi solución suprimir los echo, solo me pasa con ssmtp...
« Última modificación: 10 de Abril del 2021, 23:46:57 pm por CarlosLSev »

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía un email si no están subiendo datos a meteoclimatic
« Respuesta #1 en: 11 de Abril del 2021, 13:03:47 pm »
Para ver si el archivo lleva sin ser modificado (y por lo tanto no ha sido escrito):

Código: [Seleccionar]
$plantilla = "rutaplantilla";

if (time() - filemtime($plantilla) > 900) echo "la plantilla está sin actualizar"; //comprueba la fecha actual con la de la última modificación de la plantilla

líneas para enviar correo...

Para comprobar la fecha en el interior de la plantilla:

Código: [Seleccionar]
$plantilla = "rutaplantilla";

if (time() - strtotime(str_replace('/','-',explode('=',implode(preg_grep('/UPD/',file($plantilla))))[1])) > 900) echo "la plantilla está sin actualizar";

líneas para enviar correo...

Me gusta hacer las cosas, si se pueden, en una línea aunque pierdan legibilidad  *+* *+*

Documentación de ssmtp y cómo modificar el From:

https://wiki.archlinux.org/index.php/SSMTP_(Espa%C3%B1ol)

y con cualquier echo en PHP te saldrá el resultado a la salida (stdout).

« Última modificación: 11 de Abril del 2021, 15:25:58 pm por jmviper »


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Script que envía un email si no están subiendo datos a meteoclimatic
« Respuesta #2 en: 11 de Abril del 2021, 16:04:33 pm »
Hola, me pierdo con ese codigo.
Es curioso con gmail no tengo forma,  lo conseguí así ayer con el correo de mi dominio, pero solo me envía el email de prueba activando eso en el script si sale el encabezado especificado en from
$test = true; //true, probar correo. false, no probar
$from = 'ALERTA';
if ($test) {mail($to, "Prueba", ''); exit;}

Cambie el texto de 'From' editando /etc/passwd para recibir correo de 'Mensajexxxx ' en lugar de solo 'root'.
 Me envía el email de  prueba pero si modifico la lluvia a mano no envía nada


Si accedo al log
pone:
554 For explanation visit https://www.ionos.com/help/index.php?id=2425&ip=82.xxxxxx3&c=hd
 investigare....

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía un email si no están subiendo datos a meteoclimatic
« Respuesta #3 en: 11 de Abril del 2021, 20:36:58 pm »
From se edita en /etc/ssmtp/ssmtp.conf

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

Descomenta la última línea para poder poner el From que tú quieras.

En la línea de PHP que lo envía pones:

mail($to, "Prueba", "From: Remitente que yo quiera");






Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es