Facebook: obtenga una lista de las páginas de las que un usuario es administrador

84

Estoy usando la api gráfica.

Tengo un usuario que ha iniciado sesión y quiero obtener una lista de los ID de página de todas las páginas de las que el usuario es administrador.

¿Hay alguna forma de hacer esto? Los documentos son bastante malos y circulares.

EoghanM
fuente
3
10 años después, y la documentación sigue siendo mala.
Darkwonder

Respuestas:

142

Es simple con Graph API. Pasos:

  1. Obtenga el manage_pagespermiso del usuario (permisos extendidos).
  2. Llame a la API Graph - https://graph.facebook.com/me/accounts

Puede probar este procedimiento en el explorador de gráficos -> Simplemente haga clic en el botón 'Obtener token de acceso' - > en 'Permiso extendido' marque 'administrar_páginas' y envíelo. Le dará el JSON de detalles de la página de administración.

Avisek Chakraborty
fuente
11
Cambiar respuestas ya que suena como la forma más estándar / estable de hacerlo. Aunque advertiría contra cualquier uso de la palabra 'simple': todo es simple una vez que sabes cómo :)
EoghanM
1
ya. Tienes razón. Pero puede haber varias soluciones a un problema. Debemos elegir el más simple entre ellos.
Avisek Chakraborty
1
Si está utilizando FB PHP SDK, es más fácil: solo $ user_admin_pages = $ facebok-> api ('/ me / accounts');
Jepser Bernardino
2
La ventaja de consultar con FQL frente al uso de una solicitud de gráfico es que el gráfico siempre obliga a que los datos devueltos sean 'paginados' (solo devuelve los primeros resultados y un enlace a los siguientes), mientras que en FQL siempre devuelve el conjunto de resultados completo en una sola vez.
Yuval A.
5
Gracias. Enumera las páginas solo si el usuario actual administra la aplicación. ¿Hay alguna forma de enumerar las páginas de otra persona?
Soorajlal KG
14

Lo resolví con algo de 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
fuente
5
A partir de agosto de 2014: "Las API de FQL y REST ya no están disponibles en la v2.1: anunciadas anteriormente con la v2.0, las aplicaciones deben migrar a las llamadas de la API de Graph con versión a partir de la v2.1". En otras palabras, el FQL ya no se puede utilizar.
Kapitein Witbaard
11

Puede llamar FB.api(/me/accounts)si no desea utilizar FQL.

'cuentas' es una conexión del objeto Usuario. Consulte la documentación para esto @ http://developers.facebook.com/docs/reference/api/user

Por supuesto, con Facebook, siempre hay una trampa. En este momento, este método devolverá no solo las páginas de las que el usuario es administrador, sino también las aplicaciones que ha instalado. Estoy casi seguro de que este NO es el comportamiento previsto; creo recordar haber usado esto hace unos meses y solo obtener una lista de páginas. La documentación tampoco menciona aplicaciones en esta lista.

Sin embargo, este es un problema fácil de resolver: Facebook devuelve el nombre, la categoría y la identificación de cada elemento de la lista, y cada aplicación tiene una categoría de "Aplicación". Simplemente me aseguro de enumerar solo los elementos cuya categoría no sea 'Aplicación'.

Steven Mercatante
fuente
1
A diciembre de 2012, la documentación de las 'cuentas' indica que devolverá las páginas y aplicaciones que posee el usuario.
ObscureRobot
¿Es posible enumerar las páginas de otra persona?
Soorajlal KG
@SoorajlalKG no, no tendrás permiso para hacerlo.
Raptor
11

ir a esta dirección

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

Simplemente haga clic en obtener token de acceso y vaya a Permiso extendido

Marque la casilla de verificación manage_pages

y haga clic en Obtener token de acceso

Entonces bajo FQL escribe esto

yo / cuentas? type = page

Haga clic en Enviar. y obtendrá todas las listas de páginas que iniciaron sesión en el administrador de usuarios

Tarun Gupta
fuente
5
¿Dónde ha encontrado que me/accountsadmita el typeparámetro de consulta?
Serge S.
7

Solicita el permiso con el SDK de JavaScript al iniciar sesión

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

y luego, una vez que inicien sesión, puede recuperar las páginas (y aplicaciones) de la siguiente manera:

FB.api('/me/accounts', function(response){
    console.log(response);
})
sakibmoon
fuente
4
¿Cuál es la diferencia entre {perms: 'manage_pages'}y {scope: 'manage_pages'}?
Kees C. Bakker
6

También puede usar el permiso "pages_show_list", si solo desea la lista de páginas de Facebook de las que el usuario es administrador.

El permiso "manage_pages" le pedirá al usuario permiso para administrar sus páginas, lo que puede ser demasiado intrusivo dependiendo de para qué lo necesite.

glneto
fuente
5

Tenga en cuenta que su solución devuelve tanto Páginas como Aplicaciones . Si desea estrictamente las páginas, puede usar FQL Multiquery con una cláusula "Tipo no es igual" como esta:

{
"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
fuente
5

Permiso

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

acción

$accounts = $facebook->api('/me/accounts');  
return $accounts;
Saurabh Chandra Patel
fuente
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>
Pavan kishore Karur
fuente
Parece que utiliza algunos marcos en sus códigos, ¿le importaría explicarlo?
Raptor
Publicar un código no es una buena respuesta, desde mi punto de vista.
Igorzovisk
0

Con la nueva API GRAPH v3 con Javascript, use el campo 'tareas' en lugar del campo 'permisos'.

//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"
      ]
    }

En lugar de buscar 'ADMINISTER' dentro de la matriz, busque 'ADMINISTRAR'.

Información completa aquí: https://developers.facebook.com/docs/pages/access-tokens

Jason Engage
fuente