Eso ya es algo más complicado.
La petición que indicas es una llamada Ajax con la librería DWR en una petición HTTP.
La librería DWR es conocida y podrías saber su funcionamiento, pero puede ser muy tedioso averiguar cómo intercambia los datos.
Una solución para ver su funcionamiento es hacer un volcado de los paquetes que intercambian el cliente y el servidor.
De resultas de esto, se ve que es una petición POST normal.
Bueno, no tan normal porque hay que hacer unos pequeños cambios en la cabecera, para acomodarla a lo que espera el servidor.
Ejemplo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use HTTP
::Request::Common qw(POST
);
use LWP
::UserAgent;
my $ua = LWP
::UserAgent->new(
agent
=> 'Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.8) Gecko/20071015 SUSE/2.0.0.8-1.1 Firefox/2.0.0.8',
);
my $matricula = '1253-BCN';
my $req = POST
'http://www.juntadeandalucia.es/economiayhacienda/apl/surweb/dwr/call/plaincall/ProxyDWR.invocarPorReflexion.dwr',
Content_Type
=> 'text/plain',
Content
=> <<"EOF",
callCount
=1
page
=/economiayhacienda
/apl
/surweb
/modelos
/modelo621
/621
.jsp
httpSessionId
=0ae2803530d90efa31d72dc24a68aff2f815336f489f
.e38Ob38NahaLbi0LbhqSb3iRcheRe0
scriptSessionId
=96DA3B6AB5E867109CF9AF7A7D6DBD93892
c0
-scriptName
=ProxyDWR
c0
-methodName
=invocarPorReflexion
c0
-id
=0
c0
-param0
=string
:dgt
.AjaxDGT
.devolverDatosMatriculacion
c0
-e1
=string
:$matricula
c0
-param1
=Array
:[reference
:c0
-e1
]
batchId
=14
EOF
;
$req->header(
'Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
'Accept-Language' => 'es,es-es;q=0.8,en;q=0.5,en-us;q=0.3',
'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive' => 300,
'Connection' => 'keep-alive',
'Content-Type' => 'text/plain',
'Referer' => 'http://www.juntadeandalucia.es/economiayhacienda/apl/surweb/modelos/modelo621/621.jsp',
'Cookie' => 'JSESSIONID=0ae2803530d90efa31d72dc24a68aff2f815336f489f.e38Ob38NahaLbi0LbhqSb3iRcheRe0',
'Pragma' => 'no-cache',
'Cache-Control' => 'no-cache',
);
my $respuesta = $ua->request($req)->as_string;
#print $respuesta,"\n";
if ( (my $datos) = $respuesta =~ m/\{(.*)\}/ ) {
foreach ( split q{,}, $datos ) {
my ($tipo, $valor) = split q{:};
printf "%-22s %s\n", $tipo, $valor;
}
}
else {
print "No hubo respuesta\n";
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Obtenemos como salida:
- Código: Seleccionar todo
bastidor "VF1DA0W0523282733"
cilindrada "1390"
errorConexion false
fechaMatriculacion "16/11/2000"
marca "RENAULT"
matriculaIncorrecta false
matriculaInexistente false
modelo "MEGANE COUPE"
nifTitular "15769621Q"
potencia "10.7"
tipoMotor "GASOLINA"
tipoVehiculo "TURISMO"
A destacar que, en lugar de un POST normal, hay que indicar que los parámetros que estamos pasando lo hacen en formato
text/plain.
Es probable que las variables de sesión no sea necesario ponerlas, pero eso ya lo investigarás tu.
Casi todos estos ejemplos se pueden conseguir en
lwpcook,
WWW::Mechanize::Cookbook y
HTTP::Request::Common.
Actualización: el formulario exige ahora la introducción adicional del NIF del propietario.