Facebook Graph API, как получить электронную почту пользователей?

86

Я использую Graph API, но не могу понять, как получить адрес электронной почты вошедшего в систему пользователя.

Во введении к Graph говорится: «API Graph может предоставить доступ ко всем основным данным регистрации учетной записи, которые вы обычно запрашиваете в форме регистрации для своего сайта, включая имя, адрес электронной почты, изображение профиля и дату рождения».

Все хорошо, но как мне получить доступ к этой информации?

Вот что у меня есть на данный момент:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
килекс
источник
3
что var_dump($obj);выводит?
Jayrox

Ответы:

76

Единственный способ получить адрес электронной почты пользователя - запросить расширенные разрешения для поля электронной почты. Пользователь должен разрешить вам это видеть, и вы не сможете получить адреса электронной почты друзей пользователя.

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

Вы можете сделать это, если используете подключение к Facebook, передав scope = email в строке получения вашего вызова диалоговому окну Auth.

Я бы рекомендовал использовать SDK вместо file_get_contents, так как это значительно упрощает проверку подлинности Oauth .

Газлер
источник
Хорошо, изменил file_get_contents. Но я немного запутался в том, где я могу передать электронное письмо req_perms =.
kylex
10
Неважно, я понял это: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex
14
Для меня это было не совсем очевидно на основе этого ответа ... если вы используете JavaScript API, вы хотите его использоватьFB.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']
);
масакэластичный
источник
2
Есть ли где-нибудь справочная страница с описанием /meмаршрута? Я продолжаю просматривать страницы Graph API и нигде не могу его найти :(
Radu Murzea
3
/ me? locale = en_US & fields = name, электронная почта была единственным способом, которым я мог вычислить, чтобы заставить его вернуть адрес электронной почты, не смог найти никакой другой ссылки на это в Интернете
Эшли
вот документы - developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku
1
Это правильный ответ, хотя здесь можно найти более простое объяснение: stackoverflow.com/questions/37349618/…
HoldOffHunger
спасибо за это .. кроме этого ничего не работало. теперь все работает нормально! :)
supersan
19

Откройте base_facebook.php Добавьте Access_token в функцию getLoginUrl()

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

и используйте область для разрешения электронной почты

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Калетха
источник
6

Чтобы получить электронную почту пользователя, вы должны войти в систему с его учетной записью Facebook, используя emailразрешение. Используйте для этого Facebook PHP SDK ( см. На github ) следующим образом.

Сначала проверьте, вошел ли пользователь в систему:

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

Если это не так, вы можете отобразить ссылку для входа с запросом emailразрешения:

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

Когда он вошел в систему, электронную почту можно найти в $user_profileмассиве.

Надеюсь, это поможет !

Квентин
источник
6

Просто добавьте этот блок кода при возврате статуса и начните передавать объект строки запроса {}. Для разработчиков JavaScript

После инициализации вашего sdk.

шаг 1: // получить статус входа

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

Это будет проверять загрузку документа и проверять ваш статус входа в систему, если пользователи вошли в систему.

Затем вызывается функция checkLoginState , и ответ передается в statusChangeCallback.

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

Шаг 2. Позвольте вам получить данные ответа из статуса

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

У этого также есть идентификатор пользователя, который устанавливается как переменная, затем вызывается функция getUserInfo для получения информации о пользователе с помощью Graph-api.

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

После передачи идентификатора пользователя в качестве аргумента функция извлекает всю информацию, относящуюся к этому идентификатору пользователя . Примечание: в моем случае я искал электронную почту, чтобы разрешить мне запустить функцию, которая может войти в систему только по электронной почте.

// войти по электронной почте

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 !');
      }
    });
  }
Делино
источник
Привет @Pang, ты можешь проверить сейчас, я думаю, это может помочь. но лучше еще вы можете прокомментировать больше вопросов.
Delino
+ статус героя, только для '/' + userId + '/? fields = id, name, email', который не указан в документации
therightstuff
5

Вы можете получить адрес электронной почты из профиля вошедшего в систему пользователя. Вот фрагмент кода

<?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"]);
    }
?>
Яш Кумар
источник
4
У меня это не работает. $user_profileне содержит
адреса
3

Предполагая, что вы запросили разрешения электронной почты, когда пользователь вошел в систему из вашего приложения, и у вас есть действующий токен,

С помощью fetch api вы можете просто

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

результат будет:

{
    "id": "some_id",
    "email": "name@example.org"
}

id все равно будет возвращен.

Вы можете добавить к параметрам запроса полей больше информации, но вам нужны разрешения для них, если они не находятся в общедоступном профиле (имя публично).

?fields=name,email,user_birthday&token=

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

Габриэль П.
источник
Люблю ответ, который не предполагает использования SDK, который не нужен.
Лиллеман
1

https://graph.facebook.com/me

предоставит вам информацию о текущем вошедшем в систему пользователе, но вам нужно будет предоставить токен oauth. Увидеть:

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

Бобби Джек
источник
13
вы не можете получить его без расширенного разрешения.
Grayger 01
или без указания параметра полей '/ me /? fields = id, name, email', который не указан в документации
therightstuff
1

Электронный адрес в профиле можно получить с использованием расширенного разрешения, но я думаю, что невозможно получить адрес электронной почты, используемый для входа в fb. В моем приложении я хотел отобразить несколько учетных записей fb пользователя в списке, я хотел показать электронные письма для входа в учетные записи fb как уникальный идентификатор соответствующих учетных записей, но я не мог получить его из fb, все, что у меня было, было основной адрес электронной почты в профиле пользователя, но в моем случае мой адрес электронной почты для входа и мой основной адрес электронной почты отличаются.

Картик Секар
источник
0

Убедитесь, что ваше приложение Facebook опубликовано. Чтобы получать данные для электронной почты, public_profile и user_friends, ваше приложение должно быть общедоступным.

Вы можете отключить его позже для целей разработки и по-прежнему получать поле электронной почты.

Дидзис
источник
0

Следующие инструменты могут быть полезны во время разработки:

Отладчик токена доступа: вставьте токен доступа для получения подробной информации

https://developers.facebook.com/tools/debug/accesstoken/

Graph API Explorer: тестовые запросы к графу api после вставки вашего токена доступа

https://developers.facebook.com/tools/explorer

Simon_Weaver
источник
0

Не забудьте полностью указать номер версии API как что-то вроде, "v2.11"а не"2.11"

Я не уверен, что используется по умолчанию, если это неверно, но у меня возникли странные ошибки, пытаясь просто получить электронное письмо, когда я пропустил v.

Simon_Weaver
источник
0

Для меня проблема со сбором адресов электронной почты пользователя на стороне PHP (метод getGraphUser ()) заключалась в том, что поведение кнопки, отображаемой на facebook (на стороне WEBSIDE, созданной с помощью xfbml = 1) по умолчанию, заключается в неявном вызове FB.login () с объем НЕ включает "электронную почту".

Это означает, что вы ДОЛЖНЫ:

1) call

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

очевидно, создание собственной кнопки для запуска процесса входа в систему

ИЛИ

2) добавьте атрибут scope = "email" к кнопке xfbml

<div class = "fb-login-button" data-size = "large" data-button-type = "continue_with" data-
layout = "округленный" data-auto-logout-link = "false" data-use-continue-as = "true" data-
width = "1000px" scope = "email"> </div>

чтобы иметь возможность собирать адреса электронной почты на стороне PHP.

Надеюсь, это поможет.

Марек Высьмулек
источник
0

Сначала активируйте свое приложение в Центре разработчиков Facebook . Приложения в режиме разработки не могут получать поле электронной почты.

Если пользователь не вошел в систему, вам необходимо войти в систему и указать, что вашему приложению / сайту потребуется поле электронной почты.

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

Затем, после входа в систему или если пользователь уже вошел в систему, получите электронное письмо с помощью API Facebook, указав поле электронной почты:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Дерзу
источник