使用用户名和密码登录LinkedIn失败

问题描述:

LinkedIn使用oauth登录到api.There是无法登录到api的server.I尝试使用http请求登录linkedin并得到oauth_verifier,但我得到了回应像这样使用用户名和密码登录LinkedIn失败

很抱歉,应您的要求 有问题。请确保您的 已启用Cookie,然后重试。

或按照此链接返回到 主页。

我分析我的浏览器和服务器之间的沟通很多次,但仍发现便无法为什么

public boolean Login(String user, String pass, String url) { 
    try { 
     DefaultHttpClient httpclient; 
     HttpParams params = new BasicHttpParams(); 
     ConnManagerParams.setMaxTotalConnections(params, 100); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 

     // Create and initialize scheme registry 
     SchemeRegistry schemeRegistry = new SchemeRegistry(); 
     schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 
     // Create an HttpClient with the ThreadSafeClientConnManager. 
     // This connection manager must be used if more than one thread will 
     // be using the HttpClient. 
     ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 
     httpclient = new DefaultHttpClient(cm, params); 

     String loginHTML = httpSession.Get(url); 

     for (Cookie c : httpSession.cs.getCookies()) { 
      httpclient.getCookieStore().addCookie(c); 
     } 

     Document doc = Session.GetDocument(loginHTML, url); 
     HashMap<String, String> hm = new HashMap<String, String>(); 
     String postURL = doc.getElementsByAttributeValue("name", "oauthAuthorizeForm").get(0).absUrl("action"); 
     HttpResponse response; 
     HttpEntity entity; 
     HttpPost httpost = new HttpPost(postURL); 
     List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
     hm.put("session_login", user); 
     hm.put("session_password", pass); 
     hm.put("duration", "0"); 
     hm.put("authorize", "Ok, I&apos;ll Allow It"); 
     hm.put("extra", doc.getElementsByAttributeValue("name", "extra").get(0).attr("value")); 
     hm.put("access", doc.getElementsByAttributeValue("name", "access").get(0).attr("value")); 
     hm.put("agree", "true"); 
     hm.put("oauth_token", doc.getElementsByAttributeValue("name", "oauth_token").get(0).attr("value")); 
     hm.put("appId", doc.getElementsByAttributeValue("name", "appId").get(0).attr("value")); 
     hm.put("csrfToken", doc.getElementsByAttributeValue("name", "csrfToken").get(0).attr("value")); 
     hm.put("sourceAlias", doc.getElementsByAttributeValue("name", "sourceAlias").get(0).attr("value") + "session_login=" + user); 


     for (Entry<String, String> i : hm.entrySet()) { 
      nvps.add(new BasicNameValuePair(i.getKey(), new String(i.getValue().getBytes(), "utf-8"))); 
     } 
     hm.put("sourceAlias", doc.getElementsByAttributeValue("name", "sourceAlias").get(0).attr("value")); 
     for (Entry<String, String> i : hm.entrySet()) { 
      nvps.add(new BasicNameValuePair(i.getKey(), new String(i.getValue().getBytes(), "utf-8"))); 
     } 

     httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 
     httpost.setHeader("User-Agent", "Shisoft NetFusion"); 
     response = httpclient.execute(httpost); 
     entity = response.getEntity(); 


     Header headers[] = response.getHeaders("location"); 
     for (Header h : headers) { 
      if (!h.getValue().isEmpty()) { 
       String newurl = h.getValue(); 
       String oauthVerifier = newurl.split("oauth_verifier=")[1].split("&")[0]; 
       accessToken = oauthService.getOAuthAccessToken(requestToken, oauthVerifier); 
       return true; 
      } 
     } 
     if (entity != null) { 
      String resHTML = EntityUtils.toString(entity); 
      //entity.getContent().close(); 
      httpost.abort(); 
      httpclient.getConnectionManager().closeExpiredConnections(); 
     } 

     httpost.abort(); 
     return false; 
    } catch (Exception ex) { 
     Logger.getLogger(ClassLinkedIn.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return false; 
} 

的网址是AuthorizationUr httpSession.Get(URL);获取登录页面和cookie。

+0

嘿Shisoft你解决了这个问题吗? 你能给我一些建议,我也得到同样的问题。 Thx – 2012-01-13 12:00:55

+0

我试过你的答案,但我认为我没有得到正确的罐子。 我正在使用HtmlUnit jar,但在这里得到一个异常 'final HtmlPage page1 = webClient.getPage(url);' – 2012-01-13 12:06:39

我使用HTMLUnit解决了这个问题。

public boolean Login(String user, String pass, String url) { 
     try { 
      final WebClient webClient = new WebClient(); 

      // Get the first page 
      final HtmlPage page1 = webClient.getPage(url); 

      // Get the form that we are dealing with and within that form, 
      // find the submit button and the field that we want to change. 
      final HtmlForm form = page1.getFormByName("oauthAuthorizeForm"); 

      final HtmlSubmitInput button = form.getInputByName("authorize"); 
      final HtmlTextInput textField = form.getInputByName("session_login"); 
      final HtmlPasswordInput textField2 = form.getInputByName("session_password"); 
      // Change the value of the text field 
      textField.setValueAttribute(user); 
      textField2.setValueAttribute(pass); 

      // Now submit the form by clicking the button and get back the second page. 

      final HtmlPage page2 = button.click(); 
      String newurl = page2.getUrl().toString(); 
      String oauthVerifier = newurl.split("oauth_verifier=")[1].split("&")[0]; 
      accessToken = oauthService.getOAuthAccessToken(requestToken, oauthVerifier); 

      webClient.closeAllWindows(); 
      logined = true; 
      return true; 

     } catch (Exception ex) { 
      Logger.getLogger(ClassLinkedIn.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return false; 
    } 

但要记住,你需要HtmlUnit的使用的最后一个版本,而不是在sf.net 这也并不是一个完美的作品solution.It释放,但成本上的网页里面的javascript \ CSS很多和其他人

+0

我也遇到了同样的问题,我尝试使用httpclient登录所有需要的值。 但它显示“请输入一个有效的电子邮件地址。” 发布所有值和cookie后。 我查看了电子邮件ID是否正确。 你能为我举个例子吗? 你能给我多一些代码吗? – 2012-01-13 10:07:31