API Graph do Facebook, como obter e-mail dos usuários?

86

Estou usando a API Graph, mas não consigo descobrir como obter o endereço de e-mail de um usuário conectado.

A introdução do Graph afirma "A API Graph pode fornecer acesso a todos os dados básicos de registro da conta que você normalmente solicitaria em um formulário de inscrição para o seu site, incluindo nome, endereço de e-mail, foto do perfil e aniversário"

Tudo bem, mas como faço para acessar essas informações?

Isso é o que eu tenho até agora:

$json = $facebook->api('/me');

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
Kylex
fonte
3
o que sai var_dump($obj);?
Jayrox

Respostas:

76

A única maneira de obter o endereço de e-mail dos usuários é solicitar permissões estendidas no campo de e-mail. O usuário deve permitir que você veja isso e você não pode obter os endereços de e-mail dos amigos do usuário.

http://developers.facebook.com/docs/authentication/permissions

Você pode fazer isso se estiver usando o Facebook Connect passando scope = email no get string de sua chamada para a caixa de diálogo Auth.

Eu recomendo usar um SDK em vez de file_get_contents, pois torna muito mais fácil realizar a autenticação Oauth .

Gazler
fonte
Ok, mudou file_get_contents. Mas estou um pouco confuso sobre para onde passaria o req_perms = email.
kylex
10
Deixa pra lá, eu descobri: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex
14
Não era completamente óbvio para mim com base nesta resposta ... se você está usando a API JavaScript, você deseja usarFB.api('/me?scope=email', function(apiResponse) { ... });
Olson.dev
58
// Facebook SDK v5 for PHP
// https://developers.facebook.com/docs/php/gettingstarted/5.0.0

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.4',
]);

$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
$response = $fb->get('/me?locale=en_US&fields=name,email');
$userNode = $response->getGraphUser();
var_dump(
    $userNode->getField('email'), $userNode['email']
);
masakielástico
fonte
2
Existe em algum lugar uma página de referência que descreve a /merota?
Continuo
3
/ me? locale = en_US & fields = name, e-mail foi a única maneira que consegui descobrir para que ele retornasse o endereço de e-mail, não consegui encontrar nenhuma outra referência on
Ashley
aqui estão os documentos - developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku
1
Esta é a resposta correta, embora uma explicação mais simples possa ser encontrada aqui: stackoverflow.com/questions/37349618/…
HoldOffHunger
obrigado por isso .. nada mais funcionou, exceto isso. agora está funcionando bem! :)
supersan
19

Abra base_facebook.php Adicionar Access_token na função getLoginUrl()

array_merge(array(
                  'access_token' => $this->getAccessToken(),
                  'client_id' => $this->getAppId(),
                  'redirect_uri' => $currentUrl, // possibly overwritten
                  'state' => $this->state),
             $params);

e escopo de uso para permissão de e-mail

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Kaletha
fonte
6

Para obter o e-mail do usuário, você deve fazer o login do usuário com sua conta do Facebook usando a emailpermissão. Use para isso o Facebook PHP SDK ( veja no github ) como segue.

Primeiro verifique se o usuário já está logado:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();
if ($user) {
    try {
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        $user = null;
    }
}

Se ele não for, você pode exibir o link de login solicitando a emailpermissão:

if (!$user) {
    $args = array('scope' => 'email');
    echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
    echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}

Quando ele está logado o email pode ser encontrado no $user_profilearray.

Espero que ajude !

Quentin
fonte
6

Basta adicionar esses blocos de código no retorno do status e começar a passar um objeto de string de consulta {}. Para desenvolvedores JavaScript

Depois de inicializar o seu SDK.

passo 1: // obter status de login

$(document).ready(function($) {
    FB.getLoginStatus(function(response) {
        statusChangeCallback(response);
        console.log(response);
    });
  });

Isso verificará o carregamento do documento e obterá sua verificação de status de login se os usuários estiveram logados.

Em seguida, a função checkLoginState é chamada e a resposta é passada para statusChangeCallback

function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

Etapa 2: permite que você obtenha os dados de resposta do status

function statusChangeCallback(response) {
    // body...
    if(response.status === 'connected'){
      // setElements(true);
      let userId = response.authResponse.userID;
      // console.log(userId);
      console.log('login');
      getUserInfo(userId);

    }else{
      // setElements(false);
      console.log('not logged in !');
    }
  }

Ele também possui o ID do usuário que está sendo definido como variável, então uma função getUserInfo é chamada para buscar informações do usuário usando a API Graph.

function getUserInfo(userId) {
    // body...
    FB.api(
      '/'+userId+'/?fields=id,name,email',
      'GET',
      {},
      function(response) {
        // Insert your code here
        // console.log(response);
        let email = response.email;
        loginViaEmail(email);
      }
    );
  }

Depois de passar o ID do usuário como um argumento, a função busca todas as informações relacionadas a esse ID do usuário . Obs: no meu caso estava procurando o e-mail, pois me permitiu executar uma função que pode logar o usuário somente por e-mail.

// login via email

function loginViaEmail(email) {
    // body...
    let token = '{{ csrf_token() }}';

    let data = {
      _token:token,
      email:email
    }

    $.ajax({
      url: '/login/via/email',    
      type: 'POST',
      dataType: 'json',
      data: data,
      success: function(data){
        console.log(data);
        if(data.status == 'success'){
          window.location.href = '/dashboard';
        }

        if(data.status == 'info'){
          window.location.href = '/create-account'; 
        }
      },
      error: function(data){
        console.log('Error logging in via email !');
        // alert('Fail to send login request !');
      }
    });
  }
Delino
fonte
Olá @Pang, você pode verificar agora, acho que isso pode ajudar. mas melhor ainda, você ainda pode comentar mais questões.
Delino
+ status de herói, apenas para '/' + userId + '/ campos = id, nome, e-mail?', que não é especificado na documentação
therightstuff
5

Você pode recuperar o endereço de e-mail do perfil do usuário conectado. Aqui está o snippet de código

<?php

    $facebook = new Facebook(array(
      'appId'  => $initMe["appId"],
      'secret' => $initMe["appSecret"],
    ));

    $facebook->setAccessToken($initMe["accessToken"]);
    $user = $facebook->getUser();

    if ($user) {
        $user_profile = $facebook->api('/me');
        print_r($user_profile["email"]);
    }
?>
Yash Kumar
fonte
4
Isso não está funcionando para mim. $user_profilenão contém e
zed Blackbeard
3

Supondo que você solicitou permissões de e-mail quando o usuário fez login em seu aplicativo e você tem um token válido,

Com a API de busca, você pode apenas

const token = "some_valid_token";
const response = await fetch(
        `https://graph.facebook.com/me?fields=email&access_token=${token}`
      );
const result = await response.json();

o resultado será:

{
    "id": "some_id",
    "email": "[email protected]"
}

id será retornado de qualquer maneira.

Você pode adicionar ao parâmetro de consulta de campos mais coisas, mas você precisa de permissões para eles se eles não estiverem no perfil público (o nome é público).

?fields=name,email,user_birthday&token=

https://developers.facebook.com/docs/facebook-login/permissions

Gabriel P.
fonte
Adoro uma resposta que não pressupõe o uso de um SDK desnecessário.
Lilleman
1

https://graph.facebook.com/me

fornecerá informações sobre o usuário conectado no momento, mas você precisará fornecer um token oauth. Vejo:

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

Bobby Jack
fonte
13
você não pode obtê-lo sem permissão estendida.
cinza de
ou sem especificar o parâmetro fields '/ me /? fields = id, nome, e-mail' que não está especificado na documentação
theightstuff
1

O e-mail no perfil pode ser obtido usando permissão estendida, mas acho que não é possível obter o e-mail usado para fazer login no fb. No meu aplicativo, eu queria exibir várias contas do fb de um usuário em uma lista, queria mostrar os e-mails de login das contas do fb como um identificador único das respectivas contas, mas não consegui retirá-lo do fb, tudo o que consegui foi o e-mail principal no perfil do usuário, mas no meu caso meu e-mail de login e meu e-mail principal são diferentes.

Karthik Sekar
fonte
0

Certifique-se de que seu aplicativo do Facebook seja publicado. Para receber dados por e-mail, public_profile e user_friends, seu aplicativo deve ser disponibilizado ao público.

Você pode desativá-lo mais tarde para fins de desenvolvimento e ainda obter o campo de e-mail.

Didzis
fonte
0

Certifique-se de especificar totalmente o número da versão da API como algo semelhante "v2.11"e não"2.11"

Não tenho certeza de qual é o padrão se estiver incorreto, mas recebi alguns erros estranhos ao tentar recuperar o e-mail quando perdi o v.

Simon_Weaver
fonte
0

Para mim, o problema com a coleta de endereços de e-mail do usuário no lado do PHP (método getGraphUser ()) era que o comportamento padrão do botão renderizado no Facebook (no lado do WEBSIDE, criado com xfbml = 1) é chamar implicitamente FB.login () com o escopo NÃO inclui "e-mail".

Isso significa que você DEVE:

1) ligar

FB.login (...., {escopo: email})

manifestamente, criando seu próprio botão para iniciar o processo de login

OU

2) adicione o atributo scope = "email" ao botão xfbml

<div class = "fb-login-button" data-size = "large" data-button-type = "continue_with" data-
layout = "arredondado" data-auto-logout-link = "false" data-use-continue-as = "true" data-
width = "1000px" scope = "email"> </div>

para ser capaz de coletar endereços de e-mail no lado do PHP.

Espero que ajude.

Marek Wysmułek
fonte
0

Primeiro, ative seu aplicativo no centro de desenvolvedores do Facebook . Aplicativos em modo de desenvolvimento não têm permissão para recuperar o campo de e-mail.

Se o usuário não estiver logado, você precisa fazer o login e especificar que seu aplicativo / site precisará do campo de e-mail.

FB.login(
    function(response) {
         console.log('Welcome!');
    },
    {scope: 'email'}
);

Então, após o login, ou se o usuário já estiver logado, recupere o e-mail utilizando a API do Facebook, especificando o campo email:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Derzu
fonte