API de Facebook: ¿cómo obtengo la imagen de perfil de un usuario de Facebook a través de la API de Facebook (sin requerir que el usuario "Permita" la aplicación)

257

Estoy trabajando en un CMS que obtiene la imagen de perfil de un usuario de su URL de Facebook (es decir, http://facebook.com/users_unique_url ). ¿Cómo puedo lograr esto? ¿Existe una llamada a la API de Faceboook que obtenga la URL de la imagen de perfil de un usuario sin que el usuario necesite Permitir la aplicación?

John Himmelman
fuente

Respuestas:

409

Simplemente busque los datos a través de esta URL :

http://graph.facebook.com/userid_here/picture

Reemplace userid_herecon la identificación del usuario del que desea obtener la foto. También puede usar HTTPS también.

Puede usar la file_get_contentsfunción de PHP para leer esa URL y procesar los datos recuperados.

Recurso:

http://developers.facebook.com/docs/api

Nota: En php.ini, debe asegurarse de que la extensión OpenSSL esté habilitada para usar la file_get_contentsfunción de PHP para leer esa URL.

Sarfraz
fuente
73
Mirando más allá de esa página, otra cosa útil podría ser la ?type=largecadena de consulta que puede agregar. Accesorios para encontrar una respuesta mucho mejor que el raspado de pantalla que estaba escribiendo, por cierto :).
Domenic
66
Úselo <img src="//graph.facebook.com/sarfraz.anees/picture" />si cambia entre HTTP y HTTPS ... el navegador detecta el protocolo y no obtendrá advertencias de contenido mixto en HTTPS.
Chris Jacob
39
Cabe destacar, algunos usuarios NO tienen un nombre de usuario establecido para su cuenta de FB. Cuando este sea el caso, y esté intentando implementar esta respuesta, recibirá la imagen de perfil predeterminada de FB, el signo de interrogación. Para evitar fácilmente este problema, utilice la ID de FB del usuario.
Josh
77
Cabe señalar que en V2 de la API gráfica esto ya no funciona con un nombre de usuario. Entonces, primero necesita el ID de usuario y ya no puede usar un nombre de usuario para obtenerlo. Los ID de usuario también cambian por aplicación, por lo que tendrá que tener algún tipo de autenticación adecuada para recuperar un ID de usuario que pueda usar. Técnicamente, la foto del perfil sigue siendo pública y está disponible en graph.facebook.com/v2.2/4/picture?redirect=0, sin embargo, descubrir el ID de usuario (4 en el enlace anterior) parece imposible basado solo en el perfil del usuario. La antigua url gráfica todavía funciona hasta abril de 2015.
sckd
36
Es 2015 y estoy obteniendo (# 803) No puedo consultar a los usuarios por su nombre de usuario (sarfraz.anees)
Santosh Kumar
268

Mostrar:

50x50 píxeles

<img src="//graph.facebook.com/{{fid}}/picture">

200 píxeles de ancho

<img src="//graph.facebook.com/{{fid}}/picture?type=large">

Para guardar (usando PHP)

NOTA: No uses esto . Vea el comentario de @ Foreever a continuación.

$img = file_get_contents('https://graph.facebook.com/'.$fid.'/picture?type=large');
$file = dirname(__file__).'/avatar/'.$fid.'.jpg';
file_put_contents($file, $img);

Donde $ fid es su identificación de usuario en Facebook.

NOTA: En el caso de imágenes marcadas como "18+", necesitará un acceso_token válido de un usuario de 18+:

<img src="//graph.facebook.com/{{fid}}/picture?access_token={{access_token}}">

ACTUALIZACIÓN 2015:

Graph API v2.0 no se puede consultar con nombres de usuario, debe usar userIdsiempre.

neiker
fuente
66
Aquí hay más información sobre el parámetro de tipo: "Puede especificar el tamaño de imagen que desea con el argumento de tipo, que debe ser cuadrado (50x50), pequeño (50 píxeles de ancho, altura variable), normal (100 píxeles de ancho, altura variable) ) y grande (aproximadamente 200 píxeles de ancho, altura variable) "Vía Graph API en Facebook
3
Para usar este método, debe establecer allow_url_fopen en on. La directiva allow_url_fopen está deshabilitada de forma predeterminada. Debe tener en cuenta las implicaciones de seguridad de habilitar la directiva allow_url_fopen. Los scripts PHP que pueden acceder a archivos remotos son potencialmente vulnerables a la inyección de código arbitrario. Cuando la directiva allow_url_fopen está habilitada, puede escribir scripts que abran archivos remotos como si fueran archivos locales.
Foreever
Parece útil, así que aplaude de antemano, pero al ser un nivel demasiado nuevob para entender, me gustaría saber en qué lenguaje de programación se encuentra. Mi conjetura es PHP.
hello_there_andy
@hello_there_andy ¡Sí! Es PHP (en realidad, la pregunta está etiquetada como PHP y fue el único lenguaje que uso hace 4 años)
neiker
77
En julio de 2015 esto ya no funciona (error: "No se puede consultar a los usuarios por su nombre de usuario")
Flimm
164

ACTUALIZACIÓN :

A partir de finales de agosto de 2012, la API se actualizó para permitirle recuperar las imágenes de perfil del usuario en diferentes tamaños. Agregue los campos opcionales de ancho y alto como parámetros de URL:

https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT

donde WIDTHy HEIGHTson sus valores de dimensión solicitados.

Esto devolverá una imagen de perfil con un tamaño mínimo de WIDTHx HEIGHTal intentar preservar la relación de aspecto. Por ejemplo,

https://graph.facebook.com/redbull/picture?width=140&height=110

devoluciones

    {
      "data": {
        "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/s148x148/2624_134501175351_4831452_a.jpg",
        "width": 148,
        "height": 117,
        "is_silhouette": false
      }
   }

ACTUALIZACIÓN FINAL

Para obtener la foto de perfil de un usuario, llame

https://graph.facebook.com/USER_ID/picture

donde USER_IDpuede ser el número de identificación de usuario o el nombre de usuario.

Para obtener una foto de perfil de usuario de un tamaño específico, llame al

https://graph.facebook.com/USER_ID/picture?type=SIZE

donde SIZEdebe ser reemplazado con una de las palabras

square
small
normal
large

Dependiendo del tamaño que quieras.

Esta llamada devolverá una URL a una sola imagen con su tamaño basado en el parámetro de tipo elegido.

Por ejemplo:

https://graph.facebook.com/USER_ID/picture?type=small

devuelve una URL a una versión pequeña de la imagen.

La API solo especifica el tamaño máximo para las imágenes de perfil, no el tamaño real.

Cuadrado:

Ancho máximo y altura de 50 píxeles.

Pequeña

ancho máximo de 50 píxeles y una altura máxima de 150 píxeles.

Normal

ancho máximo de 100 píxeles y una altura máxima de 300 píxeles.

Grande

ancho máximo de 200 píxeles y una altura máxima de 600 píxeles.

Si llama al USER_ID / imagen predeterminado, obtiene el tipo cuadrado.

ACLARACIÓN

Si llama (según el ejemplo anterior)

https://graph.facebook.com/redbull/picture?width=140&height=110

devolverá una respuesta JSON si está utilizando uno de los métodos de solicitud de los SDK de Facebook . De lo contrario, devolverá la imagen en sí. Para recuperar siempre el JSON, agregue:

&redirect=false

al igual que:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
Gunnar Karlsson
fuente
Gran explicación, pero el valor de retorno de la url que proporcionó (' graph.facebook.com/redbull/… ) responde con la url de la imagen en el encabezado de ubicación (' Ubicación: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). no como un JSON como {"datos": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… ", "ancho": 148, "altura" : 117, "is_silhouette": false}}
Gökhan Barış Aker
Todavía recibo la misma respuesta que en mi respuesta. Puede probarlo en los desarrolladores de Graph Explorer en Facebook en developers.facebook.com/tools/explorer. Ingrese 'redbull / picture? Width = 140 & height = 110' y vea la respuesta. Mi respuesta asume que estás llamando a esto usando uno de los métodos de solicitud / API de los SDK de Facebook, que devolverá una respuesta JSON.
Gunnar Karlsson
2
@GunnarKarlsson, falta la &redirect=falsedevolución de los datos JSON en lugar de redirigir a la imagen
andrewtweber
@andrewtweber muchas gracias. He agregado una aclaración a la respuesta.
Gunnar Karlsson
3
Es julio de 2015 y esto ya no funciona. (error: "No se pueden consultar los usuarios por su nombre de usuario")
Flimm
20

Para obtener la URL de la imagen, NO el contenido binario:

$url = "http://graph.facebook.com/$fbId/picture?type=$size";

$headers = get_headers($url, 1);

if( isset($headers['Location']) )
    echo $headers['Location']; // string
else
    echo "ERROR";

Debe usar su ID de FACEBOOK, NO SU NOMBRE DE USUARIO. Puede obtener su identificación de Facebook allí:

http://findmyfbid.com/

NaturalBornCamper
fuente
1
Es julio de 2015 y esto ya no funciona (error: "No se puede consultar a los usuarios por su nombre de usuario")
Flimm
3
Lo entendiste
NaturalBornCamper
1
Lo mejor de aqui. Definitivamente es una locura, traté de obtener datos en el cuerpo y luego los datos aparecen en el encabezado @. @
Davuz
19

Código simple de una línea para guardar una imagen de perfil de tamaño COMPLETO en su servidor.

<?php

copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg");

?>

Esto solo funcionará si openssl está habilitado en php.ini.

Armand
fuente
Es julio de 2015 y esto ya no funciona (error: "No se puede consultar a los usuarios por su nombre de usuario")
Flimm
Sí, las llamadas v1.0 dejarán de funcionar después del 30 de abril de 2015. No puede obtener una identificación específica de la aplicación a menos que el usuario haya autorizado su aplicación
Armand,
10

Agregó esto como un comentario a la respuesta aceptada, pero consideró que merecía una explicación más larga. A partir de abril de 2015, esto probablemente se planteará varias veces.

A partir de V2 de la API gráfica, la respuesta aceptada ya no funciona con un nombre de usuario. Entonces, primero necesita el ID de usuario y ya no puede usar un nombre de usuario para obtenerlo. Para complicar aún más las cosas, por razones de privacidad, Facebook ahora está cambiando los ID de usuario por aplicación (consulte https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ y https: //developers.facebook .com / docs / apps / upgrading / # upgrading_v2_0_user_ids ), por lo que tendrá que tener algún tipo de autenticación adecuada para recuperar un ID de usuario que pueda usar. Técnicamente, la foto de perfil sigue siendo pública y está disponible en / userid / picture (ver documentos en https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture y este usuario de ejemplo: http: //graph.facebook.com/v2.2/4/picture?redirect=0) sin embargo, descubrir el ID de usuario estándar de un usuario parece imposible basado solo en su perfil: su aplicación necesitaría hacer que aprueben la interacción con la aplicación, lo que para mi caso de uso (solo mostrar una foto de perfil al lado de su enlace de perfil FB) es excesivo.

Si alguien ha descubierto una forma de obtener la foto de perfil basada en el nombre de usuario, o, alternativamente, cómo obtener un ID de usuario (incluso uno alternativo) para recuperar una foto de perfil, ¡por favor comparta! Mientras tanto, la antigua url gráfica todavía funciona hasta abril de 2015.

sckd
fuente
9

Una forma es usar el código que Gamlet publicó en su respuesta:

  • Guárdalo como curl.php

  • Luego en su archivo:

    require 'curl.php';
    
    $photo="https://graph.facebook.com/me/picture?access_token=" . $session['access_token'];
    $sample = new sfFacebookPhoto;
    $thephotoURL = $sample->getRealUrl($photo);
    echo $thephotoURL;

Pensé en publicar esto, porque me tomó un poco de tiempo descifrar los detalles ... Aunque las imágenes de perfil son públicas, aún necesitas tener un token de acceso para obtenerlo cuando lo enrollas .

benjaminlotan
fuente
8

Hay forma de hacerlo;)

Gracias a " http://it.toolbox.com/wiki/index.php/Use_curl_from_PHP_-_processing_response_headers ":

<?php

    /**
     * Facebook user photo downloader
     */

    class sfFacebookPhoto {

        private $useragent = 'Loximi sfFacebookPhoto PHP5 (cURL)';
        private $curl = null;
        private $response_meta_info = array();
        private $header = array(
                "Accept-Encoding: gzip,deflate",
                "Accept-Charset: utf-8;q=0.7,*;q=0.7",
                "Connection: close"
            );

        public function __construct() {
            $this->curl = curl_init();
            register_shutdown_function(array($this, 'shutdown'));
        }

        /**
         * Get the real URL for the picture to use after
         */
        public function getRealUrl($photoLink) {
            curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
            curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
            curl_setopt($this->curl, CURLOPT_HEADER, false);
            curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
            curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
            curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($this->curl, CURLOPT_URL, $photoLink);

            //This assumes your code is into a class method, and
            //uses $this->readHeader as the callback function.
            curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, array(&$this, 'readHeader'));
            $response = curl_exec($this->curl);
            if (!curl_errno($this->curl)) {
                $info = curl_getinfo($this->curl);
                var_dump($info);
                if ($info["http_code"] == 302) {
                    $headers = $this->getHeaders();
                    if (isset($headers['fileUrl'])) {
                        return $headers['fileUrl'];
                    }
                }
            }
            return false;
        }


        /**
         * Download Facebook user photo
         *
         */
        public function download($fileName) {
            curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
            curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($this->curl, CURLOPT_HEADER, false);
            curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
            curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
            curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($this->curl, CURLOPT_URL, $fileName);
            $response = curl_exec($this->curl);
            $return = false;
            if (!curl_errno($this->curl)) {
                $parts = explode('.', $fileName);
                $ext = array_pop($parts);
                $return = sfConfig::get('sf_upload_dir') . '/tmp/' . uniqid('fbphoto') . '.' . $ext;
                file_put_contents($return, $response);
            }
            return $return;
        }

        /**
         * cURL callback function for reading and processing headers.
         * Override this for your needs.
         *
         * @param object $ch
         * @param string $header
         * @return integer
         */
        private function readHeader($ch, $header) {

            //Extracting example data: filename from header field Content-Disposition
            $filename = $this->extractCustomHeader('Location: ', '\n', $header);
            if ($filename) {
                $this->response_meta_info['fileUrl'] = trim($filename);
            }
            return strlen($header);
        }

        private function extractCustomHeader($start, $end, $header) {
            $pattern = '/'. $start .'(.*?)'. $end .'/';
            if (preg_match($pattern, $header, $result)) {
                return $result[1];
            }
            else {
                return false;
            }
        }

        public function getHeaders() {
            return $this->response_meta_info;
        }

        /**
         * Cleanup resources
         */
        public function shutdown() {
            if($this->curl) {
                curl_close($this->curl);
            }
        }
    }
Aldea
fuente
8

Solución PHP funcional (HTTP GET) de abril de 2015 (sin PHP 5 SDK):

function get_facebook_user_avatar($fbId){
        $json = file_get_contents('https://graph.facebook.com/v2.5/'.$fbId.'/picture?type=large&redirect=false');
        $picture = json_decode($json, true);
        return $picture['data']['url'];
}

Puede cambiar 'type' en parametr:

Cuadrado:

Ancho máximo y altura de 50 píxeles.

Pequeña

ancho máximo de 50 píxeles y una altura máxima de 150 píxeles.

Normal

ancho máximo de 100 píxeles y una altura máxima de 300 píxeles.

Grande

ancho máximo de 200 píxeles y una altura máxima de 600 píxeles.

Xawier
fuente
7

Estaba pensando: tal vez la identificación será una herramienta útil. Cada vez que un usuario crea una nueva cuenta, debe obtener una ID más alta. Busqué en Google y descubrí que hay un método para estimar la fecha de creación de la cuenta por ID y Massoud Seifi de metadatascience.com reunió algunos datos buenos al respecto.

Ingrese la descripción de la imagen aquí

Lee este artículo:

http://metadatascience.com/2013/03/11/inferring-facebook-account-creation-date-from-facebook-user-id/

Y aquí hay algunas ID para descargar:

http://metadatascience.com/2013/03/14/lookup-table-for-inferring-facebook-account-creation-date-from-facebook-user-id/

Erroid
fuente
1
¿Cómo responde esto a la pregunta?
Flimm
4

¿Le preocupa el tamaño de la imagen de perfil? al momento de implementar el inicio de sesión con Facebook usando PHP. Le mostraremos la manera simple de obtener una imagen de perfil de gran tamaño en Facebook PHP SDK. Además, puede obtener la imagen de tamaño personalizado del perfil de Facebook.

Establezca la dimensión de la imagen de perfil utilizando la siguiente línea de código.

$ userProfile = $ facebook-> api ('/ me? fields = picture.width (400) .height (400)');

revise esta publicación: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

Sagar Jethi
fuente
3

@NaturalBornCamper,

Buen código! ¡Aquí hay una función de código limpio para tal proceso!

function get_raw_facebook_avatar_url($uid)
{
    $array = get_headers('https://graph.facebook.com/'.$uid.'/picture?type=large', 1);
    return (isset($array['Location']) ? $array['Location'] : FALSE);
}

Esto devolverá la URL sin procesar de la imagen del avatar de Facebook. ¡Siéntete libre de hacer lo que quieras con él!

tfont
fuente