6

我在Google App Engine上使用Facebook Graph API。我能够从用户获取所有基本信息。但是,当我试图获取任何需要权限的用户信息时,例如电子邮件,它总是显示为无。我已经按照developers blog提供了整个教程。如何在GAE Python中使用Facebook Graph API获取用户电子邮件?

这里是我的代码:

class User(db.Model): 
    id = db.StringProperty(required=True) 
    created = db.DateTimeProperty(auto_now_add=True) 
    updated = db.DateTimeProperty(auto_now=True) 
    name = db.StringProperty(required=True) 
    email = db.StringProperty(required=True) 
    profile_url = db.StringProperty(required=True) 
    access_token = db.StringProperty(required=True) 


class BaseHandler(webapp.RequestHandler): 
    """Provides access to the active Facebook user in self.current_user 

    The property is lazy-loaded on first access, using the cookie saved 
    by the Facebook JavaScript SDK to determine the user ID of the active 
    user. See http://developers.facebook.com/docs/authentication/ for 
    more information. 
    """ 
    @property 
    def current_user(self): 
     if not hasattr(self, "_current_user"): 
      self._current_user = None 
      cookie = facebook.get_user_from_cookie(
       self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) 
      if cookie: 
       # Store a local instance of the user data so we don't need 
       # a round-trip to Facebook on every request 
       user = User.get_by_key_name(cookie["uid"]) 
       if not user: 
        graph = facebook.GraphAPI(cookie["access_token"]) 
        profile = graph.get_object("me") 
        user = User(key_name=str(profile["id"]), 
           id=str(profile["id"]), 
           name=profile["name"], 
           email=profile["email"], 
           profile_url=profile["link"], 
           access_token=cookie["access_token"]) 
        user.put() 
       elif user.access_token != cookie["access_token"]: 
        user.access_token = cookie["access_token"] 
        user.put() 
       self._current_user = user 
     return self._current_user 

这里是模板/ HTML:

<fb:login-button autologoutlink="true" perms="email"></fb:login-button> 

{% if current_user %} 
    <p><a href="{{ current_user.profile_url }}"><img src="http://graph.facebook.com/{{ current_user.id }}/picture?type=square"/></a></p> 
    <p>Hello, {{ current_user.name|escape }}</p> 
    <p>email: {{ current_user.email }} </p> 
{% endif %} 

有什么错吗?是否有其他方式获取用户电子邮件?

+0

尝试添加从FB获得的配置文件的一些调试输出,并查看电子邮件是否存在。当FB授权对话框出现时,它是否包含电子邮件许可? – cope360 2010-11-23 13:51:55

回答

0

您的代码看起来正确,所以我会假设您没有正确的扩展权限。如果您要尝试获取电子邮件地址,则必须要求提供“电子邮件”扩展权限。您可以找到扩展权限列表here。您必须先获得这些权限,然后才能使用Graph API读取这些属性。

+1

他在登录按钮标记中显示perms =“email”。这应该提示权限。 – cope360 2010-11-23 13:51:17

1

电子邮件写在用户创建。也许你试图访问在你没有电子邮件许可时创建的用户,因此书面电子邮件是None。问题是否也出现在新的用户对象中?

相关问题