php qué - 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)




digital para (13)

Estoy trabajando en un CMS que obtiene la imagen de perfil de un usuario de su URL Facebook (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 tenga que permitir la aplicación?


Answers

ACTUALIZACIÓ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 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 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á una 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.

ACLARACIÓN

Si llama (como por 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 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

Para obtener la URL de la imagen, NO 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/


Simplemente obtenga los datos a través de esta 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ón file_get_contents de PHP para leer esa URL.


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 del gráfico api, 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 usuario de ejemplo: 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á que aprueben 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 excesivo.

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.


Solución de trabajo de 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.


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 se habilitará en php.ini.


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

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 lo curl .


¿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 el SDK de PHP de Facebook. 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/


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



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, debe usar userId siempre.


Si quieres deshacerte de las "barras negras" y hacerlo como lo hace YouTube, puedes usar:

https://i.ytimg.com/vi_webp/<video id>/mqdefault.webp

Y si no puedes usar la extensión .webp , puedes hacerlo así:

https://i.ytimg.com/vi/<video id>/mqdefault.jpg

Además, si necesita la versión sin maxresdefault use maxresdefault lugar de mqdefault .

Nota: no estoy seguro de la relación de aspecto si planea usar maxresdefault .







php facebook