2011-08-21 22 views
12

Estoy experimentando con este sitio para recopilar mi nombre de usuario en la página de bienvenida para aprender Jsoup y Android. Utilizando el siguiente códigoJsoup Cookies para HTTPS raspado

Connection.Response res = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx") 
    .data("ctl00$ContentPlaceHolder1$ctl00$Login1$UserName", "username", "ctl00$ContentPlaceHolder1$ctl00$Login1$Password", "password") 
    .method(Method.POST) 
    .execute(); 
String sessionId = res.cookie(".ASPXAUTH"); 

Document doc2 = Jsoup.connect("http://www.mikeportnoy.com/forum/default.aspx") 
.cookie(".ASPXAUTH", sessionId) 
.get(); 

Mi cookie (.ASPXAUTH) siempre termina NULL. Si elimino esta cookie en un navegador web, pierdo mi conexión. Así que estoy seguro de que es la cookie correcta. Además, si cambio el código

.cookie(".ASPXAUTH", "jkaldfjjfasldjf") Using the correct values of course 

Puedo raspar mi nombre de usuario desde esta página. Esto también me hace pensar que tengo la cookie correcta. Entonces, ¿cómo es que mi cookie aparece nula? ¿Son incorrectos mis campos de nombre de usuario y contraseña? ¿Algo más?

Gracias.

Respuesta

0

¿Qué pasa si se intenta ir a buscar y pasando todas las cookies sin asumir nada como esto: Sending POST request with username and password and save session cookie

Si todavía tiene problemas intente buscar en esto: Issues with passing cookies to GET request (after POST)

+1

Probé el primer enlace y pude recuperar tres cookies, pero una estaba en blanco. La cookie que necesitaba no estaba allí, lo que explica por qué siempre obtengo NULL. No puedo entender por qué mi código no devuelve todas las cookies que veo en firebug. ¿Hay algo que pueda buscar? – Brian

28

sé que soy un poco tarde a los 10 meses aquí. Sin embargo, una buena opción mediante Jsoup es utilizar esta pieza peasy fácil de código:

//This will get you the response. 
Response res = Jsoup 
    .connect("url") 
    .data("loginField", "[email protected]", "passField", "pass1234") 
    .method(Method.POST) 
    .execute(); 

//This will get you cookies 
Map<String, String> cookies = res.cookies(); 

//And this is the easieste way I've found to remain in session 
Documente doc = Jsoup.connect("url").cookies(cookies).get(); 

Aunque sigo teniendo problemas de conexión a algunos sitios web, enlaces a un montón de ellos con la misma pieza básica de código . Ah, y antes de que me olvide ... Lo que pensé que era mi problema, son los certificados SSL. Tienes que gestionarlos adecuadamente de una forma que todavía no he descifrado.

9

siempre hago esto en dos pasos (como humano normal),

  1. Lea la página de inicio de sesión (por GET, leer las cookies)
  2. Envíe el formulario y galletas (por correo, sin manipulación de cookies)

Ejemplo:

Connection.Response response = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx") 
     .method(Connection.Method.GET) 
     .execute(); 

response = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx") 
     .data("ctl00$ContentPlaceHolder1$ctl00$Login1$UserName", "username") 
     .data("ctl00$ContentPlaceHolder1$ctl00$Login1$Password", "password") 
     .cookies(response.cookies()) 
     .method(Connection.Method.POST) 
     .execute(); 

Document homePage = Jsoup.connect("http://www.mikeportnoy.com/forum/default.aspx") 
     .cookies(response.cookies()) 
     .get(); 

Y siempre establecer cookies de previuos solicitan al siguiente usando

  .cookies(response.cookies()) 

SSL no es importante aquí. Si tiene problemas con certifcates, ejecute este método para ignorar SSL.

public static void trustEveryone() { 
    try { 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }); 

     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(null, new X509TrustManager[]{new X509TrustManager() { 
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } 

      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } 

      public X509Certificate[] getAcceptedIssuers() { 
       return new X509Certificate[0]; 
      } 
     }}, new SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); 
    } catch (Exception e) { // should never happen 
     e.printStackTrace(); 
    } 
}