Foros del Web » Programación para mayores de 30 ;) » Programación General »

envio de sms

Estas en el tema de envio de sms en el foro de Programación General en Foros del Web. hola a to2. Este cgi me lo ha proporcionado un proveedor de sms para poder enviar a través de mi pagina web mensajes sms. El ...
  #1 (permalink)  
Antiguo 18/11/2004, 11:50
 
Fecha de Ingreso: septiembre-2003
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 0
envio de sms

hola a to2.
Este cgi me lo ha proporcionado un proveedor de sms para poder enviar a través de mi pagina web mensajes sms.
El problema que tengo es que este ejemplo es válido para enviar a un sólo num de telefono,
en cambio me gustaría modificarlo y que la variable dst que contiene el num de telf, pase a ser un array,
es decir pasarle yo los numeros de telf separados por comas: ej:221234568,644444444
y luego que el cgi me los convierta en array y realize un bucle para enviar a los diferentes num.
Mi problema es que no tengo NI IDEA DE CGI y PERL y por cada prueba que realizo me descuentan créditos .
Si alguien me pudiese echar una mano se lo agradecedia.


Código:
 #!/usr/bin/perl
#=============================================================
$DEBUG=0; 
use IO::Socket;

#====================================#
# Read numbers and text
#====================================#
&ReadParse;

$HOST="nombredelhost";
$SMS_USER="$in{'login'}";
$SMS_PASS="$in{'password'}";

$texto=$in{'msg'};
$texto=~s/\n//g;
$texto=~s/\r//g;
$DEST_NUM[0]="+34".$in{'dst'};

print "Content-type: text/html\n";
print "Cache-Control: no-cache, must-revalidate\n";
print "Pragma: no-cache\n";
print "Expires: 0\n\n";

if (length ($texto) > 160) {
	$texto=substr ($texto,0,160);
}

#====================================#
# Socket
#====================================#
if ($SOCK=IO::Socket::INET->new(PeerAddr=>$HOST, Proto=>'protocoloautilizar'))
{
	select (STDOUT); $| = 1;
	select ($SOCK);  $| = 1;
	select (STDOUT);

	#===================================#
	# Parsea respuesta
	#===================================#
	&login;
	&dst;
	&texto;
	&envia;

	while( $linia = <$SOCK> ) {

		print "->>> $linia" if $DEBUG;
		($instr, $code, $reply) = split(" ",$linia,3);

		if( $code =~ m/OK/ && $instr==1 ) {
			$CREDITO_INI=$reply;
			print STDOUT "\nCréditos disponibles: $reply\n" if $DEBUG;
		}

		if( $code =~ m/REJDST/ ) {
			print STDOUT "Rechazado $reply" if $DEBUG;
		}

		if ( $code =~ m/OK/ && $instr==$FLAG ) {
			($CREDITO_FIN,$CREDITO_INT)=split(" ",$reply,2);
			print STDOUT "Enviado OK, saldo disponible: $CREDITO_FIN\n" if $DEBUG;
			$errtxt="OK $CREDITO_FIN\n";
			&quit;
 }

	}

	chomp($CREDITO_FIN);
	$CREDITO_FIN=$CREDITO_FIN+0;
	if ( $CREDITO_FIN < 1 ) {
		print "ERROR Parametros\n\n";
		exit 0;
	} else {
		print "$errtxt\n";
		exit 0;
	}

} else {
	print "ERROR Socket\n";
	exit 0;
}


$CREDITO_INI=~ s/\n\r//g;
$CREDITO_FIN=~ s/\n\r//g;
$SMS_SENT=$CREDITO_INI - $CREDITO_FIN;

exit 0;

#==================================#
# Login
#==================================#
sub login {
	$INSTR=1;
	print $SOCK  "$INSTR login $SMS_USER $SMS_PASS\n";
	print STDOUT "$INSTR login $SMS_USER $SMS_PASS\n" if $DEBUG;
	$LOGIN=1;
}

#==================================#
# Bucle de envio
#==================================#
sub dst {
	for ($i=0;$i<@DEST_NUM;$i++) {
		$INSTR++;
		print $SOCK "$INSTR dst $DEST_NUM[$i]\n";
		print STDOUT "$INSTR dst $DEST_NUM[$i]\n" if $DEBUG;
	}
}

#==================================#
# Finalizar conexión
#==================================#
sub quit {
	$INSTR++;
	print $SOCK "$INSTR quit\n";
	print STDOUT "$INSTR quit\n" if $DEBUG;
}

#==================================#
# Lee texto
#==================================#
sub texto {

	$INSTR++;
	print $SOCK "$INSTR msg $texto\n";
	print STDOUT "$INSTR msg $texto\n" if $DEBUG;
}

#==================================#
# Envia
#==================================#
sub envia {
	$INSTR++;
	print $SOCK "$INSTR envia\n";
	print STDOUT "$INSTR envia\n" if $DEBUG;
	$FLAG=$INSTR;
	$END=1;
}

#==================================#
# Lee la entrada del formulario
#==================================#
sub ReadParse {

	local (*in) = @_ if @_;
	local ($i, $key, $val);

	if ( $ENV{'REQUEST_METHOD'} eq "GET" ) {
		$in = $ENV{'QUERY_STRING'};
	} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
	} else {
		# Added for command line debugging
		# Supply name/value form data as a command line argument
		# Format: name1=value1\&name2=value2\&...
		# (need to escape & for shell)
		# Find the first argument that's not a switch (-)
		$in = ( grep( !/^-/, @ARGV )) [0];
		$in =~ s/\\&/&/g;
	}

	@in = split(/&/,$in);

	foreach $i (0 .. $#in) {
		# Convert plus's to spaces
		$in[$i] =~ s/\+/ /g;

		# Split into key and value.
		($key, $val) = split(/=/,$in[$i],2); # splits on the first =.

		# Convert %XX from hex numbers to alphanumeric
		$key =~ s/%(..)/pack("c",hex($1))/ge;
		$val =~ s/%(..)/pack("c",hex($1))/ge;

		# Associate key and value. \0 is the multiple separator
		$in{$key} .= "\0" if (defined($in{$key}));
		$in{$key} .= $val;
	}
	return length($in);
}
__________________
---Nuestra recompensa se encuentra en el esfuerzo y no en el resultado. Un esfuerzo total es una victoria completa.-- GHANDI
  #2 (permalink)  
Antiguo 24/11/2004, 11:09
 
Fecha de Ingreso: septiembre-2003
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 0
hola de nuevo,
bueno he intentado crear el array y el bucle,
agradeceria que alguien me dijese si es o no correcto, nunca he programado con PERL,no puedo hacer muchas pruebas con el código pq los creditos que tengo de prueba estan limitados..

bueno lo dejo:





#!/usr/bin/perl
#================================================= ============
$DEBUG=0;
use IO::Socket;



#====================================#
# Read numbers and text
#====================================#
&ReadParse;

$HOST="hostdeenvio";
$SMS_USER="$in{'login'}";
$SMS_PASS="$in{'password'}";

$texto=$in{'msg'};
$texto=~s/\n//g;
$texto=~s/\r//g;


print "Content-type: text/html\n";
print "Cache-Control: no-cache, must-revalidate\n";
print "Pragma: no-cache\n";
print "Expires: 0\n\n";

#esto es mio
@numeros = split(/;/, $in{'dst'});
foreach $elemento (@numeros) {

$DEST_NUM[0]="+34".$elemento;

if (length ($texto) > 160) {
$texto=substr ($texto,0,160);
}

#====================================#
# Socket
#====================================#
if ($SOCK=IO::Socket::INET->new(PeerAddr=>$HOST, Proto=>'protocolo'))
{
select (STDOUT); $| = 1;
select ($SOCK); $| = 1;
select (STDOUT);

#===================================#
# Parsea respuesta
#===================================#
&login;
&dst;
&texto;
&envia;

while( $linia = <$SOCK> ) {

print "->>> $linia" if $DEBUG;
($instr, $code, $reply) = split(" ",$linia,3);

if( $code =~ m/OK/ && $instr==1 ) {
$CREDITO_INI=$reply;
print STDOUT "\nCréditos disponibles: $reply\n" if $DEBUG;
}

if( $code =~ m/REJDST/ ) {
print STDOUT "Rechazado $reply" if $DEBUG;
}

if ( $code =~ m/OK/ && $instr==$FLAG ) {
($CREDITO_FIN,$CREDITO_INT)=split(" ",$reply,2);
print STDOUT "Enviado OK, saldo disponible: $CREDITO_FIN\n" if $DEBUG;
$errtxt="OK $CREDITO_FIN\n";
&quit;
}

}

chomp($CREDITO_FIN);
$CREDITO_FIN=$CREDITO_FIN+0;
if ( $CREDITO_FIN < 1 ) {
print "ERROR Parametros\n\n";
exit 0;
} else {
print "$errtxt\n";
exit 0;
}

} else {
print "ERROR Socket\n";
exit 0;
}


$CREDITO_INI=~ s/\n\r//g;
$CREDITO_FIN=~ s/\n\r//g;
$SMS_SENT=$CREDITO_INI - $CREDITO_FIN;

exit 0;
}


#==================================#
# Login
#==================================#
sub login {
$INSTR=1;
print $SOCK "$INSTR login $SMS_USER $SMS_PASS\n";
print STDOUT "$INSTR login $SMS_USER $SMS_PASS\n" if $DEBUG;
$LOGIN=1;
}

#==================================#
# Bucle de envio
#==================================#
sub dst {
for ($i=0;$i<@DEST_NUM;$i++) {
$INSTR++;
print $SOCK "$INSTR dst $DEST_NUM[$i]\n";
print STDOUT "$INSTR dst $DEST_NUM[$i]\n" if $DEBUG;
}
}

#==================================#
# Finalizar conexión
#==================================#
sub quit {
$INSTR++;
print $SOCK "$INSTR quit\n";
print STDOUT "$INSTR quit\n" if $DEBUG;
}

#==================================#
# Lee texto
#==================================#
sub texto {

$INSTR++;
print $SOCK "$INSTR msg $texto\n";
print STDOUT "$INSTR msg $texto\n" if $DEBUG;
}

#==================================#
# Envia
#==================================#
sub envia {
$INSTR++;
print $SOCK "$INSTR envia\n";
print STDOUT "$INSTR envia\n" if $DEBUG;
$FLAG=$INSTR;
$END=1;
}

#==================================#
# Lee la entrada del formulario
#==================================#
sub ReadParse {

local (*in) = @_ if @_;
local ($i, $key, $val);

if ( $ENV{'REQUEST_METHOD'} eq "GET" ) {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
} else {
# Added for command line debugging
# Supply name/value form data as a command line argument
# Format: name1=value1\&name2=value2\&...
# (need to escape & for shell)
# Find the first argument that's not a switch (-)
$in = ( grep( !/^-/, @ARGV )) [0];
$in =~ s/\\&/&/g;
}

@in = split(/&/,$in);

foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;

# Split into key and value.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.

# Convert %XX from hex numbers to alphanumeric
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;

# Associate key and value. \0 is the multiple separator
$in{$key} .= "\0" if (defined($in{$key}));
$in{$key} .= $val;
}
return length($in);
}
__________________
---Nuestra recompensa se encuentra en el esfuerzo y no en el resultado. Un esfuerzo total es una victoria completa.-- GHANDI

Última edición por Motki; 24/11/2004 a las 11:12
  #3 (permalink)  
Antiguo 25/11/2004, 05:10
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
Holo...Tengo una sola pregunta, cuando haces

#esto es mio
@numeros = split(/;/, $in{'dst'});
foreach $elemento (@numeros) {

$DEST_NUM[0]="+34".$elemento;

if (length ($texto) > 160) {
$texto=substr ($texto,0,160);
}

Estás empezando un bucle foreach, que hace un montón de cosas, y a lo último tiene un exit 0; con lo cual ese bucle tuyo solo se ejecutará la primera vez y cuando termine de procesar el primer elemento en vez de pasar al segundo se saldrá del programa....Entonces no te sirve de nada el foreach, lo que denbes hacer es sacar el exit 0; afuera del foreach...

foreach ...{
...
}
exit 0;

fíjate eso, es lo único que le encontré...

Saludos
__________________
Esteban Quintana
  #4 (permalink)  
Antiguo 25/11/2004, 06:48
 
Fecha de Ingreso: septiembre-2003
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 0
hola monoswim, gracias por tu respuesta.

es vedad, que el exit deberia estar fuera del bucle,
lo he sacado pero continua sin realizarlo. Solo lo ejecuta una vez..

:(
__________________
---Nuestra recompensa se encuentra en el esfuerzo y no en el resultado. Un esfuerzo total es una victoria completa.-- GHANDI
  #5 (permalink)  
Antiguo 25/11/2004, 07:37
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
fíjate si eso de los créditos no te está agotando con el primer envío, puede ser que tenga una traba en alguna de esas variables que verifica qen cada uno de los pasos...

if ( $CREDITO_FIN < 1 ) {

fíjate que tienes varios condicionales de este tipo...

Saludos
__________________
Esteban Quintana
  #6 (permalink)  
Antiguo 25/11/2004, 09:59
 
Fecha de Ingreso: septiembre-2003
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 0
ummm.. pero tengo creditos suficientes , estoy enviando solamente a dos móviles..
¿Sabes como podria hacer para imprimir el valor de las variables peo que no realizase el proceso de envio?
__________________
---Nuestra recompensa se encuentra en el esfuerzo y no en el resultado. Un esfuerzo total es una victoria completa.-- GHANDI
  #7 (permalink)  
Antiguo 25/11/2004, 10:19
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
en la función que tienes

sub envia {
$INSTR++;
print $SOCK "$INSTR envia\n";
print STDOUT "$INSTR envia\n" if $DEBUG;
$FLAG=$INSTR;
$END=1;
}

en vez de hacer

print $SOCK "$INSTR envia\n";

hacé

print "$INSTR envia\n";

con eso en vez de enviarlo a socket lo imprimes por pantalla

y en

$FLAG=$INSTR;
$END=1;

la puede estar finalizando la operatoria, fíjate que coloca $END=1; intená dejarla en 0 y colocarle 1 cuando terminas el nucle, talvez es eso...

Saludos
__________________
Esteban Quintana
  #8 (permalink)  
Antiguo 26/11/2004, 06:56
 
Fecha de Ingreso: septiembre-2003
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 0
he puesto debug=1 y he comentado la linea que me dijistes de envio.
he obtenido esto:

Código:
 
1 login xxxxxx xxxxx 2 dst +34666666666 3 msg Prueba de envio de correo 4 envia ->>> 1 OK 38 25 Créditos disponibles: 25 ->>> 2 OK 1 ->>> 3 OK ->>> 1 ping 5101470xxx ->>> 2 ping 5101470xxx ->>> 3 ping 5101470xxx ->>> 4 ping 1101470xxx ->>> 5 ping 1101470xxx ->>> 6 ping 5101470xxx ->>> 7 ping 1101470xxx ->>> 8 ping 5101470xxx ->>> 9 ping 1101470xxx ->>> 10 ping 5101470xxx ->>> PING TIMEOUT ERROR Parametros 
1 login xxxxxx xxxxx 2 dst +34666666661 3 msg Prueba de envio de correo 4 envia ->>> 1 OK 38 25 Créditos disponibles: 25 ->>> 2 OK 1 ->>> 3 OK ->>> 1 ping 5101470xxx ->>> 2 ping 5101470xxx ->>> 3 ping 5101471xxx ->>> 4 ping 1101471xxx ->>> 5 ping 5101471xxx ->>> 6 ping 5101471xxx ->>> 7 ping 5101471xxx ->>> 8 ping 5101471xxx ->>> 9 ping 5101471xxx ->>> 10 ping 5101471xxx ->>> PING TIMEOUT ERROR Parametros
he deducido que como he comentado la linea de envio no los puede enviar..
sim embargo si que realiza el bucle es decir intenta enviar para el primer num y luego para el segundo...
__________________
---Nuestra recompensa se encuentra en el esfuerzo y no en el resultado. Un esfuerzo total es una victoria completa.-- GHANDI

Última edición por Motki; 26/11/2004 a las 06:57
  #9 (permalink)  
Antiguo 26/11/2004, 08:13
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
entonces porque razón te envía solo el primero ?????

te fijaste lo de la variable $end ?

Saludos
__________________
Esteban Quintana
  #10 (permalink)  
Antiguo 29/11/2004, 04:21
 
Fecha de Ingreso: septiembre-2003
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 0
Hola de nuevo monoswim,

El viernes pasado despues de ver que teoricamente funcionaba decidí volver a enviar con el debug=1 para ver lo que pasaba..
Quité el exit 0 del
if ( $CREDITO_FIN < 1 ) {
print "ERROR Parametros\n\n";
exit 0;
} else {
print "$errtxt\n";
exit 0;
}

} else {
print "ERROR Socket\n";
exit 0;
}

y me funcionó! (bueno, el sms lo recibí 1 hora despues, pero eso ya es problema del proveedor, hoy he vuelto ha realizar la misma prueba y lo he recibo al instante)
Ahora solo espero que quitándole el debug=1 funcione todo ok.

Gracias por tu ayuda, ya que la sintaxis de PERL no la conozco y me resultaba un poco dificil identificar ciertas cosas.

:)
__________________
---Nuestra recompensa se encuentra en el esfuerzo y no en el resultado. Un esfuerzo total es una victoria completa.-- GHANDI
  #11 (permalink)  
Antiguo 02/12/2004, 05:11
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
De nada y felicitaciones !!!!
__________________
Esteban Quintana
  #12 (permalink)  
Antiguo 06/12/2004, 05:58
 
Fecha de Ingreso: septiembre-2003
Mensajes: 116
Antigüedad: 20 años, 7 meses
Puntos: 0
Ei hola Motki podrías mostrar el script entero aquí? Es que me es muy interesante y no se programar PERL.

Muchas gracias :)
  #13 (permalink)  
Antiguo 06/12/2004, 05:59
 
Fecha de Ingreso: septiembre-2003
Mensajes: 116
Antigüedad: 20 años, 7 meses
Puntos: 0
Una preguntita final, habría alguna forma de mezclar un poco perl y un poco PHP. Es que tengo los números de móvil en un base de datos MySQL y me gustaría que el script de perl enviase un mensaje a esos móviles. Como se podría hacer?

Venga, un saludo.
  #14 (permalink)  
Antiguo 06/12/2004, 10:46
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
Una aplicación web puede estar escrita en varios lenguajes, algunos scripts en perl y otros en PHP, igualmente yo prefiero hacer todo el PERL...

En PERL tienes el módulo DBI que te conecta con cualquier base de datos...

Checkea en el FAQ de este foro y en la sección de tutoriales de www.perlenespanol.com

Saludos
__________________
Esteban Quintana
  #15 (permalink)  
Antiguo 06/12/2004, 10:47
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
ha, y me olvidaba, si quieren que coloque el script en el FAQ avísenme !!!

Saludos
__________________
Esteban Quintana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:13.