2013-02-22 73 views
12

मैं एक उल्का आवेदन के भीतर उपयोग करने के लिए प्रमाणीकृत फेसबुक उपयोगकर्ता की प्रोफ़ाइल तस्वीर प्राप्त करने की कोशिश कर रहा हूं। मैंने निम्नलिखितमेटीर के खातों के माध्यम से फेसबुक उपयोगकर्ता चित्र से कैसे पूछें- फेसबुक?

Meteor.publish("facebook_avatar_url", function() { 
    return Meteor.users.find({_id: this.userId}, {fields: { 
     'services.facebook.id': 1, 
     'services.facebook.name': 1, 
     'services.facebook.gender': 1, 
     'services.facebook.picture': 1, 
     'services.facebook.picture.data': 1, 
     'services.facebook.picture.data.url': 1 
    }}); 
}); 

और यह केवल आईडी, नाम और लिंग लौटाता है। ऐसा लगता है कि मैं क्या चाहता हूं, और अनुशंसित समाधान। केवल समस्या यह है कि उपयोगकर्ता की तस्वीर के संबंध में कोई डेटा वापस नहीं किया जा रहा है।

मैंने कुछ अन्य पदों के सुझाव पर सर्वर/server.js को निम्नलिखित जोड़ने का प्रयास किया, लेकिन यह ए) अनुशंसित दृष्टिकोण प्रतीत नहीं होता है, और बी) कुछ भी नहीं कर रहा है। तो, ऐसा लगता है कि यह एक मृत अंत है, लेकिन वहां से कोई ऐसा लगता है कि प्रोफ़ाइल प्रोफ़ाइल को लोड करने के लिए इसका उपयोग किया जा सकता है।

var getFbPicture; 

Accounts.loginServiceConfiguration.remove({ 
    service: "facebook" 
}); 


Accounts.onCreateUser(function(options, user) { 
    if (options.profile) { 
     options.profile.picture = getFbPicture(user.services.facebook.accessToken); 
     user.profile = options.profile; 
    } 
    return user; 
}); 

getFbPicture = function(accessToken) { 
    var result; 
    result = Meteor.http.get("https://graph.facebook.com/me", { 
     params: { 
      access_token: accessToken, 
      fields: 'picture' 
     } 
    }); 
    if (result.error) { 
     throw result.error; 
    } 
    return result.data.picture.data.url; 
}; 

तो, मुझे इस बात पर अनिश्चितता है कि इस दिशा में किस दिशा में जाना है। क्या ऐसा कुछ है जिसे फेसबुक ग्राफ एपीआई पर सेट की अनुमति है? या फेसबुक एप्लिकेशन पर? क्या मेरे पास प्रकाशन समारोह में वाक्यविन्यास गलत है? क्या मुझे onrereUser फ़ंक्शन पर फिर से विचार करने की आवश्यकता है?

उत्तर

36

इसके बजाए इसका उपयोग करें, आपको अपने profile picture, उनके फेसबुक उपयोगकर्ता आईडी प्राप्त करने के लिए विशेष टोकन या कुछ भी विशेष की आवश्यकता नहीं है।

Accounts.onCreateUser(function(options, user) { 
    if (options.profile) { 
     options.profile.picture = "http://graph.facebook.com/" + user.services.facebook.id + "/picture/?type=large"; 
     user.profile = options.profile; 
    } 
    return user; 
}); 
+3

धन्यवाद फेसबुक

के लिए चित्र प्राप्त करने के
Accounts.onCreateUser(function(options, user) { if (typeof(user.services.facebook) != "undefined") { user.services.facebook.picture = "http://graph.facebook.com/" + user.services.facebook.id + "/picture/?type=large"; } return user; }); 

आप कर सकते हैं चाहते हैं । Accounts.onCreateUser विधि ने वास्तव में उपयोगकर्ताओं के मेरे एप्लिकेशन के बूटस्ट्रैपिंग को तोड़ दिया, लेकिन सामान्य विचार काम किया, इसलिए जवाब स्वीकार कर लिया। मैं निम्नलिखित का उपयोग करके घायल हो गया: 'Template.userCardTemplate.user_image = function() { अगर (Meteor.user()। Services.facebook) { वापसी" http://graph.facebook.com/ "+ उल्का .user()। services.facebook.id + "/ picture /? type = big"; } }; ' – AbigailW

+0

कृपया मैं चाहता हूं कि आप इसका इस्तेमाल कर सकें! यह आपके ऐप को तोड़ना नहीं चाहिए, क्या आप इसका इस्तेमाल सर्वर साइड कोड पर कर रहे हैं? क्या आपको इसके साथ अपने कंसोल पर त्रुटियां मिलती हैं और क्या आप पंजीकरण करते समय विकल्पों को नीचे भेज रहे हैं? – Akshat

+0

आपने जो सुझाव दिया है वह अच्छा कोड है, और ढांचे का सही ढंग से उपयोग करता है। ऐसा लगता है कि उपयोगकर्ताओं को बूटस्ट्रैप करते समय खाता मॉड्यूल को बाईपास करना होता है, और उन्हें सीधे उपयोगकर्ता संग्रह में डालना होता है। त्रुटि मेरी तरफ है, क्योंकि मैं बूटस्ट्रैप उपयोगकर्ताओं को माध्यमिक, गैर-मानक तंत्र का उपयोग कर रहा हूं। मुझे उस बूटस्ट्रैप फ़ाइल पर पुनर्विचार करना होगा, और खाता मॉड्यूल का उपयोग करके इसे पुन: सक्रिय करने का तरीका जानें। (हो सकता है कि 'todos' उदाहरण के लिए भी एक बग फिक्स सबमिट करें, इसे खाता मॉड्यूल के साथ नवीनतम विकास के साथ गति में लाने के लिए।) – AbigailW

3

आप इस सहायक समारोह प्रतिक्रिया अक्षत के लिए अपने html में

UI.registerHelper("getImageUser", function (userId) { 
    var user= Meteor.users.findOne(userId); 
    if (user.services) 
    { 
     if (user.services.facebook) 
      return user.services.facebook.picture; 
     if (user.services.twitter) 
      return user.services.twitter.profile_image_url; 
     if (user.services.google) 
      return user.services.google.picture; 
    } 
    else 
    { 
     return "images/withOutPhoto.png"; 
    } 
}); 

जोड़ने के लिए

<img src="{{getImageUser this._id}}" alt="..."> 
+1

मत भूलना: user.profile = options.profile; यह एक डिफ़ॉल्ट को ओवरराइट करेगा, और आप उस नाम को खो देंगे जहां साइन इन/अप है। वैसे यह मेरे लिए ^^ था –