API do Facebook - Como obtenho uma imagem de perfil de usuário do Facebook por meio da API do Facebook (sem exigir que o usuário “permita” o aplicativo)


257

Estou trabalhando em um CMS que busca a imagem do perfil de um usuário no URL do Facebook (isto é, http://facebook.com/users_unique_url ). Como posso fazer isso? Existe uma chamada à API do Faceboook que busca o URL da imagem do perfil do usuário sem que o usuário precise Permitir o aplicativo?

Respostas:


409

Basta buscar os dados através deste URL :

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

Substitua userid_herepelo ID do usuário do qual você deseja obter a foto. Você também pode usar HTTPS também.

Você pode usar a file_get_contentsfunção do PHP para ler esse URL e processar os dados recuperados.

Recurso:

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

Nota: Em php.ini, você precisa ter certeza de que a extensão OpenSSL está ativada para usar a file_get_contentsfunção do PHP para ler essa URL.


73
Olhando mais a página, outra coisa útil pode ser a ?type=largestring de consulta que você pode adicionar. Props por ter uma resposta totalmente muito melhor do que a tela que eu estava digitando, BTW :).
Domenic

6
Use <img src="//graph.facebook.com/sarfraz.anees/picture" />se você mudar entre HTTP e HTTPS ... o protocolo é detectado pelo navegador e você não receberá avisos de conteúdo misto no HTTPS.
Chris Jacob

39
Deve-se enfatizar que alguns usuários NÃO têm um nome de usuário definido para sua conta do FB. Quando esse for o caso, e você estiver tentando implementar esta resposta, você receberá a imagem de perfil padrão do FB, o ponto de interrogação. Para evitar esse problema com facilidade, use o ID do FB do usuário.
21712 Josh

7
Note-se que na V2 da API do gráfico isso não funciona mais usando um nome de usuário. Portanto, agora você precisa primeiro do ID do usuário e não pode mais usar um nome de usuário para obtê-lo. O ID do usuário também muda por aplicativo, portanto, você precisará ter algum tipo de autenticação adequada para recuperar um ID do usuário que possa usar. Tecnicamente, a foto do perfil ainda é pública e está disponível em graph.facebook.com/v2.2/4/picture?redirect=0, no entanto, descobrir o ID do usuário (4 no link anterior) parece impossível com base apenas no perfil do usuário. O URL antigo do gráfico ainda funciona até abril de 2015.
sckd 10/11/14

36
É 2015 e eu estou começando (# 803) Não é possível usuários de consulta por seu nome de usuário (sarfraz.anees)
Santosh Kumar

268

Mostrar:

50x50 pixels

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

Largura de 200 pixels

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

Para salvar (usando PHP)

NOTA: Não use isso . Veja o comentário da @ Foreever abaixo.

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

Onde $ fid é seu ID de usuário no Facebook.

NOTA: No caso de imagens marcadas como "18+", você precisará de um access_token válido de um usuário com mais de 18 anos:

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

ATUALIZAÇÃO 2015:

A API do Graph v2.0 não pode ser consultada usando nomes de usuário, você deveuserId sempre usar .


6
Veja mais informações sobre o parâmetro type: "Você pode especificar o tamanho da imagem que deseja com o argumento type, que deve ser quadrado (50x50), pequeno (50 pixels de largura, altura variável), normal (100 pixels de largura, altura variável) ) e grandes (cerca de 200 pixels de largura, altura variável) "Via API do gráfico no Facebook

3
Para usar esse método, você deve ativar o allow_url_fopen. A diretiva allow_url_fopen está desativada por padrão. Você deve estar ciente das implicações de segurança ao ativar a diretiva allow_url_fopen. Os scripts PHP que podem acessar arquivos remotos são potencialmente vulneráveis ​​à injeção arbitrária de código. Quando a diretiva allow_url_fopen está ativada, você pode gravar scripts que abrem arquivos remotos como se fossem arquivos locais.
Foreever 12/08/14

Parece útil, por isso aplaude com antecedência, mas sendo um nível novo demais para entender, eu gostaria de saber em qual linguagem de programação ela está. Meu palpite é PHP.
Hello_there_andy

@hello_there_andy Yep! É PHP (na verdade, a questão é marcado como PHP e foi a única linguagem que eu uso há 4 anos)
Neiker

7
Em julho de 2015 esta obra não (erro: "Não é possível consulta usuários por seu nome de usuário")
Flimm

164

ATUALIZAÇÃO :

A partir de agosto de 2012, a API foi atualizada para permitir que você recupere imagens de perfil do usuário em tamanhos variados. Adicione os campos opcionais de largura e altura como parâmetros de URL:

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

onde WIDTHe HEIGHTseus valores de dimensão solicitados.

Isso retornará uma foto de perfil com um tamanho mínimo de WIDTHx HEIGHTao tentar preservar a proporção. Por exemplo,

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

retorna

    {
      "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
      }
   }

FIM DE ATUALIZAÇÃO

Para obter a foto do perfil de um usuário, ligue para

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

onde USER_IDpode ser o número de identificação do usuário ou o nome do usuário.

Para obter uma imagem de perfil de usuário de um tamanho específico, ligue para

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

onde SIZEdeve ser substituído por uma das palavras

square
small
normal
large

dependendo do tamanho desejado.

Essa chamada retornará um URL para uma única imagem com seu tamanho com base no parâmetro de tipo escolhido.

Por exemplo:

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

retorna um URL para uma versão pequena da imagem.

A API especifica apenas o tamanho máximo para imagens de perfil, não o tamanho real.

Quadrado:

largura e altura máximas de 50 pixels.

Pequeno

largura máxima de 50 pixels e altura máxima de 150 pixels.

Normal

largura máxima de 100 pixels e altura máxima de 300 pixels.

ampla

largura máxima de 200 pixels e altura máxima de 600 pixels.

Se você chamar o USER_ID / imagem padrão, obterá o tipo quadrado.

ESCLARECIMENTO

Se você ligar (como no exemplo acima)

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

ele retornará uma resposta JSON se você estiver usando um dos métodos de solicitação do SDK do Facebook . Caso contrário, ele retornará a própria imagem. Para recuperar sempre o JSON, adicione:

&redirect=false

igual a:

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

Ótima explicação, mas o valor de retorno do URL que você forneceu (' graph.facebook.com/redbull/… ) responde com o URL da imagem no cabeçalho do local (' Location: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). não como um JSON como {"data": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… ", "width": 148, "height" : 117, "is_silhouette": false}}
Gökhan Barış Aker

Ainda recebo a mesma resposta que na minha resposta. Você pode experimentá-lo no Graph Explorer, no Facebook Developers, em developers.facebook.com/tools/explorer. Digite 'redbull / picture? Width = 140 & height = 110' e veja a resposta. Minha resposta supõe que você esteja chamando isso usando um dos métodos de API / solicitação do SDK do Facebook, que retornará uma resposta JSON.
Gunnar Karlsson

2
@GunnarKarlsson você está faltando o &redirect=falsepara retornar os dados JSON em vez de redirecionamento para a imagem
andrewtweber

@andrewtweber muito obrigado. Eu adicionei um esclarecimento à resposta.
Gunnar Karlsson

3
É julho de 2015 e isso não funciona mais. (erro: "Não é possível usuários de consulta por seu nome de usuário")
Flimm

20

Para obter o URL da imagem, NÃO o conteúdo binário:

$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";

Você deve usar seu ID do FACEBOOK, NÃO O NOME DO USUÁRIO. Você pode obter o seu ID do Facebook lá:

http://findmyfbid.com/


1
É julho 2015 e este obras não (erro: "Não é possível consulta usuários por seu nome de usuário")
Flimm

3
Você entendeu tudo errado amigo :) É o seu ID facebook, não nome de usuário findmyfbid.com
NaturalBornCamper

1
O melhor daqui. É uma loucura, definitivamente, eu tentei obter dados em corpo e, em seguida, os dados aparecem no cabeçalho @ @.
Davuz

19

Código de uma linha simples para salvar uma imagem de perfil de tamanho COMPLETO no seu servidor.

<?php

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

?>

Isso só funcionará se o openssl estiver ativado no php.ini.


É julho 2015 e este obras não (erro: "Não é possível consulta usuários por seu nome de usuário")
Flimm

Sim, as chamadas v1.0 irá parar de funcionar após 30 de abril de 2015. Você não pode ficar aplicação específica ID menos que o usuário tenha autorizado a sua aplicação
Armand

10

Adicionamos isso como um comentário à resposta aceita, mas consideramos que merecia uma explicação mais longa. A partir de abril de 2015, isso provavelmente será aumentado algumas vezes.

A partir da V2 da API do gráfico, a resposta aceita não funciona mais usando um nome de usuário. Portanto, agora você precisa primeiro do ID do usuário e não pode mais usar um nome de usuário para obtê-lo. Para complicar ainda mais, por motivos de privacidade, o Facebook agora está alterando os IDs de usuário por aplicativo (consulte https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ e https: //developers.facebook .com / docs / apps / upgrade / # upgradeing_v2_0_user_ids ), portanto, você precisará ter algum tipo de autenticação adequada para recuperar um ID do usuário que possa usar. Tecnicamente, a foto do perfil ainda é pública e está disponível em / userid / picture (consulte os documentos em https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture e este exemplo de usuário: http: //graph.facebook.com/v2.2/4/picture?redirect=0), no entanto, descobrir o ID do usuário padrão de um usuário parece impossível com base apenas no perfil. Seu aplicativo precisaria aprová-lo para interagir com o aplicativo, o que para o meu caso de uso (apenas mostrar uma foto do perfil ao lado do link do perfil do FB) é um exagero.

Se alguém descobriu uma maneira de obter a foto do perfil com base no nome de usuário ou, alternativamente, como obter uma identificação do usuário (mesmo uma alternativa) para recuperar uma foto do perfil, compartilhe! Enquanto isso, o URL antigo do gráfico ainda funciona até abril de 2015.


9

Uma maneira é usar o código Gamlet postado em sua resposta:

  • Salve como curl.php

  • Então no seu arquivo:

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

Eu pensei em publicar isso, porque levei um pouco de tempo para descobrir os detalhes ... Mesmo que as fotos de perfil sejam públicas, você ainda precisa ter um token de acesso para obtê-lo quando você o enrola .


8

Existe maneira de fazer isso;)

Obrigado 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

Solução de trabalho PHP (HTTP GET) de abril de 2015 (sem 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'];
}

Você pode alterar 'type' no parâmetro:

Quadrado:

largura e altura máximas de 50 pixels.

Pequeno

largura máxima de 50 pixels e altura máxima de 150 pixels.

Normal

largura máxima de 100 pixels e altura máxima de 300 pixels.

ampla

largura máxima de 200 pixels e altura máxima de 600 pixels.


7

Eu estava pensando - talvez o ID seja uma ferramenta útil. Toda vez que um usuário cria uma nova conta, ele deve obter um ID maior. Pesquisei no Google e descobri que existe um método para estimar a data de criação da conta por ID e Massoud Seifi, do metadatascience.com, reuniu alguns bons dados sobre isso.

Digite a descrição da imagem aqui

Leia este artigo:

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

E aqui estão alguns IDs para download:

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


1
Como isso responde à pergunta?
Flimm


4

Você está preocupado com o tamanho da foto do perfil? no momento da implementação do login com o Facebook usando PHP. Mostraremos a maneira simples de obter uma imagem de perfil de tamanho grande no Facebook PHP SDK. Além disso, você pode obter a imagem em tamanho personalizado do perfil do Facebook.

Defina a dimensão da imagem do perfil usando a seguinte linha de código.

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

verifique esta publicação: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/


3

@NaturalBornCamper,

Código legal! Aqui está uma função de código simples para esse processo!

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

Isso retornará o URL da imagem do avatar bruto do Facebook. Sinta-se livre para fazer o que quiser com ele!


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.