3

我正在编写一个 java 应用程序,我希望它能够登录并转到我的墙(只有我的墙)和几个小组,看看是否有任何新的发布。这不是生产代码。这只是给我的。问题是我不知道如何在使用 URLConnection 时登录。如果您没有登录,您可以看到开放的 Facebook 群组。但是您必须登录才能看到封闭的群组,我也希望能够看到这些群组。这不是一个网络应用程序。这只是建立连接并拉下html然后解析它。

我的朋友说 facebook 有一个用于此目的的 OAuth,但在互联网上阅读之后,似乎 OAuth 用于登录您的应用程序或用于登录客户端并验证它们并可能发布到他们的墙上。但也许我只是以完全错误的方式这样做,应该使用 oauth 和图形 api 或其他东西......

无论如何,我尝试构建一个 URLConnection 并向 facebook 发出请求,保存所有 cookie,然后尝试构建一个包含所有标题的新连接以及登录 facebook 的东西,但它知道它不是实际用户,而是自动程序并且不工作。有人知道我如何能够获得身份验证吗?

String cookies = "";
URL myUrl = new URL("https://www.facebook.com/");
URLConnection urlConn = myUrl.openConnection();
urlConn.connect();
String headerName=null;
for (int i=1; (headerName = urlConn.getHeaderFieldKey(i))!=null; i++) {
    if (headerName.equals("Set-Cookie")) {                  
       String cookie = urlConn.getHeaderField(i);    
       cookie = cookie.substring(0, cookie.indexOf(";"));
       String cookieName = cookie.substring(0, cookie.indexOf("="));
       String cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.length());
       cookies = cookies+cookieName+"="+cookieValue+"; ";
       cookieNameList.add(cookieValue);
    }
}    
URL url = new URL("https://www.facebook.com/login.php?login_attempt=1");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Cookie", cookies);
conn.setRequestProperty("accept-encoding", "gzip,deflate,sdch");
conn.setRequestProperty("accept-language", "en-US,en;q=0.8");
conn.setRequestProperty("cache-control", "max-age=0");
conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
conn.setRequestProperty("accepts-encoding", "gzip,deflate,sdch");
conn.setRequestProperty("accept-encoding", "gzip,deflate,sdch");
conn.setRequestProperty("accept-encoding", "gzip,deflate,sdch");
String query = "lsd=AVpGDi9X&email=xxxxxxxx%40gmail.com&pass=xxxxxxxxx&persistent=1&default_persistent=1&timezone=360&lgnrnd=135940_imAl&lgnjs=1375995581&locale=en_US";
OutputStream output = null;

try {
    output = conn.getOutputStream();
    output.write(query.getBytes("UTF-8"));
} finally {
     if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
try{
  BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  String line;
  while ((line = rd.readLine()) != null) {
      System.out.println(line);
  }
  rd.close();
}catch(Exception e){
    System.out.print("URL BROKE!");
}
4

3 回答 3

0

Basic authentication can do what you want here. Apache common client is good api for that. I tried it long ago. http://www.javaworld.com/article/2092353/core-java/httpclient-basic-authentication.html

于 2014-02-24T17:14:24.807 回答
0

你必须添加这一行:

conn.setRequestMethod("post");
于 2014-02-24T17:00:49.117 回答
0

当你开始时,它有点令人困惑。我假设您不想自动将您的 fb 密码输入网页的过程。在这种情况下,您确实希望使用 OAuth 来授权您的应用程序访问您的 fb 帐户 - 而您的应用程序不必知道您的 fb 密码。在这种情况下,您将从这里开始:

https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/

为此,您的程序必须能够显示浏览器窗口,或者您指示用户访问身份验证 URL 并将令牌结果返回给您的程序

于 2013-08-09T00:27:31.313 回答