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

问题描述:

我已经找到了如何使用图表api代表facebook用户向墙上发布内容。但是现在我想以我的应用程序的名义发布一些内容。我的Facebook应用程序如何将消息发布到墙上?

这里是如何我试图做到这一点:

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

// ... 
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<string,string> args) 
    { 
     call(id, "feed", args); 
    } 

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." 
} 

有没有人看到我在哪里出错?我真的坚持这一点。

谢谢!

+0

您使用什么语言? – Shaz 2011-04-16 14:56:05

+0

http://stackoverflow.com/questions/4641680/android-facebook-graph-api-to-update-status 这也会帮助你。谢谢 – SALMAN 2011-11-22 16:20:23

您需要获取应用程序的身份验证令牌以作为该应用程序发布。

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" 
     } 
    ] 
} 

确保您有manage_pages权限调用该API之前,或您将无法获得访问令牌回来。

一旦你有了访问令牌,你就可以像任何其他用户那样发布到墙上。请注意,URL中使用的ID与应用程序的ID相匹配。这将作为应用程序发布到应用程序的墙上。

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

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

+0

https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=[AppID]&client_secret=[AppSecret] 这是我用来获取令牌的。这不是验证令牌吗? – ThdK 2011-04-16 15:13:18

+1

这将直接为用户提供访问令牌。你需要一个应用程序本身。我更新了上面的答案,以便更详细。 – 2011-04-16 15:18:02

+0

好的这个作品完美的写一些东西到应用程序墙。但是如果我想使用我的粉丝页面,它不起作用。我也想在页面本身的行为页面上写一些东西。我试着用你以前的答案得到的access_tokens。 – ThdK 2011-04-18 10:27:37

最近我和FB api一起工作过。
我已经完成了JavaScript中的每一件事。
以下是我用来发布到用户墙上的内容。
我希望这可以帮助你。

  • 包括由FB提供的JavaScript库并将您的应用ID添加到它。

     
    <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” 为ID,然后我用的jQuery如下:
     
    $("#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'}); 
    

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

  • 使用id = “stream_publish”,然后将下面的jQuery A键:

     
    $("#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.'; 
        }); 
    }; 
    

  • 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); 
        } 
    } 
    
    +0

    渲染位于FBDialog.Class.Facebook Connect Graph Api中的FBViewClient类。感谢它一定会帮助你。 – SALMAN 2011-11-22 16:24:32

    +1

    有关如何回答问题的更多信息,请阅读[常见问题]。我们感谢您的帮助,但我们希望鼓励用户添加精心设计的答案。 – Will 2011-11-22 19:15:50