Как приложение Facebook может публиковать сообщения на стене? - PullRequest
3 голосов
/ 16 апреля 2011

Я уже узнал, как опубликовать что-то на стене с графиком API от имени пользователя 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."
}

Кто-нибудь видит, где это я иду не так? Я действительно застрял на этом.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Вам необходимо получить токен авторизации для вашего приложения, чтобы опубликовать его в качестве приложения.

Auth_Token определяет контекст безопасности, который вы публикуете.

Вам потребуется запросить следующий URL API API для текущего пользователя, чтобы найти токен доступа для вашего приложения.

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

Это должно дать вам вывод, подобный следующему:

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

Убедитесь, что у вас есть разрешение manage_pages, прежде чем вызывать этот API, иначе вы не получите токен доступа.

Получив токен доступа, вы публикуете его на стене, как и любой другой пользователь. Обратите внимание, что идентификатор, используемый в URL, совпадает с идентификатором приложения. Это будет опубликовано на стене приложения в качестве приложения.

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

Перед публикацией на стене убедитесь, что у вас есть разрешение publish_stream.

2 голосов
/ 16 апреля 2011

Недавно я работал с FB API.
Я сделал все в JavaScript.
Вот что я использовал для публикации на стене пользователя.
Я надеюсь, это поможет вам.

Включите библиотеку JavaScript, предоставленную FB, и добавьте в нее идентификатор своего приложения.
<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" в качестве идентификатора, а затем я использовал 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.';
    });
};

1 голос
/ 22 ноября 2011
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);
    }
}
...