كيف يمكنني الحصول على بريد إلكتروني للمستخدم باستخدام Facebook Graph API في Gae Python؟

StackOverflow https://stackoverflow.com/questions/4005963

سؤال

أنا أستخدم Facebook Graph API على محرك تطبيق Google. تمكنت من جلب جميع المعلومات الأساسية من مستخدم. ومع ذلك ، عندما حاولت جلب أي معلومات مستخدم تتطلب إذنًا ، البريد الإلكتروني لـ Exemple ، يبدو دائمًا أنه لا شيء. لقد تابعت البرنامج التعليمي بأكمله المتاح في مدونة المطورين.

هذا هو الكود الخاص بي:

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

هل هناك شيء خاطيء؟ هل هناك طريقة أخرى للحصول على بريد إلكتروني للمستخدم؟

هل كانت مفيدة؟

المحلول 2

استسلمت فقط باستخدام facebook.py و facebookoauth.py وجعلت عميل Oauth 2 الخاص بي باستخدام urlfetch. يرى "مصادقة المستخدمين في تطبيق الويب" في مستندات Facebook.

أيضا ، وضعت scope='email' في طلبات https://graph.facebook.com/oauth/authorize? و https://graph.facebook.com/oauth/access_token?.

نصائح أخرى

البريد الإلكتروني مكتوب على إنشاء المستخدم. ربما تحاول الوصول إلى المستخدمين الذين تم إنشاؤهم عندما لم يكن لديك إذن بريد إلكتروني ، وبالتالي لم يكن البريد الإلكتروني المكتوب. هل تظهر المشكلة أيضًا لكائن المستخدم الجديد؟

يبدو رمزك صحيحًا ، لذا أفترض أنه ليس لديك الأذونات الموسعة الصحيحة. يجب أن تسأل عن إذن "البريد الإلكتروني" الممتد إذا كنت ستحاول الحصول على عنوان البريد الإلكتروني. يمكنك العثور على قائمة الأذونات الممتدة هنا. يجب أن تسأل عن هذه الأذونات قبل أن تتمكن من قراءة هذه الخصائص باستخدام API الرسم البياني.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top