如何在Facebook(Facebook Connect或Graph API)中获取用户电子邮件地址?

3
我之前在Facebook上有一个FBML应用程序,现在改成了IFrame应用程序,在FB上使用图形API(名称相同,游戏账户相同,只是从FBML切换到iFrame)。
我有一份已允许邮件扩展权限的人员名单。自从我改用IFrame以来,我可以根据API告知得到他们的电子邮件地址。
然而,这里有个问题:
1)当它在FBML中时,我没有他们的电子邮件地址。只有通过他们的电子邮件权限才可以。(这就是我的限制)
2)当用户登录并访问我的应用程序时,我可以获取他们的电子邮件。
3)然而,当他们不访问我的应用程序时,我无法获取他们的电子邮件。因为其中一些人可能不会回来,但我想要告诉他们有关更新的信息。
4)我尝试使用我注册应用程序的电子邮件地址(即开发者帐户)运行应用程序,但仍然无法检索他们的电子邮件。
似乎该应用程序只能获取当前登录用户的电子邮件。即使我是管理员,也无法获取其电子邮件。
有没有办法可以做到这一点?
例如: 如果用户12345678进入我的应用程序,我可以运行此命令以获取他的电子邮件:
 $fql    =   "select  email from user where uid=12345678";

显然,该用户无法运行并获取用户23456的信息。
e.g. $fql    =   "select  email from user where uid=23456";   <--- Fail

所以,问题来了。我有成千上万的人之前已经注册并接受了扩展权限,现在如何获取他们的电子邮件?我无法运行这个...

$fql    =   "select  email from user where uid=1000001";
$fql    =   "select  email from user where uid=1000002";
$fql    =   "select  email from user where uid=1000003";  
// assum 1000001 ... 1000003 are those users. 

我尝试使用我的开发者账户登录 Facebook,但仍然无法成功。如果有人有解决方案,请告知。谢谢。


看一下,我已经概述了使用Facebook Connect和Facebook PHP SDK获取用户信息的步骤。http://stackoverflow.com/questions/2718722/how-i-can-get-user-email-and-name-with-facebook-connect-new-platform/10766525#10766525 - Rafee
3个回答

1
    You can get  user email address and details in Facebook (Facebook Connect or Graph API)
<?php

require '../src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => '344617158898614',
  'secret' => '6dc8ac871858b34798bc2488200e503d',
));

// See if there is a user from a cookie
$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
      echo "FacebookApiException";
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
    $user = null;
  }
}

?>
<!DOCTYPE html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <body>
    <?php if ($user) { ?>
      Your user profile is
      <pre>
        <?php print htmlspecialchars(print_r($user_profile, true)) ?>
      </pre>
    <?php } else { ?>


      <div class="fb-login-button" data-scope="email,user_checkins">
        Login with Facebook
      </div>
    <?php } ?>
    <div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId: '<?php echo $facebook->getAppID() ?>',
          cookie: true,
          xfbml: true,
          oauth: true
        });
        FB.Event.subscribe('auth.login', function(response) {
          window.location.reload();
        });
        FB.Event.subscribe('auth.logout', function(response) {
          window.location.reload();
        });
      };
      (function() {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol +
          '//connect.facebook.net/en_US/all.js';
        document.getElementById('fb-root').appendChild(e);
      }());
    </script>
  </body>
</html>

1

这个想法是在用户登录时获取他的电子邮件,然后将其存储在您自己的数据库中以供将来参考。


我知道。但我的问题是如何获取所有电子邮件。 - murvinlai
你不能获取未授权你的应用程序的用户的电子邮件...这是否就是你所说的“所有电子邮件”?还是你的问题是,当用户授权应用程序时,我如何获取该用户的电子邮件? - Domenic
不好意思,请仔细阅读我的电子邮件。 在我将应用切换为IFrame之前,我已经获得了用户的授权并且他们也接受了扩展权限。现在,我在IFrame应用中,如何获取他们的电子邮件? - murvinlai
啊,我明白了,你编辑了你的问题以使它更清晰。但是我真的不知道如何解决你新澄清的问题 :(. 如果你以前从未保存过这些信息,那么现在似乎不太可能检索到它们,假设你没有保存他们的授权令牌或其他类似的东西。电子邮件权限基本上相当于“当此应用程序使用我的授权令牌请求电子邮件时,允许该应用程序拥有它。”它并不意味着“此应用程序现在可以访问Facebook用户电子邮件的中央数据库中的我的条目。”这是一个好问题! - Domenic

0

首先,请确保在权限范围内包括电子邮件,如下所示:

https://www.facebook.com/dialog/oauth?client_id=595603433841467&redirect_uri=http://127.0.0.1:8000/faceb_login/&scope=email

接下来按照其他文档所述获取OAuth令牌。然后,要实际检索一个人的电子邮件,您可以发出以下请求:

https://graph.facebook.com/1162321772?fields=email&access_token=XXXXXXXXXXXXXXXXXXXXXX...

Graph API的文档在这里:

https://developers.facebook.com/docs/graph-api/using-graph-api


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接