2013-02-22 33 views
12

Tôi đang cố gắng để có được hình ảnh hồ sơ cá nhân của người dùng Facebook đã được xác thực, để sử dụng trong ứng dụng Meteor. Tôi đã thử sauCách truy vấn ảnh người dùng Facebook thông qua tài khoản-facebook của Meteor?

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 
    }}); 
}); 

và chỉ trả về id, tên và giới tính. Điều này có vẻ là những gì tôi muốn, và các giải pháp được đề nghị. Chỉ có vấn đề là không có dữ liệu được trả về liên quan đến hình ảnh của người dùng.

Tôi đã thử thêm các mục sau vào máy chủ/server.js, theo đề xuất của một số bài đăng khác, nhưng a) dường như không phải là phương pháp được đề xuất và b) dường như không hoạt động. Vì vậy, nó có vẻ là một kết thúc chết, nhưng ai đó ra có vẻ nghĩ rằng nó có thể được sử dụng để có được hình ảnh hồ sơ được tải lên.

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

Vì vậy, tôi không chắc chắn nên đi theo hướng nào vào thời điểm này. Đây có phải là thứ cần được đặt trên Facebook Graph API không? Hoặc trên ứng dụng Facebook? Tôi có sai cú pháp trong chức năng xuất bản không? Tôi có cần phải truy cập lại hàm onCreateUser không?

Trả lời

36

Sử dụng mã này để thay thế, bạn không cần mã thông báo truy cập hoặc bất kỳ điều gì đặc biệt để nhận được profile picture, chỉ là id người dùng facebook của họ.

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

Cảm ơn thông tin phản hồi Akshat . Phương thức Accounts.onCreateUser thực sự đã phá vỡ khả năng khởi động của ứng dụng của người dùng, nhưng ý tưởng chung đã làm việc, vì vậy hãy chấp nhận câu trả lời. Tôi sử dụng các thông tin sau: 'Template.userCardTemplate.user_image = function() { nếu (Meteor.user(). Services.facebook) { trả về" http://graph.facebook.com/ "+ Meteor .user(). services.facebook.id + "/ picture /? type = large"; } }; ' – AbigailW

+0

Xin vui lòng tôi muốn bạn có thể sử dụng nó như bạn muốn! Nó không nên phá vỡ ứng dụng của bạn, bạn đang sử dụng nó trên mã phía máy chủ? Bạn có nhận được lỗi trên giao diện điều khiển của bạn với nó & là bạn đi qua các tùy chọn xuống khi đăng ký? – Akshat

+0

Những gì bạn đề xuất là mã tốt và sử dụng khung chính xác. Tôi chỉ tình cờ bỏ qua mô-đun Tài khoản khi người dùng bootstrapping và chèn chúng trực tiếp vào bộ sưu tập Người dùng. Lỗi ở bên cạnh tôi, bởi vì tôi đang sử dụng cơ chế thứ cấp, không chuẩn cho người dùng bootstrap. Tôi phải suy nghĩ lại rằng file bootstrap đó, và tìm ra cách cấu trúc lại nó bằng mô-đun Accounts. (Thậm chí có thể gửi một sửa lỗi cho ví dụ 'todos', để tăng tốc độ với những phát triển mới nhất với mô-đun Tài khoản.) – AbigailW

3

nếu bạn muốn nhận được hình ảnh cho facebook

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; 
}); 

bạn có thể để thêm chức năng helper này

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"; 
    } 
}); 

trong html của bạn

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

đừng quên: user.profile = options.profile; mục này sẽ ghi đè lên giá trị mặc định và bạn sẽ mất tên nơi đăng nhập/đăng nhập. Vâng nó đã làm cho tôi^^ –

Các vấn đề liên quan