Facebook: получить список страниц, администратором которых является пользователь

84

Я использую api графика.

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

Есть способ сделать это? Документы довольно плохие - круглые.

EoghanM
источник
3
10 лет спустя, а документация все еще плохая.
Darkwonder

Ответы:

143

Это просто с Graph API. Шаги:

  1. Получите manage_pagesразрешение от пользователя (расширенные разрешения).
  2. Вызовите Graph API - https://graph.facebook.com/me/accounts

Вы можете протестировать эту процедуру в проводнике графиков -> Просто нажмите кнопку «Получить токен доступа» -> в разделе «Расширенное разрешение » установите флажок «manage_pages» и отправьте его. Он предоставит вам JSON-информацию о странице администратора.

Ависек Чакраборти
источник
11
Переключение ответов, поскольку это звучит как более стандартный / стабильный способ сделать это. Хотя я бы предостерегал от любого использования слова «простой»: все просто, если ты знаешь как :)
EoghanM 02
1
я. ты прав. Но вариантов решения проблемы может быть несколько. Нам нужно выбрать среди них самые простые.
Avisek Chakraborty 02
1
Если вы используете FB PHP SDK, это проще: просто $ user_admin_pages = $ facebok-> api ('/ me / accounts');
Jepser Bernardino
2
Преимущество запросов с помощью FQL по сравнению с использованием запроса графа состоит в том, что граф всегда заставляет возвращаемые данные быть "разбитыми на страницы" (он возвращает только первые несколько результатов и ссылку на несколько следующих) - тогда как в FQL он всегда возвращает весь набор результатов за один раз.
Yuval A.
5
Благодарю. В нем перечислены страницы, только если текущий пользователь управляет приложением. Есть ли способ перечислить страницы другого человека?
Soorajlal KG 02
14

Я решил это с помощью некоторого 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;
       }}
EoghanM
источник
5
По состоянию на август 2014 г .: «API-интерфейсы FQL и REST больше не доступны в версии 2.1: приложения, ранее объявленные в версии 2.0, должны перейти на вызовы API Graph с поддержкой версий, начиная с версии 2.1». Другими словами, FQL больше не может использоваться.
Kapitein Witbaard
11

Вы можете позвонить, FB.api(/me/accounts)если не хотите использовать FQL.

«учетные записи» - это подключение объекта «Пользователь». См. Документацию для этого @ http://developers.facebook.com/docs/reference/api/user

Конечно, с Facebook всегда есть загвоздка. Сейчас этот метод будет возвращать не только страницы, администратором которых является пользователь, но и то, какие приложения он установил. Я почти уверен, что это НЕ предполагаемое поведение - я, кажется, помню, как использовал это несколько месяцев назад и получал только список страниц. В документации также не упоминаются приложения из этого списка.

Однако эту проблему легко решить - Facebook возвращает имя, категорию и идентификатор для каждого элемента в списке, и каждое приложение имеет категорию «Приложение». Я просто убеждаюсь, что перечисляю только те элементы, категория которых не является «Применение».

Стивен Меркатанте
источник
1
По состоянию на декабрь 2012 года в документации для «учетных записей» указано, что он будет возвращать страницы и приложения, принадлежащие пользователю.
ObscureRobot
Есть ли способ перечислить страницы другого человека?
Сураджлал К.Г. 02
@SoorajlalKG нет, у вас не будет на это разрешения.
Raptor
11

перейти по этому адресу

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

Просто нажмите на получение токена доступа и перейдите к расширенному разрешению

Установите флажок manage_pages

и нажмите Получить токен доступа

Затем под FQL напишите это

я / аккаунты? type = page

Нажмите "Отправить". и вы получите все списки страниц, которые вошли в систему с правами администратора

Тарун Гупта
источник
5
Где вы нашли, что me/accountsподдерживает typeпараметр запроса?
Serge S.
7

Вы запрашиваете разрешение с помощью JavaScript SDK при входе в систему

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

а затем, как только они войдут в систему, вы можете получить страницы (и приложения) следующим образом:

FB.api('/me/accounts', function(response){
    console.log(response);
})
Sakibmoon
источник
4
В чем разница между {perms: 'manage_pages'}и {scope: 'manage_pages'}?
Kees C. Bakker
6

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

Разрешение «manage_pages» запрашивает у пользователя разрешение на управление его страницами, что может быть слишком навязчивым в зависимости от того, для чего вам это нужно.

Glneto
источник
5

Обратите внимание, что ваше решение возвращает как страницы, так и приложения . Если вам строго нужны 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)"
}
dbau
источник
5

Разрешение

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

действие

$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>
Паван кишоре Карур
источник
Вы, кажется, используете какие-то фреймворки в своих кодах, не могли бы вы объяснить это?
Raptor
С моей точки зрения, просто опубликовать код - не лучший ответ.
Игорзовиск
0

В новом GRAPH API v3 с Javascript используйте поле «задачи» вместо поля «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"
      ]
    }

Вместо того, чтобы искать в массиве «АДМИНИСТРА», ищите «УПРАВЛЕНИЕ».

Полная информация здесь: https://developers.facebook.com/docs/pages/access-tokens

Джейсон Engage
источник