2016-08-23 3 views
2

우리는 수많은 Java 웹 유틸리티를 시도했으며, Quora 로그인 URL에 게시하려고 할 때 모두 500을 반환합니다. Chrome 네트워킹 탭을 사용하여 헤더/요청 항목을 찾고 모든 것이 완벽하게 설정되어야합니다. 게시 요청을 보내려고 할 때마다 500 서버 오류가 반환되는 이유는 확실하지 않습니다.Java jsoup 게시물 요청 500 Quora 로그인

public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"; 

public static void test(String email, String password) throws IOException { 

    // Login first 
    String loginFormUrl = "https://quora.com/login"; 
    String loginActionUrl = "https://www.quora.com/webnode2/server_call_POST"; 

    Connection.Response loginForm = Jsoup.connect(loginFormUrl).userAgent(USER_AGENT).method(Connection.Method.GET).execute(); // removed useragent 

    // "formkey": "f3e47dd339ed5673c9411822ad5ff1da", length = 32 
    String[] key = loginForm.body().split("formkey\": \""); 
    String[] wat = key[1].split("\","); 
    String formkey = wat[0]; 

    // windowId, length = 27 
    String[] parts = loginForm.body().split("windowId = \""); 
    String[] another = parts[1].split("\";"); 
    String windowId = another[0]; 

    // Vcon 
    String[] vcon1 = loginForm.body().split(Pattern.quote("new(require(\"login\").LoggedOutHomeHeaderInlineLogin")); 
    String[] vcon2 = vcon1[1].split("\",\""); 
    vcon2[0] = vcon2[0].replace(")(\"", ""); 
    String vcon_json = "["+vcon2[0]+"]"; 

    // Cookies 
    String result = ""; 
    boolean first = true; 
    for(String c : loginForm.cookies().keySet()){ 
     String value = loginForm.cookies().get(c); 
     if(first){ 
      result = result + c + "=" + value; 
      first = false; 
     } 
     else{ 
      result = result + "; " + c + "=" + value; 
     } 
    } 

    Connection.Response loginPage = Jsoup.connect(loginActionUrl) 
       .data("json", "{\"args\":[],\"kwargs\":{\"email\":\""+email+"\",\"password\":\""+password+"\",\"passwordless\":0}}") 
       .data("formkey", formkey) 
       .data("window_id", windowId) 
       .data("__vcon_json", vcon_json) 
       .data("__vcon_method", "do_login") 

       .header("Accept", "application/json, text/javascript, **; q=0.01") 
       .header("Accept-Encoding", "gzip, deflate, br") 
       .header("Accept-Language", "en-US,en;q=0.8") 
       .header("Content-Type", "application/x-www-form-urlencoded") 
       .header("Connection", "keep-alive") 
       .header("Content-Length", loginForm.body().length()+"") 
       .header("Cookie", result) 
       .header("Host", "www.quora.com") 
       .header("Origin", "https://www.quora.com") 
       .header("Referer", "https://www.quora.com/") 
       .header("User-Agent", USER_AGENT) 
       .header("X-Requested-With", "XMLHttpRequest") 

       .userAgent(USER_AGENT) 
       .cookies(loginForm.cookies()) 
       .followRedirects(true) 
       .referrer("https://www.quora.com/") 

       .method(Method.POST) 
       .execute(); 

    System.out.println(loginPage.statusCode()); 
} 

답변

0

은 서버에 게시보다 요청의 몸에서 더 많은 데이터 필드가 있습니다 - 당신은 JSON, formkey, window_id, vcon_json 및 vcon_method를 게시하지만, 당신이 볼 수있는, 더있다 :
post fields

요청을 서버에 보내기 전에 요청에 추가하십시오.