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

LinkedIn使用oauth登录到它的api.There无法登录到服务器中的api。我试图使用http请求登录到linkedin并获取oauth_verifier ,但我得到了这样的响应

很抱歉,您的申请存在问题。 请确保您已启用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 hm = new HashMap(); String postURL = doc.getElementsByAttributeValue("name", "oauthAuthorizeForm").get(0).absUrl("action"); HttpResponse response; HttpEntity entity; HttpPost httpost = new HttpPost(postURL); List nvps = new ArrayList(); hm.put("session_login", user); hm.put("session_password", pass); hm.put("duration", "0"); hm.put("authorize", "Ok, I'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 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 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; } 

url是AuthorizationUr httpSession.Get(url); 获取登录页面和cookie。

我用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上的发布。这也不是一个完美的解决方案。它可以工作,但在网页和其他内容的javascript \ css上花了很多钱