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

时间:2011-04-16 14:51:54

标签: java facebook facebook-graph-api facebook-wall

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

以下是我尝试这样做的方法:

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

有谁知道我哪里错了?我真的很困惑。

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

您需要为当前用户请求以下图谱API网址,以便为您的应用找到访问令牌。

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权限。

答案 1 :(得分:2)

最近我和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'});
    

    请注意,您必须如上所述添加 {perms:'publish_stream'} ,这将使您有权发布到用户墙。

  • 一个id =“stream_publish”的按钮,然后是以下jquery:

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

  • 答案 2 :(得分:1)

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