Подтвердить что ты не робот

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

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

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

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

Это то, что у меня есть до сих пор:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

// 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']
);

Ответ 3

Откройте 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'));
}

Ответ 4

Чтобы получить адрес электронной почты пользователя, вы должны войти в систему с помощью своей учетной записи Facebook, используя разрешение email. Используйте для этого PHP SDK для Facebook (см. В 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.

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

Ответ 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"]);
    }
?>

Ответ 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 !');
      }
    });
  }

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

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

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

Ответ 11

Обязательно укажите номер версии API как нечто вроде "v2.11", а не "2.11"

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

Ответ 12

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

С помощью 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": "[email protected]"
}

идентификатор будет возвращен в любом случае.

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

?fields=name,email,user_birthday&token=

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