有没有办法如何在Facebook页面墙上发布?从教程中只是展示如何获取有关页面的信息。我希望能够在公共页面上发布(不是我自己的,而是客户拥有管理员权限的那个)。
我也试过使用app解决方案,但我成功地获得了OAuthAppAccessToken,但这还不够。
An active access token must be used to query information about the current user.
有一些教程吗?因为大多数人只想从页面上得到喜欢和评论。
答案 0 :(得分:2)
选项1(通过工具获取令牌)
此选项需要通过图形api工具手动输入和复制生成的令牌。我不打算多说这个选项,因为这两个链接 obtaining facebook page access token the 4 step program和Post to Facebook Page wall using RestFB api非常清楚。
选项2(一键解决方案)
现在这是一个非常自动化的解决方案(如果你像我一样)你想要的。因为我无法告诉我的客户:“去这里,复制这个,给我这个和东西......”。我需要做大多数用户友好的解决方案。最后,我实现了FB登录按钮和简单的ajax调用,它将获得长期存在的页面访问令牌。使用此令牌,我们的应用程序可以在发生某些事件时自动在其页面上发布。在这里使用obtaining facebook page access token the 4 step program教程是解决方案:
<fb:login-button scope="public_profile,email,manage_pages,publish_actions" onlogin="checkLoginState();">
</fb:login-button>
在登录按钮中,您可以看到每次调用登录时调用的函数。在这个函数中,我们可以从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'
);
}
下一步是服务器端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");
现在我们需要获取我们想要发布的页面的访问令牌的最后一步。从这一点开始,我们可以使用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();
}
}
利润:使用此令牌,我们可以在所需的页面上发布:
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设置中执行的权限。