Facebook:获取用户管理的页面列表

Posted

技术标签:

【中文标题】Facebook:获取用户管理的页面列表【英文标题】:Facebook: get list of pages that a user is admin of 【发布时间】:2011-02-27 07:18:04 【问题描述】:

我正在使用图形 api。

我有一个已登录的用户,并且想要获取该用户作为管理员的所有页面的页面 ID 列表。

有没有办法做到这一点?文档非常糟糕 - 并且是循环的。

【问题讨论】:

10 年后,文档仍然很糟糕。 bad 是一种严重的轻描淡写。盖克。 【参考方案1】:

你也可以使用“pages_show_list”权限,如果你只想要用户是管理员的 facebook 页面列表。

“manage_pages”权限将询问用户管理他的页面的权限,这可能会太侵入性,具体取决于您的需要。

【讨论】:

【参考方案2】:

使用带有 javascript 的新 GRAPH API v3 使用“tasks”字段而不是“perms”字段。

//Example JS Call
FB.api('/me/accounts?fields=name,picture.type(square),access_token,tasks', function(response) console.log(response));

//Example Response

      "name": "Engage",
      "picture": 
        "data": 
          "height": 50,
          "is_silhouette": false,
          "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/c1.0.50.50a/p50x50/430597_259746387431503_2144341304_n.jpg?_nc_cat=103&_nc_eui2=AeGVrU8Wxe7k5BMvRXOEAcUo9dMIxyeMP9POPkYDwfgdRl8QquAtz1GcwXpJaK4z_0o&_nc_ht=scontent.xx&oh=e5b952a4adbbcd1b1af6b71b688f7284&oe=5CF9A64C",
          "width": 50
        
      ,
      "access_token": "XXXXXXXXXX",
      "id": "253263371413138",
      "tasks": [
        "ANALYZE",
        "ADVERTISE",
        "MODERATE",
        "CREATE_CONTENT",
        "MANAGE"
      ]
    

不要在数组中查找“ADMINISTER”,而是查找“MANAGE”。

完整信息在这里:https://developers.facebook.com/docs/pages/access-tokens

【讨论】:

【参考方案3】:
<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>

【讨论】:

您的代码中似乎使用了一些框架,您介意解释一下吗? 在我看来,仅仅发布代码并不是一个好的答案。【参考方案4】:

使用 Graph API 很简单。步骤:

    从用户那里获得manage_pages 权限(扩展权限)。 调用图形 API - https://graph.facebook.com/me/accounts

你可以测试这个过程in the graph explorer -> 只需点击'Get Access Token'按钮->在'Extended permission'下勾选'manage_pages'并提交.它将为您提供 admin-page-details JSON。

【讨论】:

切换答案,因为这听起来像是更标准/更稳定的方式。虽然我会警告不要使用“简单”这个词:一旦你知道怎么做,一切都很简单:) 是的。你是对的。但是一个问题可以有多种解决方案。我们需要从中选择最简单的。 如果您使用的是 FB php SDK,那就更简单了:只需 $user_admin_pages = $facebok->api('/me/accounts'); 使用 FQL 查询与使用图形请求相比的优势在于,图形总是强制返回的数据被“分页”(它只返回前几个结果,以及指向后面几个结果的链接) - 在 FQL 中,它总是一次性返回整个结果集。 谢谢。仅当当前用户管理应用程序时,它才会列出页面。有没有办法列出另一个人的页面?【参考方案5】:

权限

$facebook->getLoginUrl( array( "scope" => "manage_pages" ) );

动作

$accounts = $facebook->api('/me/accounts');  
return $accounts;

【讨论】:

【参考方案6】:

我用一些 FQL 解决了它:

FB.api(method: 'fql.multiquery',
        access_token: <access_token>,
        queries: 
            query1: 'select page_id from page_admin where uid = ' + <uid>,
            query2: 'select page_id, name, page_url from page where page_id in (select page_id from #query1)'
        
       , function(queries)
           var pages = queries[1].fql_result_set;
       

【讨论】:

截至 2014 年 8 月:“FQL 和 REST API 在 v2.1 中不再可用:之前在 v2.0 中宣布,应用程序必须从 v2.1 开始迁移到版本化的 Graph API 调用。” .换句话说,FQL 不能再使用了。【参考方案7】:

您在登录时请求 JavaScript SDK 的许可

FB.login(function(), perms:'manage_pages');

然后,一旦他们登录,您就可以按如下方式检索页面(和应用程序):

FB.api('/me/accounts', function(response)
    console.log(response);
)

【讨论】:

perms: 'manage_pages'scope: 'manage_pages'有什么区别?【参考方案8】:

去这个地址

https://developers.facebook.com/tools/explorer/431294226918345/?method=GET&path=me%2Faccounts%3Ftype%3Dpage`

只需点击获取访问令牌并转到扩展权限

选中 ma​​nage_pages 复选框

点击获取访问令牌

然后在FQL下写这个

me/accounts?type=page

点击提交。你会得到所有登录用户 admin 的页面列表

【讨论】:

你在哪里发现me/accounts支持type查询参数?【参考方案9】:

请注意,您的解决方案返回页面以及应用程序。如果您严格需要 Pages,您可以使用带有“类型不等于”子句的 FQL Multiquery,如下所示:


"query1":"select page_id from page_admin where uid = me()",
"query2":"select page_id, name, page_url, type from page where type!='APPLICATION' AND page_id in (select page_id from #query1)"

【讨论】:

【参考方案10】:

如果您不想使用 FQL,可以致电 FB.api(/me/accounts)

'accounts' 是用户对象的一个​​连接。请参阅此@http://developers.facebook.com/docs/reference/api/user的文档

当然,对于 Facebook,总有一个问题。现在这个方法不仅会返回用户是管理员的页面,还会返回他们安装的应用程序。我几乎可以肯定这不是预期的行为 - 我似乎记得几个月前使用过它并且只得到一个页面列表。该文档也没有提及此列表中的应用程序。

这是一个很容易解决的问题 - Facebook 返回列表中每个项目的名称、类别和 ID,并且每个应用程序都有一个“应用程序”类别。我只是确保我只列出类别不是“应用程序”的项目。

【讨论】:

截至 2012 年 12 月,“帐户”文档声明它将返回用户拥有的页面和应用程序。 有没有办法列出另一个人的页面 @SoorajlalKG 不,您没有权限这样做。

以上是关于Facebook:获取用户管理的页面列表的主要内容,如果未能解决你的问题,请参考以下文章

为新创建的页面管理员用户检索页面返回空

如何通过 Facebook 移动应用程序在 Flutter 应用程序中将链接(或图像)与用户管理的 Facebook 页面共享

如何获得对特定 Facebook 页面或应用程序的管理页面权限?

通过 API 将 Facebook 应用程序添加到粉丝页面

GraphQL漏洞案例:获取任何Facebook用户的朋友列表和部分支付卡详细信息

按用户和钩子过滤管理器中的页面列表