Meteoclimatic

Bricolaje y otras manualidades => Creacion de páginas personales meteorológicas => Mensaje iniciado por: CarlosLSev en 10 de Marzo del 2021, 08:04:08 am

Título: Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 10 de Marzo del 2021, 08:04:08 am
Hola, este script te envía un email si por ejemplo tu fichero realtime.txt no se actualiza en el tiempo que le indíquenos. Muy útil por si se nos queda pillado nuestro pc, Raspberry etc.



php
// Checks to see if a delimited data file is changing or not (flatlined)
// Requires that a text file named flatline-status.txt be on the server with write permissions (CHMOD 666)
// Include this in a page where you want the message to show up if the data is flatlined
// If flatlined an EMail can be sent
// 1-4-09
// 5-9-12 - Updated to PHP 5 timezone function
// 3-8-19 - Fixed some date() issues & removed the mail test variable
// Jim McMurry - jcweather.us - jmcmurry@mwt.net
//
// Configuration
date_default_timezone_set("America/Chicago");       // Zones available at http://us2.php.net/manual/en/timezones.php

$cachefile = 'flatline-status.txt';                 // File to hold cached data for comparison
$watchfile = './clientraw.txt';                     // Data file to watch for changes
$delimit   = " ";                                   // Delimeter used in that file
$offset1   = 4;                                     // Temp
$offset2   = 5;                                     // Humidity
$offset3   = 6;                                     // Baro
$offset4   = 1;                                     // Wind Ave Speed
$offset5   = 72;                                    // DP
$maxage    = 30;                                    // Minutes that the data can remain unchanged w/o email. Recommend minimum 30
$to         = 'Your Email';                    // EMail info
$from      = 'jcweather.us';
$subject   = 'Weather Data Appears Flatlined.';
$subject2  = 'Weather Data Back Online.';
$body      = ' now.  Last data change recorded at ';  // Will go between current date/time & last good date/time in the EMail Body.
$HTMLMsg   = '<div style="text-align:center;">Sorry, Weather Station Data Has Been Disrupted ... Notification Has Been Sent.</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]), 0, 4);        // 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
         }
         echo $HTMLMsg;                                       // put the message on the screen
      } else {
         $status="watching from " . date("g:i a", $cachetime) . ", now " . date("g:i a", $now) . ", static for " . $WatchSpan . " min";
      }
      $now = $cachetime;                                     // leave timestamp as it was for now
   } else {
      if ( $status == "sent" ) {           // mail previously sent            
         mail($to, $subject2 ,"Back active at " . 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("HINT: Manually upload a file named " . $cachefile . " and give it write permissions (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($fd, 8192);
        }
        fclose($fd);
      $rawinfo = preg_replace("/\x0D/", "", $rawinfo);
      $rawinfo = preg_replace("/\x0A/", "", $rawinfo);
        $rawdata = explode ($delimiter, $rawinfo);
    } else {
        $rawdata[0]= -9999;
    }
    return $rawdata;
}
?>


Sacado de https://jcweather.us/scripts.php (https://jcweather.us/scripts.php)


Mi pregunta se podría modificar para que haga lo contrario.
Por ejemplo si le indicamos el valor de lluvia hoy.
Cuando llueva que nos envíe un e-mail.
Para que funcione debe estar instalado, activado y configurado sendmail.
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 10 de Marzo del 2021, 22:32:18 pm
Ummmm lo de modificar scripts.... no es lo mío... probemos este que he creado.

Está en el adjunto de este mensaje y al principio hay que poner unas pocas opciones de configuración:


Código: [Seleccionar]

///////////Configuracion/////////////////////

$realtimefile = '/var/www/html/CumulusMX/realtime.txt';
$realtimecachefile = '/var/www/html/CumulusMX/realtimecache.txt';
$umbraltormenta = 4; //umbral en mm sobre el cual se considera tormenta
$tiempocomprobacion = 10; //minutos para la comprobación de la tormenta
$tiemporeanudacion = 120; //minutos comprobacion de reanudacion de lluvia
$direccionaenviar = '';
$test = false; //true, probar correo. false, no probar

/////////////////////////////////////////////


Las dos primeras opciones para poner la ruta absoluta en la que se encuentra el realtime.txt y la ubicación donde estará el archivo que servirá de comprobación realtimecache.txt que estará por defecto en el mismo sitio que el realtime. Si no lo está mejor ponerlo también en su ruta.

Después viene el umbral de tormenta. Si la cantidad de lluvia caída entre una lectura y otra del realtime es igual o superior a esa cantidad y menor a tiempocomprobacion enviará un correo de tormenta.

Lo recomendable es que el intervalo de ejecución del script en el crontab sea de 10 minutos */10 * * * * php /rutaalscript/correolluvia.php igual que el intervalo de comprobación.

El siguiente campo es el tiempo de reanudación de cuando empiece a llover otra vez. Por ejemplo por defecto están 120 minutos. Si han pasado más de 2 horas desde la última lluvia enviará otro email de que llueve otra vez, todo si no se ha cambiado de día.

El penúltimo campo es a la dirección donde irá el correo. Puede ser la misma que la que envía.

Para probar el envío de correo al último campo test si le ponemos true nos enviará un correo de prueba si ejecutamos el script manualmente en la línea de comandos con php /rutaalscript/correolluvia.php
Ponerlo a false para ejecutarlo normalmente.

Por último y como dices debe de haber un MTA (Agente de transferencia de correo) configurado en la raspi. Yo tengo ssmpt que es muy sencillo y muy ligero y como su nombre indica solo actúa como cliente smtp (que envía correos) y no recibe. Tiene el archivo de configuración en /etc/ssmtp/ssmtp.conf donde se ponen los datos de nuestro smtp (Outlook, Gmail etc etc). PHP usará ese que por defecto será al que apunte /usr/sbin/sendmail

Pruébalo y a ver si funciona como debe en el próximo episodio de lluvia. Lo que lo he probado va ok  :)

Saludos

Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 14 de Marzo del 2021, 18:53:28 pm
Mil gracias!!

En principio se adapta a lo que quiero, finalmente lo use con el valor Intensidad (hr) valor 8 de realtime, tiene mas sentido, o esta lloviendo o no.
Me falta la prueba de fuego, probarlo  Lo que si soy incapaz de ejecutar los php desde cron


si ejecuto crontab -e
al final tengo
/*2 * * * * php /var/www/html/webtest/alertalluvia.php
/*2 * * * * php /var/www/html/webtest/alertarealtime.php

Luego hago service cron restart
Lo puse cada 2 minutos para probarlo.
1.- Es el php que me avisa de que llueve
2.- Es el php que me avisa si el fichero realtime no se esta actualizando.

Y nada como el que oye llover
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 15 de Marzo del 2021, 23:11:15 pm
Veamos ya conseguir ejecutar el php desde cron. Eso sí solo el que tú me hiciste. El que postee aqui no. Si lo ejecutó mano si va. No lo entiendo, pero ya lo investigaré.
Sobre el script, usando el valor 9 de realtime. Cada vez que esté se modifica me envía un email. Sin querer darte más trabajo. Quizás lo ideal sería usando el valor 8 (intensidad). Si la intensidad se modifica que envíe el email (está lloviendo), si se ejecuta el cron cada 10 minutos que haya otro valor donde indicarle el tiempo a ignorarlo para que no envie el email.. Por ejemplo cada 6 horas.
No se si me explique...
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 16 de Marzo del 2021, 11:36:30 am
Mil gracias!!

Lo que si soy incapaz de ejecutar los php desde cron

si ejecuto crontab -e
al final tengo
/*2 * * * * php /var/www/html/webtest/alertalluvia.php
/*2 * * * * php /var/www/html/webtest/alertarealtime.php

Luego hago service cron restart


Las líneas tienen que empezar con */2 no con /*2 y no hace falta reiniciar el servicio de cron.

Veamos ya conseguir ejecutar el php desde cron. Eso sí solo el que tú me hiciste. El que postee aqui no. Si lo ejecutó mano si va. No lo entiendo, pero ya lo investigaré.
Sobre el script, usando el valor 9 de realtime. Cada vez que esté se modifica me envía un email. Sin querer darte más trabajo. Quizás lo ideal sería usando el valor 8 (intensidad). Si la intensidad se modifica que envíe el email (está lloviendo), si se ejecuta el cron cada 10 minutos que haya otro valor donde indicarle el tiempo a ignorarlo para que no envie el email.. Por ejemplo cada 6 horas.
No se si me explique...

El problema de usar la intensidad es que puede variar a más o a menos, por lo que no sabes si es la primera lluvia del día o no, además de tener que estar comprobando cuándo fue la última vez que hubo intensidad. Eso ya lo hace el script con la lluvia del día que es un valor que no mengua y se sabe si sigue lloviendo o no.
En resumen que tendrías que usar el archivo de caché para comprobar el intervalo de lluvia para que no enviase correo cada dos minutos cuando hubiera intensidad igual que ocurre con la lluvia.
No le veo, pues, ninguna ventaja ya que harían lo mismo solo que con distintos valores.

Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 21 de Marzo del 2021, 01:44:21 am
Pues si, me equivoqué al escribirlo aquí.
No me funciona con */10 * * * * php /var/www/html/webtest/alertalluvia.php y si con
*/10 * * * * curl /var/www/html/webtest/alertalluvia.php
Cuando llueva podré probarlo más en condiciones, saludos y gracias
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 21 de Marzo del 2021, 08:08:13 am
Me sorprende que funcione con curl ya que no es una URL sino una ruta local, vamos que probando yo con un archivo php local me dice lo de que no puede resolver la URL.

Tienes instalado php-cli ?? Quizás php se llame con su versión, hay tantas....

Para ver qué tienes instalado de php y qué versión ejecuta sudo dpkg -l | grep php

Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 21 de Marzo del 2021, 15:52:50 pm
Ahora que lo dices ese paquete no lo tenía y lo instalé el otro día. Voy a cambiar curl por php y te digo.
Código: [Seleccionar]
root@meteoviso:~# sudo dpkg -l | grep php
ii  libapache2-mod-php                                          2:7.4+75                                   all          server-side, HTML-embedded scripting language (Apache 2 module) (default)
ii  libapache2-mod-php7.4                                       7.4.3-4ubuntu2.4                           amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  php                                                         2:7.4+75                                   all          server-side, HTML-embedded scripting language (default)
ii  php-auth-sasl                                               1.0.6-3                                    all          Abstraction of various SASL mechanism responses
ii  php-cli                                                     2:7.4+75                                   all          command-line interpreter for the PHP scripting language (default)
ii  php-common                                                  2:75                                       all          Common files for PHP packages
ii  php-curl                                                    2:7.4+75                                   all          CURL module for PHP [default]
ii  php-gd                                                      2:7.4+75                                   all          GD module for PHP [default]
ii  php-mail                                                    1.4.1-1                                    all          Class that provides multiple interfaces for sending emails
ii  php-net-smtp                                                1.9.0-1                                    all          PHP PEAR module implementing SMTP protocol
ii  php-net-socket                                              1.0.14-2                                   all          Network Socket Interface
ii  php-pear                                                    1:1.10.9+submodules+notgz-1ubuntu0.20.04.2 all          PEAR Base System
ii  php-xml                                                     2:7.4+75                                   all          DOM, SimpleXML, WDDX, XML, and XSL module for PHP [default]
ii  php7.4                                                      7.4.3-4ubuntu2.4                           all          server-side, HTML-embedded scripting language (metapackage)
ii  php7.4-cli                                                  7.4.3-4ubuntu2.4                           amd64        command-line interpreter for the PHP scripting language
ii  php7.4-common                                               7.4.3-4ubuntu2.4                           amd64        documentation, examples and common module for PHP
ii  php7.4-curl                                                 7.4.3-4ubuntu2.4                           amd64        CURL module for PHP
ii  php7.4-gd                                                   7.4.3-4ubuntu2.4                           amd64        GD module for PHP
ii  php7.4-json                                                 7.4.3-4ubuntu2.4                           amd64        JSON module for PHP
ii  php7.4-opcache                                              7.4.3-4ubuntu2.4                           amd64        Zend OpCache module for PHP
ii  php7.4-readline                                             7.4.3-4ubuntu2.4                           amd64        readline module for PHP
ii  php7.4-xml                                                  7.4.3-4ubuntu2.4                           amd64        DOM, SimpleXML, XML, and XSL module for PHP
root@meteoviso:~#
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 21 de Marzo del 2021, 17:22:21 pm
Tienes instalada la versión 7.4 de PHP pero debería de ser invocada también solo como php.

Para ver la versión php -v y para ejecutar código php en su línea de comandos (php-cli) usa php -a
para salir exit

Y por cierto, si estás como root no hace falta poner sudo delante, root tiene ya todos los permisos.
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 21 de Marzo del 2021, 20:48:05 pm
Si lo sabia,
root@meteoviso:~# php -v
PHP 7.4.3 (cli) (built: Oct  6 2020 15:47:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
root@meteoviso:~#

En cuanto al comando php -a, entiendo que quieres queejecute el php asi?
Decirte que si ejecuto
php /var/www/html/webtest/alertalluvia.php si me ejecuta el php. Pero si ese mismo comando lo pongo en crontab no
*/10 * * * * php /var/www/html/webtest/alertalluvia.php
Y  asi si va
*/10 * * * * curl www.meteoviso.es/webtest/alertalluvia.php
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 21 de Marzo del 2021, 22:46:15 pm
php -a es para ejecutar comandos de php en la línea de comandos.

Que no vaya en el crontab es raro. Prueba a poner */10 * * * * /usr/bin/php /var/www/html/webtest/alertalluvia.php
Título: Re:Script que envía email si no detecta cambios
Publicado por: jantoni en 23 de Marzo del 2021, 09:23:12 am
Como consejo.

A mi, activar cualquier mailer me da un miedo atroz. Sobre todo Sendmail, que siempre se ha caracterizado por ser un agujero de seguridad.

Os sugiero usar la mensajería de Telegram

Ya hace tiempo, en el subforo de weewx puse las instrucciones.

Yo lo tengo programado para que cada vez que mi Orange Pi o mi Raspberry Pi se reinicien, me manden un mensaje. La Orange se reinicia todos los días, y la Raspi solo cuando se necesita.

Título: Re:Script que envía email si no detecta cambios
Publicado por: jantoni en 23 de Marzo del 2021, 09:28:53 am
Esto es lo que manda
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 23 de Marzo del 2021, 10:00:21 am

A mi, activar cualquier mailer me da un miedo atroz. Sobre todo Sendmail, que siempre se ha caracterizado por ser un agujero de seguridad.

Os sugiero usar la mensajería de Telegram


Yo tampoco uso ningún cliente de correo en la opi como sendmail que está como servicio y con conexiones a los servidores de correo, por eso digo de usar ssmtp que solo envía cuando se le pide el email. Esta es su descripción:

Citar
extremely simple MTA to get mail off the system to a mail hub
 A secure, effective and simple way of getting mail off a system to your
 mail hub. It contains no suid-binaries or other dangerous things - no mail
 spool to poke around in, and no daemons running in the background. Mail is
 simply forwarded to the configured mailhost. Extremely easy configuration.
 .
 WARNING: the above is all it does; it does not receive mail, expand aliases
 or manage a queue. That belongs on a mail hub with a system administrator.

Ni tiene un servicio corriendo y solo envía correo cuando se le pide.

Lo de Telegram, será parecido, solo enviará a Telegram cuando se le pida.



Título: Re:Script que envía email si no detecta cambios
Publicado por: jantoni en 23 de Marzo del 2021, 10:07:18 am
Correcto.

Una ventaja sobre el email sí tiene, y es el evitar el entramado de sistemas antispam.

Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 25 de Marzo del 2021, 15:47:46 pm
php -a es para ejecutar comandos de php en la línea de comandos.

Que no vaya en el crontab es raro. Prueba a poner */10 * * * * /usr/bin/php /var/www/html/webtest/alertalluvia.php

Pues así no funciona.
Como datos a ver si es eso.
Esto lo tengo en servidor vps de alojamiento de la web. Ubuntu 20.04.
Que no es la.raspberry
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 25 de Marzo del 2021, 15:50:04 pm
Interesante, lo mirare y me.planteare no usar sendmail..

Como consejo.

A mi, activar cualquier mailer me da un miedo atroz. Sobre todo Sendmail, que siempre se ha caracterizado por ser un agujero de seguridad.

Os sugiero usar la mensajería de Telegram

Ya hace tiempo, en el subforo de weewx puse las instrucciones.

Yo lo tengo programado para que cada vez que mi Orange Pi o mi Raspberry Pi se reinicien, me manden un mensaje. La Orange se reinicia todos los días, y la Raspi solo cuando se necesita.
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 25 de Marzo del 2021, 16:17:57 pm
which php y te saldrá la ruta donde está el ejecutable de php y que deberás de poner en el crontab como orden para la ejecución del script.

Todo es según el usuario que uses, el crontab que uses (básicamente hay 3) y alguna otra variable como el path.

Cómo esté eso en tu servidor, lo desconozco.



Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 27 de Marzo del 2021, 23:20:07 pm
which php
 la respuesta es /usr/bin/php



No le demos mas vueltas, si funciona con curl...
Si lo ejecuto con crontab el email viene de root
Si lo hago desde el navegador accedieron a la url del php el email viene de www-data
Sera algo de permisos, pero como se dice en la informatica si algo funciona, mejor no lo toques
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 01 de Abril del 2021, 23:57:55 pm
Al final indagando di con la respuesta

AL principio me dejo ejecutar desde cron tu script y luego ya no.
El script de flatline-check, por defecto tanto la ruta de realtime como el fichero cache vienen asi;
$cachefile = 'flatline-status.txt';                 // File to hold cached data for comparison
$watchfile = './clientraw.txt';                     // Data file to watch for changes
yo lo cambie a
$cachefile = 'alertarealtime.txt';                 // File to hold cached data for comparison
$watchfile = 'realtime.txt';                     // Data file to watch for changes

Si accedía con navegador a la ruta del php me funcionaba
Si lo ejecutaba por ssh con php  /var/www/html/webtest/alertalluvia.php funcionaba
Al ejecutarlo desde cron al no tener las rutas daba error y no iva al ejecutarlo con php pero al ejecutarlo con curl si
Por algún motivo cambien la rutas también en tu script y al funcionarme desde el navegador pensé mejor así. Luego me di cuenta del motivo, lo corregí y finalmente los 2 script están funcionando por cron ejecutándose por php y no con curl, cuando pueda mirarle de no hacerlo con sendmail y echare un ojo a lo de telegram.

Si lo se soy un burro harto papeles!!!!!
Pero tenia que dar con la explicacion
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 02 de Abril del 2021, 00:31:06 am
Umm se me olvidaba hoy he podido probar el script que me en hiciste en condiciones reales de lluvia, llovió casi nada 0.2. Me envió el email de primera lluvia, el problema ha sido que al llegar al cambio de día a las 00;00, me ha vuelto a enviar el email de primera lluvia 0.2.  He comprobado el fichero cache y en este sigue estando el valor 0.2
01-04-2021 23:59:53,0.2
Se supone que el script debe poner el fichero cache a 0,0 a las 00;00 pero si cron se ejecuta o a las 23:58 o a la 00:;01 esta orden no se cumple creo
if (date('H:i') == "00:00") file_put_contents($realtimecachefile, $fechar.',0.0');

Alguna forma que al cambiar de día lo ponga a 0 sin ser por la hora, otra opción seria eliminar el fichero cache unos minutos antes de las 00:00
Gracias y perdón que sea tan torpe
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 02 de Abril del 2021, 00:56:11 am
Ya dije en la explicación de las opciones de configuración del script que había que poner la ruta absoluta para el realtime.txt y para el archivo de caché.
Cuando se hace un script para ser ejecutado por cron hay que poner siempre las rutas absolutas.

En cuanto a lo del reseteo de la lluvia ya dije que estaba optimizado para ser ejecutado cada 10 minutos.

Deja esa sección así:

Código: [Seleccionar]
if (!file_exists($realtimecachefile)) file_put_contents($realtimecachefile, $fechar.','.$lluvia);
$realtimecache = explode(',', file_get_contents($realtimecachefile));
$flaglluviacache = 0;
if (substr($realtimecache[0],0,2) != $fecha[0]) {file_put_contents($realtimecachefile, $fechar.',0.0'); $flaglluviacache = 1;}

$fecha = strtotime($fechar);

$fechacache = strtotime($realtimecache[0]);
$lluviacache = $realtimecache[1];
if ($flaglluviacache) $lluviacache = "0.0";
$diff = $fecha - $fechacache;

$difflluvia = $lluvia - $lluviacache;

Eso detectará que si no es el mismo día en el realtime que en el archivo de caché pondrá a cero la lluvia.

P.D. Edito el trozo de script ya que seguiría saliendo el email al comenzar el día. Le he puesto una bandera o flag para saber que es el reseteo y se tenga el valor de 0.0 mm.


Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 04 de Abril del 2021, 09:23:51 am
Ok, gracias de nuevo, ayer por suerte llovió y funcionó bien.
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 05 de Abril del 2021, 13:38:05 pm
Como consejo.

A mi, activar cualquier mailer me da un miedo atroz. Sobre todo Sendmail, que siempre se ha caracterizado por ser un agujero de seguridad.

Os sugiero usar la mensajería de Telegram

Ya hace tiempo, en el subforo de weewx puse las instrucciones.

Yo lo tengo programado para que cada vez que mi Orange Pi o mi Raspberry Pi se reinicien, me manden un mensaje. La Orange se reinicia todos los días, y la Raspi solo cuando se necesita.

Hola, disculpa que te moleste, el otro día mencionaste en un post que enviabas alerta a Telegram cuando la raspberry iniciaba etc.. Estoy buscando en el.subforo de weewx y no doy con el. Puedes pasar enlace?
Gracias
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 05 de Abril del 2021, 16:17:09 pm
Nada, use mal el buscador, y no me di cuenta que solo buscaba en una sección
https://forum.meteoclimatic.net/index.php/topic,2782.msg22053.html#msg22053
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 11 de Abril del 2021, 17:06:31 pm
Veamos, llevo unas horas dandome cabezazos


El final de tu script (mas algo que le puse)
if ($lluvia == 0 or $difflluvia == 0)  exit;
if ($lluviacache == 0 and $lluvia > 0) $mensaje = utf8_decode("Primera lluvia del día "). $lluvia." l  a las ". $now;
if ($difflluvia > 0 and $lluviacache > 0 and $diff >= $tiemporeanudacion * 60) $mensaje = "Vuelve a llover ". $lluvia." l  ha llovido a las". $now;   
if ($difflluvia >= $umbraltormenta and $diff >= $tiempocomprobacion * 60) $mensaje = "Tormenta". $lluvia." l  a las ". $now;


Con la siguiente linea envía el email con el mensaje correspondiente
if ($mensaje) mail($to, $mensaje, date( ""), 'From: ' . $from); 

Como hago para que además lo envié a telegram
La url con los datos correctos me envía a mi el texto $mensaje copiandola y pegandola en el navegador
https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXX/sendMessage?chat_id=YYYYYY&text=$mensaje

XXXX=ID el boot
YYYYY=ID del canal grupo o privado

 
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 11 de Abril del 2021, 17:36:40 pm
file_get_contents('https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXX/sendMessage?chat_id=YYYYYY&text='.$mensaje);

Prueba con file_get_contents. A fin de cuentas realiza un GET http igual que el navegador.

Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 11 de Abril del 2021, 18:39:39 pm
Así no me lanza error, pero tampoco me envía el mensaje a telegram
Pero es algo del php. Si creo un php con esto
$token = "TuTokenAqui";
$id = "IdDelUsuariooCanalAqui";
$urlMsg = "https://api.telegram.org/bot{$token}/sendMessage";
$msg = "Tu mensaje aqui";
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlMsg);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "chat_id={$id}&parse_mode=HTML&text=$msg");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
$server_output = curl_exec($ch);
curl_close($ch);
Y lo abro en el navegador tampoco va
Curioso si abro el navegador con la URL
https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXX/sendMessage?chat_id=YYYYYY&text=Tu mensaje aqui si va

Voy a investigar...
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 11 de Abril del 2021, 20:25:53 pm
Pues para probar he creado un bot de esos y ejecutándolo con file_get_contents envía los mensajes que le pongo.

En el terminal ejecuta php -a y te saldrá la línea de comandos de PHP.

Ponle esta línea

file_get_contents('https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXX/sendMessage?chat_id=YYYYYY&text=prueba');

pon tu bot y chat_id y a ver si te da algún error.

Si no da ningún mensaje lo que has probado es porque la variable $mensaje estará vacía.
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 11 de Abril del 2021, 20:31:22 pm
Como es normal me da error
php > file_get_contents('https://api.telegram.org/botXxxxxxxxxxx/sendMessage?chat_id=yyyyyyy&text=Prueba');
PHP Warning:  file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in php shell code on line 1
PHP Warning:  file_get_contents(): Failed to enable crypto in php shell code on line 1
PHP Warning:  file_get_contents(https://api.telegram.org/botXXXXXXXXXXXX/sendMessage?chat_id=YYYYYYY&text=Prueba): failed to open stream: operation failed in php shell code on line 1
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 11 de Abril del 2021, 20:46:47 pm
Ese certificado (el del SSL de Telegram) no lo reconoce PHP así que lo tira para atrás. Tendrías que ponerle un certificado válido a PHP. Me encontré eso esta mañana. Cogí y puse la última versión de PHP. Problema solucionado. La mayoría de veces se emiten nuevos certificados y si PHP es algo antiguo y también su cacert.pem te sale ese error.

Si quieres probarlo pasando ese error pon lo siguiente:

$opciones = [
    "ssl" => [
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ]
];

file_get_contents('https://api.telegram.org/botXxxxxxxxxxx/sendMessage?chat_id=yyyyyyy&text=Prueba', false, stream_context_create($opciones));
Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 11 de Abril del 2021, 22:21:01 pm
Ese certificado (el del SSL de Telegram) no lo reconoce PHP así que lo tira para atrás. Tendrías que ponerle un certificado válido a PHP. Me encontré eso esta mañana. Cogí y puse la última versión de PHP. Problema solucionado. La mayoría de veces se emiten nuevos certificados y si PHP es algo antiguo y también su cacert.pem te sale ese error.

Si quieres probarlo pasando ese error pon lo siguiente:

$opciones = [
    "ssl" => [
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ]
];

file_get_contents('https://api.telegram.org/botXxxxxxxxxxx/sendMessage?chat_id=yyyyyyy&text=Prueba', false, stream_context_create($opciones));

 apla3 apla3
Sencillamente  funciona, me.vas a tener que poner un botoncito de donaciones  de PayPal, ya te debo unas cervecitas
Título: Re:Script que envía email si no detecta cambios
Publicado por: jmviper en 11 de Abril del 2021, 22:53:24 pm
 *+* *+* *+* *+*

Yo PHP lo tengo siempre a la última versión en mis dispositivos en Linux con el repositorio de https://deb.sury.org/

sudo apt -y install apt-transport-https lsb-release ca-certificates curl

sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

sudo apt update

Con esas líneas se instalan paquetes necesarios, la clave, el repositorio y se actualiza. Luego si se instala un nuevo PHP con sudo apt upgrade se reinicia apache2 con sudo service apache2 restart

Título: Re:Script que envía email si no detecta cambios
Publicado por: CarlosLSev en 11 de Abril del 2021, 23:22:45 pm
*+* *+* *+* *+*

Yo PHP lo tengo siempre a la última versión en mis dispositivos en Linux con el repositorio de https://deb.sury.org/

sudo apt -y install apt-transport-https lsb-release ca-certificates curl

sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

sudo apt update

Con esas líneas se instalan paquetes necesarios, la clave, el repositorio y se actualiza. Luego si se instala un nuevo PHP con sudo apt upgrade se reinicia apache2 con sudo service apache2 restart
Actualizado y ya funciona a pelo sin añadir nada plau2