用facebook4j在页面上发布

时间:2015-02-11 19:54:44

标签: java facebook facebook-graph-api

有没有办法如何在Facebook页面墙上发布?从教程中只是展示如何获取有关页面的信息。我希望能够在公共页面上发布(不是我自己的,而是客户拥有管理员权限的那个)。

我也试过使用app解决方案,但我成功地获得了OAuthAppAccessToken,但这还不够。

An active access token must be used to query information about the current user.

有一些教程吗?因为大多数人只想从页面上得到喜欢和评论。

1 个答案:

答案 0 :(得分:2)

选项1(通过工具获取令牌)

此选项需要通过图形api工具手动输入和复制生成的令牌。我不打算多说这个选项,因为这两个链接 obtaining facebook page access token the 4 step programPost to Facebook Page wall using RestFB api非常清楚。


选项2(一键解决方案)

现在这是一个非常自动化的解决方案(如果你像我一样)你想要的。因为我无法告诉我的客户:“去这里,复制这个,给我这个和东西......”。我需要做大多数用户友好的解决方案。最后,我实现了FB登录按钮和简单的ajax调用,它将获得长期存在的页面访问令牌。使用此令牌,我们的应用程序可以在发生某些事件时自动在其页面上发布。在这里使用obtaining facebook page access token the 4 step program教程是解决方案:

  1. 制作您的申请https://developers.facebook.com/apps/(您可能需要添加网站平台并将其设为现场)。
  2. 在仪表板中检索应用ID和应用密码。
  3. 在您的网站上实施登录按钮。有关此内容的详细信息,请访问fb login for web。您只需要代码片段,只需将应用ID替换为您的应用ID即可。
  4. 在登录按钮中添加范围,以便我们可以获取页面以及执行发布操作的权限。
  5. <fb:login-button scope="public_profile,email,manage_pages,publish_actions" onlogin="checkLoginState();"> </fb:login-button>

    1. 在登录按钮中,您可以看到每次调用登录时调用的函数。在这个函数中,我们可以从FB获得响应和我们需要的关于用户的信息(在这种情况下,它实际上只是我们需要的标记)。以下javascript代码通过ajax将用户令牌(短期)发送到我们的服务器。

      function checkLoginState() { FB.getLoginStatus(function (response) { statusChangeCallback(response); }); } function statusChangeCallback(response) { if (response.status === 'connected') { getLongLivedToken(response.authResponse.accessToken); } } function getLongLivedToken(access) { var data = { ${fbParam}: acces }; $.post( '${fbUrl}', data, function (INFO) { console.log("done"); }, 'text' ); }

    2. 下一步是服务器端1。在我们收到令牌时,我们需要将其转换为长期令牌。

          String url = "https://graph.facebook.com/oauth/access_token";
          String charset = "UTF-8";
          String grandType = "fb_exchange_token";
      
          String query = String.format("grant_type=%s&client_id=%s&client_secret=%s&fb_exchange_token=%s",
                  URLEncoder.encode(grandType, charset),
                  URLEncoder.encode(Constants.FACEBOOK_APP_ID, charset),
                  URLEncoder.encode(Constants.FACEBOOK_APP_SECRET, charset),
                  URLEncoder.encode(shortToken, charset));
          HttpsURLConnection con = (HttpsURLConnection) new URL(url + "?" + query).openConnection();
          InputStream ins = con.getInputStream();
          InputStreamReader isr = new InputStreamReader(ins);
          BufferedReader in = new BufferedReader(isr);
      
          String inputLine;
          String result = "";
          while ((inputLine = in.readLine()) != null) {
              System.out.println(inputLine);
              result += inputLine;
          }
          in.close();
      
          String[] params = result.split("&");
          Map<String, String> map = new HashMap<String, String>();
          for (String param : params) {
              String name = param.split("=")[0];
              String value = param.split("=")[1];
              map.put(name, value);
          }
          String longToken=map.get("access_token");
      
    3. 现在我们需要获取我们想要发布的页面的访问令牌的最后一步。从这一点开始,我们可以使用facebook4j。

          Facebook facebook = new FacebookFactory().getInstance();
          facebook.setOAuthAppId(Constants.FACEBOOK_APP_ID, Constants.FACEBOOK_APP_SECRET);
      
          facebook.setOAuthAccessToken(new AccessToken(longToken));
          try {
              String pageToken = null;
              for (Account a : facebook.getAccounts()) {
                  if (a.getName().toLowerCase().contains("nameOfPage")) {
                      pageToken = a.getAccessToken();
                  }
              }
      
    4. 利润:使用此令牌,我们可以在所需的页面上发布:

      PostUpdate post = new PostUpdate(new URL("http://priklad.sk"))
                      .picture(new URL("http://priklad.sk/obrazcok/testik.png"))
                      .name("priklad")
                      .caption("priklad")
                      .message("priklad")
                      .description("priklad");
      try {
           if (pageToken != null) {
               facebook.setOAuthAccessToken(new AccessToken(id));
               facebook.postFeed(post);
               Input.addInfoAnnotation(req, "sysAdminTools.annotation.fb.ok");
                                  }
            } catch (FacebookException ex) {
               Logger.getLogger(EditAdPreviewServlet.class.getName()).log(Level.SEVERE, null, ex);
            }
      
    5. 旁注:此解决方案不能用作页面垃圾邮件发送者。用户需要被告知哪些事件将在他的页面上触发发布。如果用户想要减少/删除他可以在FB设置中执行的权限。