java 我的 Facebook 应用程序如何将消息发布到墙上?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5687310/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can my facebook application post message to a wall?
提问by ThdK
i already found out how to post something to a wall with the graph api on behalf of the facebook user. But now i want to post something in the name of my application.
我已经找到了如何代表 Facebook 用户使用图形 API 将内容发布到墙上。但现在我想以我的应用程序的名义发布一些东西。
Here is how i'm trying to do this:
这是我尝试执行此操作的方法:
protected void btn_submit_Click(object sender, EventArgs e)
{
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("message", "Testing");
// i'll add more data later here (picture, link, ...)
data.Add("access_token", FbGraphApi.getAppToken());
FbGraphApi.postOnWall(ConfigSettings.getFbPageId(), data);
}
FbGraphApi.getAppToken()
FbGraphApi.getAppToken()
// ...
private static string graphUrl = "https://graph.facebook.com";
//...
public static string getAppToken() {
MyWebRequest req = new MyWebRequest(graphUrl + "/" + "oauth/access_token?type=client_cred&client_id=" + ConfigSettings.getAppID() + "&client_secret=" + ConfigSettings.getAppSecret(), "GET");
return req.GetResponse().Split('=')[1];
}
FbGraphApi.postOnWall()
FbGraphApi.postOnWall()
public static void postOnWall(string id, Dictionary<string,string> args)
{
call(id, "feed", args);
}
FbGraphApi.call()
FbGraphApi.call()
private static void call(string id, string method, Dictionary<string,string> args )
{
string data = "";
foreach (KeyValuePair<string, string> arg in args)
{
data += arg.Key + "=" + arg.Value + "&";
}
MyWebRequest req = new MyWebRequest(graphUrl +"/" + id + "/" + method, "POST", data.Substring(0, data.Length - 1));
req.GetResponse(); // here i get: "The remote server returned an error: (403) Forbidden."
}
Does anyone see where this i going wrong? I'm really stuck on this.
有没有人看到我哪里出错了?我真的坚持这一点。
Thanks!
谢谢!
采纳答案by Frazell Thomas
You need to obtain the Auth Token for your application to post as that application.
您需要为您的应用程序获取 Auth Token 以作为该应用程序发布。
The Auth_Token defines the security context you are posting as.
Auth_Token 定义了您发布的安全上下文。
You would need to request the following Graph API URL, for the current user, to find the access token for your application.
您需要为当前用户请求以下 Graph API URL,以查找您的应用程序的访问令牌。
https://graph.facebook.com/me/accounts?access_token=XXXXXXXX
This should give you an output similar to the following:
这应该会为您提供类似于以下内容的输出:
{
"data": [
{
"name": "My App",
"category": "Application",
"id": "10258853",
"access_token": "xxxxxxxxxxxxxxxx"
}
]
}
Be sure you have the manage_pages permission before calling that API or your will not get the access token back.
在调用该 API 之前,请确保您拥有 manage_pages 权限,否则您将无法取回访问令牌。
Once you have the Access Token you publish to the wall like you would any other user. Note that the ID used in the URL matches the ID of the application. This will post to the Application's wall as the Application.
一旦您拥有访问令牌,您就可以像发布任何其他用户一样发布到墙上。请注意,URL 中使用的 ID 与应用程序的 ID 匹配。这将作为应用程序发布到应用程序的墙上。
https://graph.facebook.com/10258853/feed?access_token=XXXXXXX
Be sure you have the publish_stream permission as well before posting to the wall.
在发布到墙上之前,请确保您也拥有 publish_stream 权限。
回答by Arihant Nahata
Recently I had worked With FB api's.
I had Done every thing in javascript.
Here is what i used to post to a users wall.
I hope this helps you.
最近我曾与 FB api 一起工作。
我已经在 javascript 中完成了所有事情。
这是我曾经发布到用户墙的内容。
我希望这可以帮助你。
<div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({appId: 'your app id', status: true, cookie: true, xfbml: true}); }; (function() { var e = document.createElement('script'); e.type = 'text/javascript'; e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; e.async = true; document.getElementById('fb-root').appendChild(e); }()); </script>
<div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({appId: 'your app id', status: true, cookie: true, xfbml: true}); }; (function() { var e = document.createElement('script'); e.type = 'text/javascript'; e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; e.async = true; document.getElementById('fb-root').appendChild(e); }()); </script>
$("#fb_login").click(function(){ FB.login(function(response) { if (response.session) { if (response.perms) { // alert("Logged in and permission granted for posting"); } else { // alert("Logged in but permission not granted for posting"); } } else { //alert("Not Logged In"); } }, {perms:'publish_stream'});
Note that You have to add {perms:'publish_stream'}as done above which will obtain you the rights to post to the users wall.
$("#fb_login").click(function(){ FB.login(function(response) { if (response.session) { if (response.perms) { // alert("Logged in and permission granted for posting"); } else { // alert("Logged in but permission not granted for posting"); } } else { //alert("Not Logged In"); } }, {perms:'publish_stream'});
请注意,您必须添加{perms:'publish_stream'}如上所述,这将获得您发布到用户墙的权利。
$("#stream_publish").click(function(){ FB.getLoginStatus(function(response){ if(response.session) { publishPost(response.session); } }); }); function publishPost(session) { var publish = { method: 'stream.publish', message: 'Your Message', picture : 'Image to be displayed', link : 'The link that will be the part of the post, which can point to either your app page or your personal page or any other page', name: 'Name or title of the post', caption: 'Caption of the Post', description: 'It is fun to write Facebook App!', actions : { name : 'Start Learning', link : 'link to the app'} }; FB.api('/me/feed', 'POST', publish, function(response) { document.getElementById('confirmMsg').innerHTML = 'A post had just been published into the stream on your wall.'; }); };
$("#stream_publish").click(function(){ FB.getLoginStatus(function(response){ if(response.session) { publishPost(response.session); } }); }); function publishPost(session) { var publish = { method: 'stream.publish', message: 'Your Message', picture : 'Image to be displayed', link : 'The link that will be the part of the post, which can point to either your app page or your personal page or any other page', name: 'Name or title of the post', caption: 'Caption of the Post', description: 'It is fun to write Facebook App!', actions : { name : 'Start Learning', link : 'link to the app'} }; FB.api('/me/feed', 'POST', publish, function(response) { document.getElementById('confirmMsg').innerHTML = 'A post had just been published into the stream on your wall.'; }); };
回答by SALMAN
private class FbWebViewClient extends WebViewClient {
boolean started=false;
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("Facebook-WebView", "Redirect URL: " + url);
if (url.startsWith(Facebook.REDIRECT_URI)) {
Bundle values = Util.parseUrl(url);
String error = values.getString("error");
if (error == null) {
error = values.getString("error_type");
}
if (error == null) {
mListener.onComplete(values);
} else if (error.equals("access_denied")
|| error.equals("OAuthAccessDeniedException")) {
mListener.onCancel();
} else {
mListener.onFacebookError(new FacebookError(error));
}
FbDialog.this.dismiss();
return true;
} else if (url.startsWith(Facebook.CANCEL_URI)) {
mListener.onCancel();
FbDialog.this.dismiss();
return true;
} else if (url.contains(DISPLAY_STRING)) {
return false;
}
// launch non-dialog URLs in a full browser
getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mListener.onError(new DialogError(description, errorCode,
failingUrl));
FbDialog.this.dismiss();
}
public Map<String, String> getUrlParameters(String url)
throws UnsupportedEncodingException {
Map<String, String> params = new HashMap<String, String>();
String[] urlParts = url.split("\?");
if (urlParts.length > 1) {
String query = urlParts[1];
for (String param : query.split("&")) {
String pair[] = param.split("=");
String key = URLDecoder.decode(pair[0], "UTF-8");
String value = "";
if (pair.length > 1) {
value = URLDecoder.decode(pair[1], "UTF-8");
}
params.put(key, value);
}
}
return params;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("Facebook-WebView", "Webview loading URL: " + url);
String newUrl="http://www.facebook.com/dialog/feed?_path=feed&app_id=";
if (url.contains("touch") && started==false) {
started=true;
ChildTabBibleLessonActivity.fbMaterial=ChildTabBibleLessonActivity.fbMaterial.replace(" ", "+");
url=url+"&picture=http://www.minibiblecollege.org/mbclandingpage/images/icmlogo-small.jpg&description="+ChildTabBibleLessonActivity.fbMaterial;
/* Map<String,String> param;
try {
param = getUrlParameters(url);
newUrl=newUrl+param.get("app_id")+"&redirect_uri="+"https://deep-rain-6015.herokuapp.com"+"&display=page&picture=http://www.minibiblecollege.org/mbclandingpage/images/icmlogo-small.jpg"+"&name=MiniBible&description=heregoesMyMessage";
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
view.loadUrl(url);
//super.onPageStarted(view, url, favicon);
}
else
{
super.onPageStarted(view, url, favicon);
}
mSpinner.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mSpinner.dismiss();
/*
* Once webview is fully loaded, set the mContent background to be
* transparent and make visible the 'x' image.
*/
mContent.setBackgroundColor(Color.TRANSPARENT);
mWebView.setVisibility(View.VISIBLE);
mCrossImage.setVisibility(View.VISIBLE);
}
}