كيف يمكنني الحصول على بريد إلكتروني للمستخدم باستخدام Facebook Graph API في Gae Python؟
-
25-09-2019 - |
سؤال
أنا أستخدم 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 الرسم البياني.