Pregunta Obtener la URL de imagen de perfil de Facebook "real" de la API de gráficos


La API de gráficos de Facebook me dice que puedo obtener una foto de perfil de un usuario usando

http://graph.facebook.com/517267866/picture?type=large

que funciona bien Sin embargo, cuando escribe la URL anterior en un navegador, la dirección real de la imagen es

http://profile.ak.fbcdn.net/profile-ak-snc1/v227/560/83/n517267866_1928.jpg

¿Cómo puedo obtener la segunda URL usando la primera mediante programación?


74
2017-07-27 08:01


origen


Respuestas:


La primera URL da un HTTP 302 (redirección temporal) a la segunda. Entonces, para encontrar la segunda URL programáticamente, podría emitir una solicitud HTTP para la primera URL y obtener el Location encabezado de la respuesta.

Dicho esto, no confíe en que la segunda URL sea permanente. Leyendo un poco sobre el código de respuesta HTTP (de 302 frente a un 301 permanente), es posible que Facebook cambie esas URL de manera regular para evitar que las personas, por ejemplo, utilicen sus servidores para alojar imágenes.


Editar: Tenga en cuenta que la URL de CDN que OP publicó ahora es 404, por lo que sabemos que no podemos confiar en que la URL sea de larga duración. Además, si está enlazando a Graph API desde <img> en una página segura de SSL, hay un parámetro tienes que agregar asegúrate de usar https://graph.facebook.com.


Actualizar: La API tiene agregado un parámetro - redirect=false - que hace que se devuelva JSON en lugar de una redirección. El JSON recuperado incluye la URL CDN:

{
   "data": {
      "url": "http://profile.ak.fbcdn.net/...",
      "is_silhouette": false
   }
}

Nuevamente, no confiaría en que esta URL de CDN sea duradera. La respuesta JSON se envía con encabezados permisibles CORS, por lo que puede hacer este lado del cliente con solicitudes XHR.


68
2017-07-27 08:10



http://graph.facebook.com/517267866/?fields=picture&type=large

Devolvería la URL en JSON


36
2018-04-10 14:38



Me doy cuenta de que esto es tarde, pero hay otra forma de obtener la URL de la imagen del perfil.

A su url original, puede agregar el parámetro redirect=false para obtener la URL real de la imagen a la que normalmente se le redirigiría.

Entonces, la nueva solicitud se vería como http://graph.facebook.com/517267866/picture?type=large&redirect=false. Esto devolverá un objeto JSON que contiene la URL de la imagen y una booleana is_silhouette (verdadera si la imagen es la imagen predeterminada de Facebook).

La imagen será del tamaño que especificó, también. Puede probar esto adicionalmente agregando dimensiones: http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400


16
2017-10-04 14:29



Para cualquier otra persona que busque obtener la foto de perfil en iOS:

Acabo de hacer esto para obtener la foto de Facebook del usuario:

NSString *profilePicURL = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?type=large", fbUserID];

donde 'fbUserID' es el ID de perfil del usuario de Facebook.

De esta manera siempre puedo llamar a la url en profilePicURL para obtener la imagen, y siempre la obtengo, no hay problema. Si ya tiene la ID de usuario, no necesita ninguna solicitud de API, solo inserte la ID en la url después de facebook.com/.

FYI a cualquiera que busque quién necesita el fbUserID en iOS:

if (FBSession.activeSession.isOpen) {
    [[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection,
       NSDictionary<FBGraphUser> *user,
       NSError *error) {
         if (!error) {
             self.userName = user.name;
             self.fbUserID = user.id;
         }
     }];
}

Necesitarás una FBSession activa para que funcione (consulta los documentos de Facebook y el ejemplo "Scrumptious").


7
2018-04-03 06:30



Si desea el JSON de una imagen de perfil de buena calidad con la URL, puede usar eso:

http://graph.facebook.com/517267866/picture?height=1024&redirect=false

si solo necesita la imagen, úselo sin el parámetro redirigir:

http://graph.facebook.com/517267866/picture?height=1024

517267866 es el ID de perfil de uno de los ejemplos anteriores. Pon la identificación de Facebook que necesitas

Espero que eso ayude


5
2018-01-18 09:22



$url = 'http://graph.facebook.com/100000771470028/picture?type=large';
$rray=get_headers($url);
$hd = $rray[4];
echo(substr($hd,strpos($hd,'http')));

Esto devolverá la URL que solicitó, y el problema de cambiar la URL en Facebook no importa porque está llamando dinámicamente a la URL desde la URL original.


3
2017-07-13 11:31



este es el único que realmente funciona:

me?fields=picture.type(*YOURTYPE*)

dónde TU TIPO puede ser uno de los siguientes: pequeño, normal, álbum, grande, cuadrado


2
2017-10-19 09:19



Para Android:

De acuerdo con el último SDK de Facebook,

Primero debes llamar GraphRequest API para obtener todos los detalles del usuario en el que API también da URL of current Profile Picture.

Bundle params = new Bundle();
params.putString("fields", "id,email,gender,cover,picture.type(large)");
new GraphRequest(token, "me", params, HttpMethod.GET,
        new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse response) {
                if (response != null) {
                    try {
                        JSONObject data = response.getJSONObject();
                        if (data.has("picture")) {
                            String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
}).executeAsync();

2
2017-11-26 10:47