Facebook Graph API,如何获取用户电子邮件?


86

我正在使用Graph API,但无法弄清楚如何获取登录用户的电子邮件地址。

Graph简介指出:“ Graph API可以提供您通常会以注册表格形式请求的所有基本帐户注册数据的访问权限,包括名称,电子邮件地址,个人资料图片和生日”

很好,但是如何访问该信息?

这是我到目前为止所拥有的:

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

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

3
哪些呢var_dump($obj);输出?
Jayrox

Answers:


76

获取用户电子邮件地址的唯一方法是在电子邮件字段上请求扩展权限。用户必须允许您看到此消息,并且您无法获取用户朋友的电子邮件地址。

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

如果您使用的是Facebook连接,则可以通过在调用的“获取”字符串的get字符串中传递scope = email来实现。

我建议您使用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上的页面,却在任何地方都找不到它:(
Radu Murzea

3
/我的语言环境= EN_US&栏=姓名,电子邮件是我能想出让它返回的电子邮件地址,无法在网上找到任何其他提及这一点的唯一方法是什么?
阿什利


1
这是正确的答案,但一个简单的解释可以在这里找到:stackoverflow.com/questions/37349618/...
HoldOffHunger

谢谢你..除了这个没有其他工作。现在一切正常!:)
supersan '18年

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

要获取用户电子邮件,您必须使用email许可使用其Facebook帐户登录用户。用于以下用途的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 !');
    }
  }

这也有设置为变量的userid,然后调用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);
      }
    );
  }

在将userid作为参数传递之后,该函数将获取与该userid相关的所有信息。注意:在我的情况下,我正在寻找电子邮件,因为允许我运行只能通过电子邮件登录用户的功能。

//通过电子邮件登录

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'–正确的东西

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

ID仍会返回。

您可以向字段查询参数中添加更多内容,但是如果它们不在公共配置文件中(名称为public),则需要它们的权限。

?fields=name,email,user_birthday&token=

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


喜欢一个不假定不需要使用SDK的答案。
里尔曼


1

可以使用扩展权限获取配置文件中的电子邮件,但我想这不可能获得用于登录fb的电子邮件。在我的应用程序中,我想在列表中显示用户的多个fb帐户,我想将fb帐户的登录电子邮件显示为各个帐户的唯一标识符,但我无法从fb中删除它,我得到的只是用户个人资料中的主要电子邮件,但就我而言,我的登录电子邮件和主要电子邮件是不同的。


0

确保您的Facebook应用程序已发布。为了接收电子邮件,public_profile和user_friends的数据,必须将您的应用公开。

您可以稍后出于开发目的禁用它,但仍会收到电子邮件字段。



0

确保将API的版本号完全指定为like"v2.11"和not"2.11"

我不确定这是不正确的默认设置,但是当我错过时尝试重新获取电子邮件时遇到一些奇怪的错误v


0

对我来说,在PHP端(getGraphUser()方法)收集用户的电子邮件地址的问题是,facebook呈现的按钮(在WEBSIDE端,使用xfbml = 1创建)的默认行为是隐式调用FB.login()范围不包括“电子邮件”。

这意味着您必须:

1)致电

FB.login(....,{范围:电子邮件})

显然,创建您自己的按钮以开始登录过程

要么

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

然后,在登录后,或者如果用户已经登录,则使用Facebook API检索电子邮件,并指定字段email:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.