Página 1 de 1

Hacer un POST a un login

NotaPublicado: 2012-06-13 02:00 @125
por Leyenda1
Hola, bueno todos, soy nuevo en este foro.

Me gustaría que me guiaran para poder hacer un programa en Perl que haga una POST a un login de una página web y luego de hacerlo verificar hacia donde redirecciona dicha página, ya que cuando uno hace un intento de registro malo, lo redirecciona a http://www.ll.com y cuando se registra correctamente me redirecciona a otra web, ejemplo: http://www.hh.com...

Lo que no puedo hacer es identificar hacia donde me va a redireccionar luego de hacer el POST a la página...

Espero su ayuda.
Gracias de antemano.

Re: Hacer un POST a un login

NotaPublicado: 2012-06-13 07:29 @354
por explorer
Bienvenido a los foros de Perl en Español, Leyenda1.

Lo que sí puedes obtener es la respuesta del POST.

Si se trata de una redirección, vendrá indicada en la cabecera HTTP o en las primeras líneas de la página HTML, con un <meta... refresh>.

Sería algo así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use HTTP::Request::Common qw(POST);
  2. use LWP::UserAgent;
  3. $ua = LWP::UserAgent->new;
  4.  
  5. ## Construimos el POST
  6. my $req = POST 'http://servidor/ruta/al/recurso.html',
  7.           [
  8.               usuario  => 'yomismo',
  9.               password => 'el-que-sea',
  10.           ];
  11.  
  12. ## Hacemos el POST
  13. my $respuesta = $ua->request($req);       # es un objeto de la clase HTTP::Response
  14.  
  15. print $respuesta->as_string;              # sacamos la respuesta a pantalla, para verificar
  16.  
  17. my @redireccion = $respuesta->redirects;  # lista de redirecciones obtenidas
  18.  
  19. print "Redirecciones:\n";
  20. print join("\n", @redireccion), "\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Debes cambiar 'usuario' y 'password' por los nombres de los campos del formulario POST.

Hay un programa, que deberías tener instalado porque viene con Perl, llamado lwp-request, que sirve para hacer POST desde la línea de comandos.

Más información en lwpcook y HTTP::Response.

Re: Hacer un POST a un login

NotaPublicado: 2012-06-14 03:29 @186
por Leyenda1
Gracias por tu pronta respuesta, pues funciona bien, solo que el código que regresa el servidor luego de hacer el POST es el mismo si se loguea bien o mal, lo único que cambia es el location: y muestra a donde redireccionará...

Cómo puedo comparar con un if() ese "location:" para saber si es igual a la página correcta, que me imprima login correcto...

Esto es lo que me imprime:

HTTP/1.1 302 Found
Connection: close
Date: Thu, 14 Jun 2012 08:13:19 GMT
Location: http://www.web.com/index.php?// login correcto
Server: Apache/2.2.16
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/html
Client-Date: Thu, 14 Jun 2012 07:24:30 GMT
Client-Peer: 65.164.151.248:80
Client-Response-Num: 1
Set-Cookie: unh_sess=MDUxMTE5OTIwMDAxOSwyNjE4Mjg1MTcsT
SSUEgRkVSTkFOREVaLDQsMQ%3D%3D; path=/; httponly
X-Powered-By: PHP/5.3.3-7+squeeze9

Re: Hacer un POST a un login

NotaPublicado: 2012-06-14 04:42 @238
por explorer
¿El programa no devuelve nada con @redireccion?

Re: Hacer un POST a un login

NotaPublicado: 2012-06-14 10:44 @488
por Leyenda1
No, solo dice Redirecciones: y no muestra nada. Antes de eso muestra lo que puse arriba :S

Re: Hacer un POST a un login

NotaPublicado: 2012-06-14 11:31 @521
por explorer
Pues entonces se toma el valor de $respuesta->as_string;, y se pasa por una expresión regular, para extraer el valor que nos interesa.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cabecera = $respuesta->as_string;
  2.  
  3. my($location) = $cabecera =~ /Location: (.+)/;
  4.  
  5. print "[$location]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y ya puedes ejecutar un if() para comparar uno con otro.

Re: Hacer un POST a un login

NotaPublicado: 2012-06-14 12:20 @556
por Leyenda1
hago esto y no entra al if()

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($location!="http://www.web.edu/index.php"){
  2.  
  3.                                         print "login correcto";
  4.                                
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Edito:

Ya me funciona. Hice esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($location =~ m/www.web.com/){
  2. print " \n \nlogin correcto\n \n";
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias por tu ayuda, espero seguir aprendiendo más por aquí:

Saludos.

Re: Hacer un POST a un login

NotaPublicado: 2012-06-14 13:04 @586
por explorer
¡Esto es Perl!

Cuando se comparan cadenas de caracteres, hay que usar 'eq' (igualdad) o 'ne' (desigualdad).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($location ne 'http://www.web.com/index.php') {
  2.     print "login correcto\n";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero sí, con una expresión regular ampliamos las posibilidades de concordancia:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($location =~ m/www\.web\.com/) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4