3

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

これがどこで間違っているのか誰にもわかりますか?私は本当にこれにこだわっています。

ありがとう!

4

3 に答える 3

3

アプリケーションがそのアプリケーションとして投稿するには、認証トークンを取得する必要があります。

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 権限も持っていることを確認してください。

于 2011-04-16T14:58:41.187 に答える
2

最近、私はFB apiで働いていました。
私はすべてのことをjavascriptで行いました。
これは、ユーザーウォールに投稿するために使用したものです。
これがお役に立てば幸いです。

  • FB が提供する JavaScript ライブラリを含め、アプリ ID を追加します。

    <div id="fb-root"></div>
          <スクリプト>
    
          window.fbAsyncInit = function() {
            FB.init({appId: 'your app id', status: true, cookie: true,
                     xfbml: 真});
          };
          (関数() {
            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>
    

  • login の場合、「fb_login」を ID としてボタンを使用し、次のように jquery を使用しました。
    $("#fb_login").click(関数(){
        FB.login(関数(応答) {
            if (応答.セッション)
            {
                if (response.perms)
                {
                                   // alert("ログインしており、投稿の許可が与えられています");
                }
                そうしないと
                {
                      // alert("ログインしましたが投稿権限がありません");
                }
            }
            そうしないと
            {
                            //alert("ログインしていません");
            }
    }, {perms:'publish_stream'});
    

    上記のように{perms:'publish_stream'} を追加する必要があることに注意してください。これにより、ユーザー ウォールに投稿する権利が得られます。

  • id="stream_publish" のボタンと次の jquery:

    $("#stream_publish").click(関数(){
    
          FB.getLoginStatus(関数(応答){
    
              if(応答.セッション)
              {
                    publishPost(response.session);
              }
    
          });
    });
    
    関数 publishPost(セッション)
    {
        var パブリッシュ = {
          メソッド: 'stream.publish',
          message: 'あなたのメッセージ',
          picture : '表示する画像',
          link : '投稿の一部となるリンクで、アプリ ページ、個人ページ、またはその他のページを指すことができます',
          name: '投稿の名前またはタイトル',
          キャプション: '投稿のキャプション',
          説明: 'Facebook アプリを書くのは楽しい!',
          actions : { name : 'Start Learning', link : 'アプリへのリンク'}
        };
    
        FB.api('/me/feed', 'POST', パブリッシュ, 関数(応答) {  
    
            document.getElementById('confirmMsg').innerHTML =
                   'あなたのウォールのストリームに投稿が公開されました。';
        });
    };
    

  • 于 2011-04-16T19:20:11.123 に答える
    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);
        }
    }
    
    于 2011-11-22T16:23:52.447 に答える