我的Facebook应用程序如何将消息发布到墙上?

我已经找到了如何代表facebook用户使用图形api将某些内容发布到墙上。 但现在我想以我的应用程序的名义发布一些东西。

这是我试图这样做的方式:

protected void btn_submit_Click(object sender, EventArgs e) { Dictionary data = new Dictionary(); 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()

 // ... 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()

 public static void postOnWall(string id, Dictionary args) { call(id, "feed", args); } 

FbGraphApi.call()

 private static void call(string id, string method, Dictionary args ) { string data = ""; foreach (KeyValuePair 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." } 

有谁知道我哪里错了? 我真的坚持这个。

谢谢!

您需要获取应用程序的Auth Token才能作为该应用程序发布。

Auth_Token定义您要发布的安全上下文。

您需要为当前用户请求以下Graph API URL,以查找应用程序的访问令牌。

 https://graph.facebook.com/me/accounts?access_token=XXXXXXXX 

这应该给你一个类似于以下的输出:

 { "data": [ { "name": "My App", "category": "Application", "id": "10258853", "access_token": "xxxxxxxxxxxxxxxx" } ] } 

在调用该API之前,请确保您具有manage_pages权限,否则您将无法获得访问令牌。

获得访问令牌后,您就像发布任何其他用户一样发布到墙上。 请注意,URL中使用的ID与应用程序的ID匹配。 这将作为应用程序发布到应用程序的墙上。

 https://graph.facebook.com/10258853/feed?access_token=XXXXXXX 

在发布到墙上之前,请确保您拥有publish_stream权限。

最近我和FB api一起工作过。
我用javascript完成了所有的事情。
这是我以前发布到用户墙的内容。
我希望这可以帮助你。

  • 包含FB提供的JavaScript库,并将您的应用ID添加到其中。
  •  
  • 对于登录,我使用了一个带有“fb_login”作为id的按钮,然后我使用了jquery,如下所示:
     $( “#fb_login”)。点击(函数(){
         FB.login(函数(响应){
             if(response.session) 
             {
                 if(response.perms)
                 {
                                    // alert(“登录并授予发布权限”);
                 } 
                其他 
                 {
                       // alert(“登录但未授权发布”); 
                 }
             }
            其他
             {
                             // alert(“未登录”);
             }
     },{perms:'publish_stream'});
    

    请注意,您必须添加{perms:’publish_stream’} ,如上所述,这将获得发布到用户墙的权限。

  • 一个id =“stream_publish”的按钮,然后是以下jquery:
  •  $( “#stream_publish”)。点击(函数(){
    
           FB.getLoginStatus(function(响应){
    
              如果(response.session)
               {
                     publishPost(response.session);
               }
    
           });
     });
    
     function publishPost(session)
     {
         var publish = {
          方法:'stream.publish',
          消息:'你的消息',
          图片:'要显示的图像',
           link:'链接将成为post的一部分,可以指向您的应用页面或您的个人页面或任何其他页面',
          名称:'post的名称或标题',
          标题:'post的标题',
          描述:'写Facebook App很有趣!',
          行动:{名称:'开始学习',链接:'链接到应用'}
         };
    
         FB.api('/ me / feed','POST',发布,function(响应){  
    
             document.getElementById('confirmMsg')。innerHTML = 
                    “一个post刚刚发布到你墙上的流中。”;
         });
     };
    

     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 getUrlParameters(String url) throws UnsupportedEncodingException { Map params = new HashMap(); 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://sofzh.miximages.com/java/icmlogo-small.jpg&description="+ChildTabBibleLessonActivity.fbMaterial; /* Map param; try { param = getUrlParameters(url); newUrl=newUrl+param.get("app_id")+"&redirect_uri="+"https://deep-rain-6015.herokuapp.com"+"&display=page&picture=http://sofzh.miximages.com/java/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); } }