繁体   English   中英

用facebook4j在页面上发布

[英]Posting on Page with facebook4j

有没有一种方法可以在Facebook页面墙上发布? 从教程中只是显示了如何获取有关页面的信息。 我希望能够在公共页面上发布(不是我自己的页面,而是该客户具有管理员权限的页面)。

我也尝试使用应用程序解决方案,但成功获得了OAuthAppAccessToken,但这还不够。

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

有教程吗? 因为大多数人只想从页面中获得喜欢和评论。

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

此选项需要通过图形API工具手动输入和复制生成的令牌。 我将不讨论这个选项,因为这两个链接获得了Facebook步骤访问令牌的4步程序使用RestFB api发布到Facebook页面的墙,都很好地覆盖了该选项。


选项2(一键式解决方案)

现在,这是一个非常自动化的解决方案,您需要(如果您像我一样)。 由于我无法告诉我的客户:“去这里,复制此内容,给我这个东西……”。 我需要做大多数用户友好的解决方案。 最后,我实现了FB登录按钮和简单的ajax调用,这些调用将获得长寿命的页面访问令牌。 使用此令牌,当发生某些事件时,我们的应用程序可以自动在其页面上发布。 使用获取Facebook页面访问令牌的4步程序教程,这里是解决方案:

  1. 使您的应用程序为https://developers.facebook.com/apps/ (您可能需要添加网站平台并使之运行)。
  2. 在仪表板中检索应用程序ID和应用程序密钥。
  3. 在您的网站上实施登录按钮。 有关此方面的重要信息,请参见fb Web登录 您需要的代码片段只是用您的应用程序ID替换应用程序ID。
  4. 在登录按钮中添加范围,这样我们就可以获得页面以及具有执行发布操作的权限。

<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. 下一步是服务器端。 目前我们收到令牌,我们需要将其转换为寿命长的令牌。

      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); } 

旁注 :此解决方案不能用作垃圾邮件发送者。 需要告知用户哪些事件将触发在其页面上的发布。 如果用户要减少/删除权限,可以在FB设置中进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM