在具有 C# /me/accounts 和 manage_pages 权限的 Facebook 中不显示任何页面

Posted

技术标签:

【中文标题】在具有 C# /me/accounts 和 manage_pages 权限的 Facebook 中不显示任何页面【英文标题】:In Facebook with C# /me/accounts with manage_pages permission does not show any pages 【发布时间】:2014-12-11 13:27:29 【问题描述】:

我正在尝试使用 c# MVC 在 Facebook 中获取页面数据。即使我授予 manage_pages 权限(范围),当我运行我的代码时它也不会显示任何页面。这是 pagelist 显示 0 的地方

string Accounts = "/me/accounts";
JSONObject pageData = api.Get(Accounts);
var data = pageData.Dictionary["data"];
List<JSONObject> pageList = data.Array.ToList<JSONObject>();
ViewBag.pageList = pageList;

下面是我试过的代码

public ActionResult returnfromfb()
    
        string app_id = "AppID";
        string app_secret = "AppSecret";
        string scope = "manage_pages,publish_stream,status_update,user_about_me,user_hometown,user_location,email,offline_access";

        string code = Request.QueryString["code"];
        if (code == null)
        
            Response.Redirect(string.Format("https://graph.facebook.com/oauth/authorize?client_id=0&redirect_uri=1&scope=2",
                app_id, Request.Url.AbsoluteUri, scope));

        

        string AccessToken = "";
        try
        
            if (code != null)
            
                string str = string.Format("https://graph.facebook.com/oauth/access_token?client_id=0&redirect_uri=1&scope=2&code=3&client_secret=4",
                app_id, Request.Url.AbsoluteUri, scope, Request["code"].ToString(), app_secret);

                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(str);
                req.Method = "POST";
                req.ContentType = "application/x-www-form-urlencoded";
                byte[] Param = Request.BinaryRead(System.Web.HttpContext.Current.Request.ContentLength);
                string strRequest = System.Text.Encoding.ASCII.GetString(Param);

                req.ContentLength = strRequest.Length;

                StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
                streamOut.Write(strRequest);
                streamOut.Close();
                StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
                string strResponse = streamIn.ReadToEnd();
                if (strResponse.Contains("&expires"))
                    strResponse = strResponse.Substring(0, strResponse.IndexOf("&expires"));
                AccessToken = strResponse.Replace("access_token=", "");
                streamIn.Close();
            

            Facebook.FacebookAPI api = new Facebook.FacebookAPI(AccessToken);
            string requestEmail = "/me";
            JSONObject fbemail = api.Get(requestEmail);
            try
            
                ViewBag.Email = fbemail.Dictionary["email"].String;
            
            catch (Exception ex)
            
                //errorLog.setError(ex, "LoginController.SaveFacebookData");
            

            string Accounts = "/me/accounts";
            JSONObject pageData = api.Get(Accounts);
            var data = pageData.Dictionary["data"];
            List<JSONObject> pageList = data.Array.ToList<JSONObject>();
            ViewBag.pageList = pageList;
            foreach (var page in pageList)
            

                try
                
                   var id = page.Dictionary["id"].String;
                    string request = id;
                    JSONObject fbobject = api.Get(request);
                    try
                    
                        ViewBag.BusinessName = fbobject.Dictionary["name"].String;
                        ViewBag.Address = fbobject.Dictionary["location"].ToDisplayableString();
                        ViewBag.PhoneNumber = fbobject.Dictionary["phone"].String;


                    
                    catch (Exception ex)
                    
                        //errorLog.setError(ex, "LoginController.SaveFacebookData");
                    
                
                catch (Exception ex)
                
                    //errorLog.setError(ex, "LoginController.SaveFacebookData");
                
            

【问题讨论】:

你们一直从哪里复制代码? status_update 和 offline_access 已被弃用多年。 archive.org...@luschn @luschn - Facebook 开发者工具包 那个? > facebooktoolkit.codeplex.com - 你知道,它是 2010 年的。 @luschn- 事情是它在我的 Facebook 帐户上运行良好,就像我在不同的帐户上尝试它一样,即使它们存在,它也不会显示该帐户的页面。 【参考方案1】:
I have Finally managed to get the desired result using #Remodal.js

<head>
 <link rel="stylesheet" href="@Url.Content("~/Content/jquery.remodal.css")">
</head>

<body>
<script type="text/javascript" src="@Url.Content("~/Scripts/Home/jquery.remodal.js")"></script>
<div class="remodal" id="page-selector-remodal" data-remodal-id="pageselector">
        <p>Please select a facebook page Share </p>
        <div id="page-name-container">
            <select id="page-name" class="form-control">
            </select>
        </div>
        <a class="remodal-confirm" id="facebookPageSelectSubmit" href="#">OK</a>
        <a class="remodal-cancel" id="remodal-cancel" href="#">CANCEL</a>
    </div>

    <div data-remodal-id="modal-status">
        <p id="modal-status-content">
            The Account you have selected does not have Email.
        </p>
        <br>
        <a class="remodal-confirm" href="#">OK</a>
    </div>
<script type="text/javascript>
 (function (d, s, id) 
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) return;
            js = d.createElement(s);
            js.id = id;
            js.src = "//connect.facebook.net/en_US/sdk.js";
            fjs.parentNode.insertBefore(js, fjs);
        (document, 'script', 'facebook-jssdk'));

        window.fbAsyncInit = function () 
            FB.init(
                appId: 'YOUR APP ID',
                cookie: true,  // enable cookies to allow the server to access 
                // the session
                xfbml: true,  // parse social plugins on this page
                version: 'v2.2' // use version 2.1
            );
        ;

        var pageSelector = $('[data-remodal-id=pageselector]').remodal();
        var modalstatus = $('[data-remodal-id=modal-status]').remodal();

        function statusChangeCallback(response) 

            if (response.status === 'connected') 
                // Logged into your app and Facebook.
                //testAPI();
             else if (response.status === 'not_authorized') 
                // The person is logged into Facebook, but not your app.
                $("#modal-status-content").empty().html(response.status);
                modalstatus.open();
            

            else 
                $("#modal-status-content").empty().html(response.status);
                modalstatus.open();
                // The person is not logged into Facebook, so we're not sure if
                // they are logged into this app or not.
                document.getElementById('status').innerHTML = 'Please log ' +
                    'into Facebook.';
            
        


        function FacebookHandler() 
            FB.login(function (result) 
                if (result != null && result.authResponse != null && result.authResponse != undefined) 
                    facebookPageData = result;
                    FB.api('/me/accounts', function (accountsResult) 
                        if (accountsResult != null && accountsResult.data.length != 0) 
                            //open the remodal here
                            pageSelector.open();
                            facebookAccountsData = accountsResult;
                            var data = accountsResult['data'];
                            if (data != null) 
                                for (var i = 0; i < data.length; i++) 
                                    $("#page-name").append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
                                
                            
                            unblockUI('body');
                            $("#flip-container, #feature-container, #branding-container, #intro-arrow-container, #share-container, #copyright-text-container").hide();
                            $("body").css("padding-right", "0");
                        
                        else 
                            $("#modal-status-content").empty().html("The Account you have selected does not have any facebook page,<br />Post to Wall.");
                            modalstatus.open();
                            pageSelector.open();
                            unblockUI('body');
                        
                    );
                
                else 
                    $("#modal-status-content").empty().html("Unable to retrieve your details from facebook, try again after sometime.");
                    modalstatus.open();
                    unblockUI('body');
                
            ,  scope: 'manage_pages, publish_stream' );
        

        $("#facebookPageSelectSubmit").on("click", function () 
            var facebookpageId = $("#page-name option:selected").val();
            if (facebookpageId != null) 
                FB.api('/' + facebookpageId, function (identity) 

                    if (identity != null) 
                        FB.api('/' + facebookpageId,  fields: 'access_token' , function (resp) 
                            if (resp.access_token != null) 
                                //Get the "resp"(Data) here
                        
                        else 

                        

                    );
                

                else 

                
            );
        
        else 

        
    );
</script>

//Finally call the "FacebookHandler()" function on click


</body>

【讨论】:

以上是关于在具有 C# /me/accounts 和 manage_pages 权限的 Facebook 中不显示任何页面的主要内容,如果未能解决你的问题,请参考以下文章

Facebook Graph API me / accounts返回空的Json数据数组

如何绘制具有许多 MaN 的时间序列?

如何从包含所有喜欢和评论的页面中获取所有帖子?

模拟登录readfree(手动验证码)

匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记

C#中具有相同名称和签名但返回类型不同的方法