2011-10-01 18 views
5

Me gustaría iniciar sesión en un sitio web con java. Yo uso el org.apache.http y ya escritoIniciar sesión en el sitio web con java

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost("https://accounts.google.com/ServiceLogin?  service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fhl%3Dsl%26tab%3Dwm%26ui%3Dhtml%26zy%3Dl&bsv=llya694le36z&scc=1&ltmpl=default&"); 
try { 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
nameValuePairs.add(new BasicNameValuePair("vb_login_username", 
        "XXX")); 
nameValuePairs.add(new BasicNameValuePair("vb_login_password", 
        "XXX")); 
post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = client.execute(post); 
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
String line = ""; 
while ((line = rd.readLine()) != null) { 
System.out.println(line); 
      } 
} catch (IOException e) { 
e.printStackTrace(); 
     } 

Se envía el formulario de envío correctamente que he probado, aunque todavía no puede inicio de sesión. El sitio web que quiero iniciar sesión es http://www.xtratime.org/forum/ ¿Alguna idea para esto o hay una manera diferente?

+2

¿Por qué hay todos estos? e espacios después del '?' en la url? –

+1

La URL en su código no coincide con la URL de su sitio web objetivo. ¿No es solo una arenga roja? – BalusC

+0

¿Qué hay en la respuesta HttpResponse? ¿El código de respuesta es 200? ¿Sigue siendo el HTML devuelto la página de inicio de sesión? – jeff

Respuesta

5
<form action="login.php?do=login" method="post" 
    onsubmit="md5hash(vb_login_password, vb_login_md5password, 
     vb_login_md5password_utf, 0)"> 
  • Antes de enviar la página codificar la contraseña (onsubmit). Deberías hacer lo mismo en el código.

  • El valor del atributo action no coincide con su código (https://accounts.google.com...). Debe enviar la solicitud de publicación al login.php?do=login.

Y hay un montón de campos ocultos:

<input type="hidden" name="s" 
    value="b804473163cb55dce0d43f9f7c41197a" /> 

<input type="hidden" name="securitytoken" 
    value="0dcd78b4c1a376232b62126e7ad568e0d1213f95" /> 

<input type="hidden" name="do" value="login" />  

<input type="hidden" name="vb_login_md5password" /> 

<input type="hidden" name="vb_login_md5password_utf" /> 

usted debe enviar estos parámetros también.

Normalmente es más fácil instalar un HttpFox Firefox Add-on e inspeccionar la solicitud de los parámetros de la publicación que decodificar el javascript.

Mi navegador envía estos parámetros de correos (capturado con HttpFox, la contraseña es pass1):

vb_login_username: user1 
vb_login_password: 
s: 5d8bd41a83318e683de9c55a38534407 
securitytoken: 0dcd78b4c1a376232b62126e7ad568e0d1213f95 
do: login 
vb_login_md5password: a722c63db8ec8625af6cf71cb8c2d939 
vb_login_md5password_utf: a722c63db8ec8625af6cf71cb8c2d939 

Editar:

Los siguientes obras para mí, puedo conseguir el "Gracias para iniciar sesión en el mensaje " en el código html impreso:

final HttpClient client = new DefaultHttpClient(); 
final HttpPost post = new HttpPost(
     "http://www.xtratime.org/forum/login.php?do=login"); 
try { 
    final List<NameValuePair> nameValuePairs = 
     new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("vb_login_username", 
      "my user")); 
    nameValuePairs.add(new BasicNameValuePair("vb_login_password", "")); 
    nameValuePairs.add(new BasicNameValuePair("s", "")); 
    nameValuePairs.add(new BasicNameValuePair("securitytoken", 
      "inspected with httpfox, like f48d01...")); 
    nameValuePairs.add(new BasicNameValuePair("do", "login")); 
    nameValuePairs.add(new BasicNameValuePair("vb_login_md5password", 
      "inspected with httpfox, like 8e6ae1...")); 
    nameValuePairs.add(new BasicNameValuePair(
      "vb_login_md5password_utf", 
      "inspected with httpfox, like 8e6ae1...")); 

    post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    final HttpResponse response = client.execute(post); 
    final BufferedReader rd = new BufferedReader(new InputStreamReader(
      response.getEntity().getContent())); 
    String line = ""; 
    while ((line = rd.readLine()) != null) { 
     System.out.println(line); 
    } 
} catch (final IOException e) { 
    e.printStackTrace(); 
} 
+0

Esto significa que debería hash el valor que establecí para "vb_login_password" o debería enviar el hash como algo más –

+0

Creo que deberías. Verifique mi respuesta actualizada. Sugiero usar HttpFox si planea usar solo una contraseña. – palacsint

+0

gracias por la ayuda, pero aún no funciona –

1

que sugerimos utilizar htmlunit:

HtmlUnit es un "navegador GUI-Menos de programas en Java". Modela documentos HTML y proporciona una API que le permite invocar páginas, rellenar formularios , hacer clic en enlaces, etc ... tal como lo hace en su navegador "normal" .

Tiene bastante buena compatibilidad con JavaScript (que está en constante mejora) y es capaz de trabajar incluso con bibliotecas AJAX bastante complejos, simulando Firefox o Internet Explorer dependiendo de la configuración que desea utilizar .

Normalmente se utiliza con fines de prueba o para obtener información de sitios web.

+0

¿Esta función es rica, estable y un proyecto activo como el selenio? ¿Hay alguna alternativa GUI-LESS fuerte a HtmlUnit? Gracias. –

+0

En una API de prueba basada en navegador/gui, puedo abrir solo una página web porque solo hay un puntero de mouse en una computadora para hacer clic. Entonces, ¿puedo ejecutar múltiples pruebas en el mismo sitio web con la unidad html ya que no tiene una interfaz gráfica y, presumiblemente, no mueve el mouse? Gracias. –

Cuestiones relacionadas