• Publicidad

Mensajes a móviles con Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Mensajes a móviles con Perl

Notapor Josmanue » 2006-10-25 02:40 @152

Hola aquí estoy con un nuevo desafío, a ver si me podéis echar una manilla.

Necesito hacer un programa que lea unos datos de una base de datos y envíe un mensaje a un teléfono móvil. En concreto, debe estar en un bucle siempre buscando en la tabla 'SOS' si hay algún registro con el campo 'procesado = 0', si es así, saco los campos 'uid', 'fecha' y 'hora' y tengo que mandar un mensaje de texto a un teléfono por ejemplo: "el vehículo 'uid' ha enviado un SOS el 'fecha' a las 'hora' horas" y pongo el campo 'procesado=1'.

Mi primera duda es acerca de este bucle, ¿como puedo hacer para que el programa esté siempre buscando en la tabla? porque supongo que todo el SELECT no puedo meterlo dentro del while ni nada de eso ¿no?

Y la segunda es saber cómo puedo hacer el envío del mensaje al teléfono y si necesito algún módulo especial para ello (el DBI para acceder a la Base de Datos ya está)
El esquema supongo que sería algo parecido a esto:
Código: Seleccionar todo
Programa
Conectar a la Base de Datos
while (hay elementos en la base de Datos con 'procesado = 0')
{
        sacar 'uid', 'fecha' y 'hora'
        construir la cadena $mensaje
        enviar la cadena $mensaje
        poner 'procesado=1' (UPDATE)
}
Fin

¿Alguna sugerencia? GRACIAS.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Publicidad

Notapor explorer » 2006-10-25 04:35 @233

JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-11-08 05:10 @257

Aquí estoy de nuevo. Gracias Explorer por la página que me has puesto, le he estado echando un vistazo pero creo que no van por ahí los tiros.

El servicio ya está implementado y creo que no va a ser muy difícil, al menos eso espero, lo que hay que hacer al final es un post a una pagina web. Supongo que habrá alguna función para hacerlo con Perl. Sería de la siguiente forma:
Código: Seleccionar todo
HOST = "Localhost"
PORT = "puerto"
USERNAME = "username"
PASSWORD = "pass"
....................
y despues:
url ="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%s" /  %  (HOST, PORT, USERNAME, PASSWORD, to, text)

Donde "to" es el número del móvil y "text" es el cuerpo del mensaje.

Así que a ver si me puedes echar una mano porque no se cómo hacerlo en Perl.
Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-11-08 08:12 @383

Nosotros, gracias al gnokii y a un teléfono viejo del cliente, se lo resolvimos. Incluso le sale más barato que contratando un servicio vía web, como habéis hecho vosotros :-)

No hay que hacer ningún POST. Se trata de un GET.

Sólo hay que componer el URL como te lo han indicado en el 'url' y luego hacer una petición web.

Para hacerlo, hay que tener en cuenta:
1) Hay que "escapar" todo el texto 'text' que se mande al teléfono móvil, codificado para que forme parte de un URL. Esto se puede hacer con el módulo URI::Escape (y otros).
2) Los mensajes cortos tienen una longitud máxima de 160 caracteres para los SMS o más si son MMS. Hay que tener cuidado de no sobrepasarlo y averiguar antes si parte del espacio será ocupado por otro texto que no controlemos (publicidad, operador, fecha, etc. etc.) Aquí se utilizan mucho las expresiones regulares de Perl para "comprimir" el texto al lenguaje que utilizan los jóvenes para intercambiarse mensajes.
3) La petición web no es más que un get hecho con el módulo LWP::Simple. Mira el recetario en lwpcook.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-11-09 05:01 @250

A ver, varias dudas, te pongo una idea sobre el programa a ver que te parece, porque no he entendido muy bien eso de escapar todo el texto.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
# Envio de mensajes sos a moviles.

### Librerías ########################################################################
use DBI;
use IO::Select;
use LWP::Simple;

### Modos ############################################################################
use warnings;
 

### Definición de variables ##########################################################
## Base de datos
my $database1 = "database";
my $host1     = "host1";
my $port1     = 3306;
my $user1     = "user";
my $pass1     = "pass1";
my $HOST      = "Localhost";
my $PORT      = "puerto";
my $USER      = "user";
my $PASSWORD  = "pass2";

## Especiales #######################################################################
$|++;    #Elimina el buffer de salida.

### Programa ########################################################################

## Conexión a las bases de datos ####################################################
my $dsn = "DBI:mysql:database=$database1;host=$host1;port=$port1";
my $dbh = DBI->connect($dsn,$user1,$pass1)
    or die $DBI::errstr;


while (algo)
{
        my $sth=$dbh->prepare("SELECT uid, fecha, hora FROM sos_3 WHERE procesado='0'")
            or die $dbh->errstr;
        $sth->execute()        or die $sth->errstr;
        my @orden;
        while (@orden=$sth->fetchrow_array())
        {
            next unless $orden[0];
            my $ordn = 'El vehiculo ';
            $ordn .= "$orden[]";
            $ordn .= ' ha enviado un SOS el ';
            $ordn .= "$orden[]";
            $ordn .= ' a las ';
            $ordn .= "$orden[]";
            print "$ordn\n";
        }
        $SMS = get 'http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%s' /  
        %  (HOST, PORT, USERNAME, PASSWORD, 666666666, ordn)

        $my $sql_sos ="UPDATE sos_3 SET procesado='1';";
        ##print " la cadena sql_sos tiene: $sql_sos\n";
        my $filas = $dbh->do($sql_sos)
                    or die $dbh->errstr;
        print "\$INFOK*\r\n";
       
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


1.- En el while, ¿que puedo poner para que se ejecute siempre?, aunque me parece un poco cutre había pensado simplemente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
i=1;
while(i==1)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


2.- El cuerpo del mensaje en principio está predefinido "El vehículo 'uid' ha enviado un SOS el 'fecha' a las 'hora'" ¿podría construirlo así?? y ¿que tengo que poner entre los corchetes en '$orden[]'? ¿1, 2 y 3 respectivamente? ¿Y como va eso de escapar el texto? ¿No lo cogería de la variable $ordn sin problemas?

3.- He estado leyendo lo del GET, ¿es así como tengo que usarlo? No es necesario decirle que 'ejecute' la variable $SMS ni nada por el estilo ¿no?

Uf! muchas preguntas lo siento.
Gracias. :) :)
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-11-09 06:54 @329

Josmanue escribiste:1.- En el while, ¿que puedo poner para que se ejecute siempre?, aunque me parece un poco cutre había pensado simplemente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
i=1;
while(i==1)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while("algo")
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
:D
No se te olvide poner un sleep para que el programa no se coma los recursos de la máquina.
Josmanue escribiste:2.- El cuerpo del mensaje en principio está predefinido "El vehiculo 'uid' ha enviado un SOS el 'fecha' a las 'hora'" ¿podría construirlo así? y ¿qué tengo que poner entre los corchetes en '$orden[]'? ¿1, 2 y 3 respectivamente? ¿Y cómo va eso de escapar el texto? ¿No lo cogería de la variable $ordn sin problemas?

A ver... la función 'get' del LWP::Simple no tiene ni idea de lo que es un '%s'. Quien sí lo sabe es un sprintf. Úsalo antes del 'get'.
Lo que tienes que poner en los corchetes de @orden depende del orden en que están devueltos con el fetchrow_array.
Una vez que tengas el texto a enviar, debes escaparlo. Ejemplo:
Supongamos que el texto a enviar sea
El vehiculo UID342 ha enviado un SOS el 2006-11-23 a las 12:29
pero no puedes ponerlo tal cual en el URL. Debes escaparlo a:
El%20vehiculo%20UID342%20ha%20enviado%20un%20SOS%20el%202006-11-23%20a%20las%2012%3A29
que ya es una cadena que podrá ser usada directamente con 'get'. Para pasar de una a otra, usa la función uri_escape:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -le 'use URI::Escape; $SMS="El vehiculo UID342 ha enviado un SOS el 2006-11-23 a las 12:29"; print $SMS; print uri_escape $SMS'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Josmanue escribiste:3.- He estado leyendo lo del GET, ¿es así como tengo que usarlo? No es necesario decirle que 'ejecute' la variable $SMS ni nada por el estilo ¿no?
Sólo has de construir el URL y hacer el 'get'. Nada más. De hecho, tu mismo lo puedes hacer 'en directo' escribiéndolo en la dirección de un navegador web.
Última edición por explorer el 2006-11-10 07:38 @360, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-11-09 07:38 @360

Vale, la cadena 'sms' la contruye perfectamente, ahora voy ver si me instalan los módulos LWP::Simple y el URI::Escape y a ver como sale la cadena 'escapada'.
Gracias, pero una cosita más, ¿Cómo y dónde pongo lo del 'sleep'??
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-11-09 07:41 @362

Al final del bucle.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-11-10 06:23 @308

Ya está puesto el 'sleep(10)' por ejemplo, y los módulos ya estan instalados. He probado el envío de los mensajes y funciona.... bueno a medias, tengo puesto:
Código: Seleccionar todo
get 'http://host:port/cgi-bin/sendsms?username=user&password=pass&to=666666666&text=$ordn'

Como esto es público no pongo ni pass ni móvil auténticos.

En $ordn es donde está el cuerpo del mensaje ya escapado y todo. El problema es que lo que me manda es "$ordn" y no el contenido de $ordn. ¿Como puedo hacer para que me imprima el contenido??
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-11-10 07:35 @357

Cambias las ' por ".

Interpolación de variables. Recuerda. Esto es Perl :D
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

cron