it-swarm-es.tech

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)

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

254
John Himmelman

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

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

Reemplace userid_here con la identificación del usuario del que desea obtener la foto. También puede utilizar HTTPS también.

Puede usar la función file_get_contents 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 funciónfile_get_contents de PHP para leer esa URL.

408
Sarfraz

Mostrar:

50x50 pixeles

<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 . Ver 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 access_token válido de un usuario 18+:

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

ACTUALIZACIÓN 2015:

Graph API v2.0 no se puede consultar utilizando nombres de usuario, usted debería usar userId siempre.

265
neiker

ACTUALIZACI&OACUTE;N:

A partir de agosto de 2012, la API se ha actualizado 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 WIDTH y HEIGHT son sus valores de dimensión solicitados.

Esto devolverá una imagen de perfil con un tamaño mínimo de WIDTH x HEIGHT al intentar conservar 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 imagen de perfil de un usuario, llame al

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

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

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

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

donde SIZE debe ser reemplazado por una de las palabras

square
small
normal
large

dependiendo del tamaño que quieras.

Esta llamada devolverá un URL a una sola imagen con su tamaño según 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:

anchura máxima 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 valor predeterminado USER_ID/picture, obtendrá el tipo cuadrado.

CLARIFICACI&OACUTE;N

Si llama (como en el ejemplo anterior)

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

devolverá un JSON response si está utilizando uno de los métodos de solicitud de 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
163
Gunnar Karlsson

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 utilizar su ID de FACEBOOK, NO NOMBRE DE USUARIO. Puede obtener su ID de facebook allí:

http://findmyfbid.com/

20
NaturalBornCamper

Código de una línea simple para guardar la 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.

19
Armand

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

A partir de V2 de la api del gráfico, 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 obtener esto. Para complicar aún más las cosas, por razones de privacidad, Facebook ahora está cambiando el 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 imagen del perfil sigue siendo pública y está disponible en/userid/picture (consulte los documentos en https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture y este ejemplo usuario: http://graph.facebook.com/v2.2/4/picture?redirect=0 ) sin embargo, descubrir el ID de usuario estándar de un usuario parece imposible solo por su perfil: su aplicación necesitaría obtenerlo aprobar la interacción con la aplicación que para mi caso de uso (solo mostrar una foto de perfil junto a su enlace de perfil de FB) es una exageración.

Si alguien ha descubierto una manera 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 usar para recuperar una foto de perfil, ¡por favor, comparta! Mientras tanto, la antigua url del gráfico sigue funcionando hasta abril de 2015.

10
sckd

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

  • Guárdalo como curl.php

  • Luego en tu 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é que publicaría esto, porque me tomó un poco de tiempo averiguar los detalles ... Aunque las imágenes de perfil son públicas, aún necesitas tener un token de acceso para obtenerlo cuando curl it.

9
benjaminlotan

Solución de trabajo PHP (HTTP GET) desde 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'];
}

Puedes cambiar 'tipo' en parametr:

Cuadrado:

anchura máxima 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.

8
Xawier

Hay manera de hacer eso;)

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);
            }
        }
    }
8
Gamlet

Estaba pensando - quizásIDserá 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 existe un método para estimar la fecha de creación de la cuenta por ID y Massoud Seifi de metadatascience.com recopiló algunos buenos datos al respecto.

Enter image description here

Lee este artículo:

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

Y aquí hay algunas identificaciones para descargar:

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

7
Erroid

La publicación del blog Toma la imagen de un objeto de gráfico de Facebook podría ofrecer otra forma de solución. Use el código en el tutorial junto con la Graph API de Facebook y su PHP biblioteca de SDK.

... Y trate de no usar file_get_contents (a ​​menos que esté listo para enfrentar las consecuencias - vea file_get_contents vs curl ).

6
moostring

¿Está preocupado por el tamaño de la imagen del perfil? a la hora de implementar login con Facebook usando PHP. Le mostraremos la forma sencilla 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)');

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

4
sagar jethi

@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á el raw URL de imagen de avatar de Facebook. ¡Siéntete libre de hacer lo que quieras con él entonces!

3
tfont
URI  = https://graph.facebook.com/{}/picture?width=500'.format(uid)

Puede obtener el URI de perfil a través de la herramienta de búsqueda de identificación de Facebook en línea

También puede pasar tipo param con valores posibles pequeño, normal, grande, cuadrado.

Consulte la documentación oficial

3
user2119554