Facebook: lấy danh sách các trang mà người dùng là quản trị viên của


84

Tôi đang sử dụng api biểu đồ.

Tôi có một người dùng đã đăng nhập và muốn lấy lại danh sách id trang của tất cả các trang mà người dùng đó là quản trị viên.

Có cách nào để làm điều này? Các tài liệu khá tệ - và hình tròn.


3
10 năm sau, và tài liệu vẫn còn tệ.
Darkwonder

Câu trả lời:


142

Nó đơn giản với API Đồ thị. Các bước:

  1. Nhận manage_pagesquyền từ người dùng (quyền mở rộng).
  2. Gọi API Đồ thị - https://graph.facebook.com/me/accounts

Bạn có thể kiểm tra quy trình này trong trình khám phá đồ thị -> Chỉ cần nhấp vào nút 'Nhận Mã thông báo Truy cập' -> trong phần ' Quyền mở rộng ' , chọn' management_pages 'và gửi nó. Nó sẽ cung cấp cho bạn JSON chi tiết trang quản trị.


11
Chuyển đổi câu trả lời vì điều này có vẻ giống như cách làm tiêu chuẩn / ổn định hơn. Mặc dù tôi sẽ cảnh báo chống lại bất kỳ sử dụng của từ 'đơn giản': mọi thứ đều đơn giản một khi bạn biết làm thế nào :)
EoghanM

1
ya. bạn đúng. Nhưng có thể có một số giải pháp cho một vấn đề. Chúng ta cần chọn cái đơn giản nhất trong số đó.
Avisek Chakraborty

1
Nếu bạn đang sử dụng FB PHP SDK thì dễ dàng hơn: chỉ cần $ user_admin_pages = $ facebok-> api ('/ me / account');
Jepser Bernardino

2
Lợi thế của việc truy vấn với FQL so với sử dụng yêu cầu biểu đồ là biểu đồ luôn buộc dữ liệu trả về phải được 'phân trang' (nó chỉ trả về một vài kết quả đầu tiên và một liên kết đến một vài kết quả tiếp theo) - trong khi trong FQL, nó luôn trả về toàn bộ kết quả được đặt trong một lần.
Yuval A.

5
Cảm ơn. Nó chỉ liệt kê các trang nếu người dùng hiện tại quản lý ứng dụng. Có cách nào để liệt kê các trang của một người khác?
Soorajlal KG

14

Tôi đã giải quyết nó bằng một số 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;
       }}

5
Kể từ tháng 8 năm 2014: "Các API FQL và REST không còn khả dụng trong v2.1: Đã thông báo trước đây với v2.0, các ứng dụng phải di chuyển sang các lệnh gọi API Đồ thị được phiên bản bắt đầu bằng v2.1". Nói cách khác, FQL không còn có thể được sử dụng.
Kapitein Witbaard

11

Bạn có thể gọi FB.api(/me/accounts)nếu không muốn sử dụng FQL.

'tài khoản' là một kết nối của đối tượng Người dùng. Xem tài liệu cho @ http://developers.facebook.com/docs/reference/api/user này

Tất nhiên, với Facebook, luôn có một sự bắt kịp. Ngay bây giờ, phương thức này sẽ trả về không chỉ các trang mà người dùng là quản trị viên mà còn trả về những ứng dụng họ đã cài đặt. Tôi gần như khẳng định đây KHÔNG phải là hành vi dự định - dường như tôi nhớ đã sử dụng điều này vài tháng trước và chỉ nhận được danh sách các trang. Tài liệu cũng không đề cập đến các ứng dụng trong danh sách này.

Đây là một vấn đề dễ giải quyết - Facebook trả về tên, danh mục và id cho từng mục trong danh sách và mỗi ứng dụng có một danh mục là 'Ứng dụng'. Tôi chỉ đơn giản là đảm bảo rằng tôi chỉ liệt kê các mục có danh mục không phải là 'Ứng dụng'.


1
Kể từ tháng 12 năm 2012, tài liệu cho 'tài khoản' nói rằng nó sẽ trả về các trang và ứng dụng mà người dùng sở hữu.
Ít người biết đếnRobot

Là Thr cách nào để trang danh sách của người khác
Soorajlal KG

@SoorajlalKG không, bạn sẽ không có quyền làm như vậy.
Raptor

11

đi đến địa chỉ này

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

Chỉ cần nhấp vào nhận mã thông báo Access và chuyển đến Quyền mở rộng

Đánh dấu vào hộp kiểm management_pages

nhấp vào Nhận mã thông báo truy cập

Sau đó trong FQL viết điều này

tôi / tài khoản? type = trang

Nhấp vào Gửi. và bạn sẽ nhận được tất cả danh sách trang đã đăng nhập quản trị viên người dùng


5
Bạn đã tìm thấy ở đâu me/accountshỗ trợ typetham số truy vấn?
Serge S.

7

Bạn yêu cầu quyền với SDK JavaScript khi đăng nhập

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

và sau đó khi họ đăng nhập, bạn có thể truy xuất các trang (và ứng dụng) như sau:

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

4
Sự khác biệt giữa {perms: 'manage_pages'}và là {scope: 'manage_pages'}gì?
Kees C. Bakker

6

Bạn cũng có thể sử dụng quyền "pages_show_list", nếu bạn muốn chỉ danh sách các trang facebook mà người dùng là quản trị viên.

Quyền "management_pages" sẽ yêu cầu người dùng quyền quản lý các trang của mình, quyền này có thể quá xâm phạm tùy thuộc vào những gì bạn cần.


5

Lưu ý rằng giải pháp của bạn trả về Trang cũng như Ứng dụng . Nếu bạn thực sự muốn Trang, bạn có thể sử dụng Đa truy vấn FQL với mệnh đề "Loại không bằng" như sau:

{
"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)"
}

5

Sự cho phép

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

hoạt động

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

1
<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>

Bạn dường như sử dụng một số khuôn khổ trong mã của mình, bạn có vui lòng giải thích nó không?
Raptor

Chỉ đăng một mã không phải là một câu trả lời tốt, theo quan điểm của tôi.
Igorzovisk

0

Với API GRAPH v3 mới với Javascript, hãy sử dụng trường 'nhiệm vụ' thay vì trường '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"
      ]
    }

Thay vì tìm kiếm 'ADMINISTER' trong mảng, hãy tìm kiếm 'MANAGE'.

Thông tin đầy đủ tại đây: https://developers.facebook.com/docs/pages/access-tokens

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.