Facebook Graph API, як отримати електронну пошту користувачів?


86

Я використовую Graph Graph, але не можу зрозуміти, як отримати електронну адресу зареєстрованих користувачів.

Вступ до Graph стверджує: "Graph 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 = email.
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 і ніде не можу його знайти :(
Раду Мурзеа,

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 для отримання інформації про користувача за допомогою 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, ти можеш перевірити зараз, я думаю, це може допомогти. але ще краще ви все ще можете коментувати більше питань.
Деліно 27.03.18

+ Статус героя, тільки для «/» + ідентифікатор користувача + «/ = поля ID, ім'я, адреса електронної пошти?» , Який не вказано в документації
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не містить електронної пошти
zed Blackbeard

3

Припускаючи, що ви запитували дозволи на електронну пошту, коли користувач увійшов у ваш додаток і у вас є дійсний маркер,

За допомогою 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"
}

ідентифікатор буде повернено в будь-якому випадку.

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

?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
Ви не можете отримати його без розширеного дозволу.
Грейгер

або без вказівки параметра поля , які не вказані в документації '/ мене / поля = ідентифікатор, ім'я, адреса електронної пошти?
therightstuff

1

Електронний лист у профілі можна отримати за допомогою розширеного дозволу, але, гадаю, неможливо отримати електронний лист, який використовується для входу в fb. У своєму додатку я хотів відобразити в списку безліч облікових записів fb користувача, хотів показати електронні адреси входу облікових записів fb як унікальний ідентифікатор відповідних облікових записів, але мені не вдалося вилучити його з fb, все, що я отримав, було основна електронна адреса в профілі користувача, але в моєму випадку моя електронна адреса для входу та моя основна електронна адреса відрізняються.


0

Переконайтеся, що ваша заявка на Facebook опублікована. Щоб отримувати дані по електронній пошті, public_profile та user_friends, ваш додаток повинен бути доступним для всіх.

Ви можете відключити його пізніше для цілей розробки і все одно отримати поле електронної пошти.


0

Наступні інструменти можуть бути корисними під час розробки:

Доступ до налагоджувача маркерів: Вставте маркер доступу для отримання деталей

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

Провідник API графіків: Перевірте запити до API графіку після вставлення у ваш маркер доступу

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


0

Переконайтеся, що повністю вказали номер версії API як щось подібне, "v2.11"а ні"2.11"

Я не впевнений, що це за замовчуванням, якщо це неправильно, але я отримав деякі дивні помилки, намагаючись просто отримати електронне повідомлення, коли я пропустив v.


0

Для мене проблема зі збором адрес електронної пошти користувача на стороні PHP (метод getGraphUser ()) полягала в тому, що поведінка за замовчуванням кнопки, що відтворюється у facebook (на стороні WEBSIDE, створеної з xfbml = 1), полягає в імплікації виклику FB.login () з сфера застосування НЕ включає "електронну пошту".

Це означає, що ПОВИНЕН:

1) дзвінок

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

явно, створивши власну кнопку для запуску процесу входу

АБО

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

<div class = "fb-login-button" data-size = "large" data-button-type = "continue_with" data-
layout = "rounded" 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);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.