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

我正在使用图形 api。

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

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

【问题讨论】:

  • 10 年后,文档仍然很糟糕。
  • bad 是一种严重的轻描淡写。盖克。

标签: facebook facebook-graph-api facebook-page


【解决方案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 很简单。步骤:

      1. 从用户那里获得manage_pages 权限(扩展权限)。
      2. 调用图形 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 不,您没有权限这样做。
          猜你喜欢
          • 1970-01-01
          • 2015-09-28
          • 1970-01-01
          • 2018-05-11
          • 1970-01-01
          • 2012-02-18
          • 2015-11-02
          • 1970-01-01
          • 2017-08-04
          相关资源
          最近更新 更多