【问题标题】:Facebook Graph API, how to get users email?Facebook Graph API,如何获取用户电子邮件?
【发布时间】:2011-04-06 09:59:46
【问题描述】:

我正在使用 Graph API,但我不知道如何获取登录用户的电子邮件地址。

Graph 的介绍中指出“Graph API 可以提供对所有基本帐户注册数据的访问权限,这些数据通常会在您网站的注册表单中请求,包括姓名、电子邮件地址、个人资料图片和生日”

一切都很好,但我如何访问这些信息?

这是我目前所拥有的:

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

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

【问题讨论】:

  • var_dump($obj); 输出什么?

标签: php json facebook facebook-graph-api


【解决方案1】:

首先,在Facebook Developer center 激活您的应用程序。开发模式下的应用程序不允许检索电子邮件字段。

如果用户未登录,您需要登录并指定您的应用程序/站点将需要电子邮件字段。

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

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

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

【讨论】:

    【解决方案2】:

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

    这意味着您必须:

    1) 调用

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

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

    2) 为 xfbml 按钮添加 scope="email" 属性

    能够在 PHP 端收集电子邮件地址。

    希望对你有帮助。

    【讨论】:

      【解决方案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 的答案。
      【解决方案4】:

      只需在状态返回时添加这些代码块,然后开始传递查询字符串对象 {}。对于 JavaScript 开发人员

      在初始化你的 sdk 之后。

      第一步://获取登录状态

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

      这将检查文档加载并获取您的登录状态检查用户是否已登录。

      然后调用checkLoginState函数,并将响应传递给statusChangeCallback

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

      第二步:让你从状态中获取响应数据

      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,您现在可以检查一下,我认为这可能会有所帮助。但更好的是,您仍然可以评论更多问题。
      • +hero 状态,仅用于文档中未指定的 '/'+userId+'/?fields=id,name,email'
      【解决方案5】:

      确保将 API 的版本号完全指定为 "v2.11" 而不是 "2.11"

      如果这不正确,我不确定它的默认值,但是当我错过了 v 时,我在尝试检索电子邮件时遇到了一些奇怪的错误。

      【讨论】:

        【解决方案6】:

        以下工具在开发过程中可能很有用:

        访问令牌调试器:粘贴访问令牌以获取详细信息

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

        Graph API Explorer:在粘贴访问令牌后测试对图形 api 的请求

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            您可以从已登录用户的个人资料中检索电子邮件地址。这是代码sn-p

            <?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"]);
                }
            ?>
            

            【讨论】:

            • 这对我不起作用。 $user_profile 不包含电子邮件
            【解决方案9】:
            // 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']
            );
            

            【讨论】:

            • 是否有描述/me 路线的参考页面?我一直在浏览Graph API 上的页面,但在任何地方都找不到 :(
            • /me?locale=en_US&fields=name,email 是我想办法让它返回电子邮件地址的唯一方法,在网上找不到任何其他参考
            • 这是正确答案,虽然可以在这里找到更简单的解释:stackoverflow.com/questions/37349618/…
            • 谢谢你..除了这个没有其他工作。现在它工作正常! :)
            【解决方案10】:

            打开 base_facebook.php 在getLoginUrl()函数处添加Access_token

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

            【讨论】:

              【解决方案11】:

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

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

              如果您使用 Facebook 连接,则可以通过在调用 Auth 对话框的 get 字符串中传递 scope=email 来执行此操作。

              我建议使用 SDK 而不是 file_get_contents,因为它可以更轻松地执行 Oauth 身份验证。

              【讨论】:

              • 好的,更改了 file_get_contents。但我有点困惑我将在哪里传递 req_perms=email。
              • 没关系,我想通了:$facebook->getLoginUrl(array('req_perms' => 'email'))
              • 根据这个答案对我来说并不是很明显......如果您使用的是 JavaScript API,您想使用FB.api('/me?scope=email', function(apiResponse) { ... });
              【解决方案12】:

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

              【讨论】:

                【解决方案13】:

                要获取用户电子邮件,您必须使用他的 Facebook 帐户使用email 权限登录用户。如下使用 Facebook PHP SDK (see on 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 数组中找到电子邮件。

                希望有帮助!

                【讨论】:

                  【解决方案14】:

                  https://graph.facebook.com/me

                  将为您提供有关当前登录用户的信息,但您需要提供一个 oauth 令牌。见:

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

                  【讨论】:

                  • 如果没有扩展权限,您将无法获得它。
                  • 或不指定文档中未指定的字段参数'/me/?fields=id,name,email'
                  猜你喜欢
                  • 2018-08-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多