2010-04-29 31 views
5

Estoy tratando de usar Perl WWW::Mechanize para iniciar sesión en mi banco y extraer la información de la transacción. Después de iniciar sesión a través de un navegador en mi banco (Wells Fargo), muestra brevemente una página web temporal que dice algo como "espere mientras verificamos su identidad". Después de unos segundos, procede a la página web del banco, donde puedo obtener mis datos bancarios. La única diferencia es que la URL contiene varios parámetros más "GET" agregados a la URL de la página temporal, que solo tenía un parámetro de ID de sesión.¿Cómo puedo obtener WWW-Mechanize para iniciar sesión en el sitio web de Wells Fargo?

Pude conseguir con éxito WWW :: Mechanize para iniciar sesión desde la página de inicio de sesión, pero se queda atascado en la página temporal. Hay una etiqueta <meta http-equiv="Refresh" ... en el encabezado, así que probé $mech->follow_meta_redirect pero tampoco me pasó esa página temporal.

Cualquier ayuda para superar esto sería apreciada. Gracias por adelantado.

Aquí está el código de barebones que me consigue atrapado en la página temporal:

#!/usr/bin/perl -w 
use strict; 
use WWW::Mechanize; 

my $mech = WWW::Mechanize->new(); 
$mech->agent_alias('Linux Mozilla'); 

$mech->get("https://www.wellsfargo.com"); 
$mech->submit_form(
    form_number => 2, 
    fields => { 
     userid => "$userid", 
     password => "$password" 
    }, 
    button => "btnSignon" 
); 

Respuesta

2

Tendrá que realizar ingeniería inversa de lo que sucede en esa página intermediario. ¿Utiliza Javascript para establecer algunas cookies, por ejemplo? Mech no analizará ni ejecutará Javascript en una página, por lo que puede tratar de seguir la meta-actualización, pero le falta información crucial sobre lo que debe suceder para la solicitud final.

Intente utilizar una herramienta como Firebug para ver la solicitud que se envía cuando el navegador sigue la meta-actualización. Examine todos los encabezados de solicitud, incluidas las cookies, que se envían para solicitar la página final. Luego usa Mech para duplicar eso.

+0

Gracias por el puntero a Firebug. Lo instalé y noté que hay una línea '' en la página intermedia que se refiere a una función javascript. Supongo que no tengo suerte ya que Mech no puede lidiar con javascript en este momento. –

+1

Puede que no tenga mala suerte, solo necesita averiguar qué están haciendo esas funciones de Javascript y hacer que Mech haga lo mismo. Use Firebug para ver la transacción HTTP. ¿Hay algún campo POST o cookies que no haya visto antes? El JS probablemente los haya agregado, así que agrega las mismas cosas con Mech. – friedo

1

Si conoce la ubicación de la página siguiente se puede tratar de conseguir que después de la fijación de los parámetros de los Rápido usando

$mech->add_header($name => $value); 
+0

Eso agregará un encabezado de solicitud, pero no agregará campos al contenido de solicitud URI o POST. –

3

Lo sentimos, no ha sido años desde que he codificado en Perl. Sin embargo, puesto que no hay "copiar y pegar" responder publicado para esta pregunta, sin embargo, aquí es cómo raspar Wells Fargo en Rubí:

require 'rubygems' 
require 'mechanize' 

username = 'your_username' 
password = 'your_password' 

agent = Mechanize.new 
agent.user_agent_alias = 'Windows IE 6' 

# get first page 
page = agent.get('https://online.wellsfargo.com/signon/') 

# find and fill form 
form = page.form_with(:name => 'Signon')  
form['userid'] = username 
form['password'] = password 
page = agent.submit form 

# find the refresh url 
page.body.match /content="1;URL=(.*?)"/ 
nexturl = $1 

# wait a little while and then get the next page 
sleep 3 
page = agent.get nexturl 

# If you have multiple accounts, you can use this. If you just have a single account, you can remove this block 
companies = [['Account1', '123456789'], 
      ['Account2', '123456789']] 

companies.each do |name, id| 
    form = page.form_with(:name => 'ChangeViewFormBean') 
    form['viewKey'] = id 
    page = agent.submit form 

    available_balance = page.search("#cashTotalAvailBalance").text.strip 

    puts "#{name}: #{available_balance}" 
    sleep 2 
end 

trabajos citados: Hay un tipo que escribió una versión de este script, publicado a su directorio de código y luego reenvió todo a su blog. Su apellido es Youngblood o similar. Encontré la fuente en el archivo de Internet/máquina de regreso y la modifiqué para hacer lo que ves arriba. Entonces, gracias Sr. Youngblood o similar, donde sea que esté - ¡y gracias por enseñarme el truco del meta scrape!

1

Lo primero que necesita saber es esto Javascript o no: se recomienda utilizar el Web Developer (pero es posible utilizar NoScript también) para desactivar Javascript y tratar de acceder a través del navegador (pero primero que hay que borrar todas las cookies relacionadas con su sitio de destino!).

Si todavía (con Javascript desactivado) puede iniciar la sesión que esto no es cuestión Javascript y hay que investigar las cabeceras HTTP (que puede ser coordenadas x, y de la tecla se ha hecho clic, por ejemplo, o unas galletas solamente recibido cuando cargas archivos CSS, etc.).

Recomiendo usar HttpFox para verificar los encabezados HTTP. Debe ejecutar el registro de HttpFox y luego volver a iniciar sesión (por cierto, deshabilitar las imágenes antes de hacerlo reducirá significativamente su registro).Después de eso, debe verificar cada solicitud y la respuesta correspondiente para encontrar dónde se configuran las cookies ocultas o se crea algún parámetro de forma oculta.

Si no puede iniciar sesión después de deshabilitar Javascript de lo que necesita para ver los encabezados también. Debe comparar las cookies proporcionadas en la respuesta del encabezado HTTP con las cookies que tiene en la solicitud posterior. Después de encontrar html con Javascript "malicioso", puede analizar este Javascript para encontrar el algoritmo creado por esta cookie (o param).

Y su último paso será repita esta cookie/form param en usted WWW :: Mechanize request.

+0

! La mayoría de las respuestas suelen proporcionar respuestas de copiar/pegar, ¡usted proporciona la lógica general detrás del proceso! Gracias – deckoff

Cuestiones relacionadas