我正在尝试使用 Facebook JavaScript SDK 向用户 friend 发送“应用程序”邀请。 这是单击 Facebook 按钮时的模板事件:
"click #fb": function (e, tmp) {
Meteor.loginWithFacebook({
requestPermissions: ['user_likes',
'friends_about_me',
'user_birthday',
'email',
'user_location',
'user_work_history',
'read_friendlists',
'friends_groups',
'user_groups']
}, function (err) {
if (err) {
console.log("error when login with facebook " + err);
} else {
FB.api('/' + Meteor.user().services.facebook.id + '/friends', { fields: 'name,picture' }, function (response) {
if (response && response.data) {
friends = response.data;
friends_dep.changed();
}
});
}
});
}
之后我希望用户邀请其他人使用我的应用程序,我的代码如下所示(另一个模板事件):
FB.ui({method: 'apprequests',
message: 'My Great Request'
}, function(response) {
if (response && response.post_id) {
alert('Post was published.');
} else {
alert('Post was not published.');
}
}
);
它正在运行。有一个与所有用户 friend 的 Facebook 对话,但在尝试发送消息时,我收到响应错误 =“帖子未发布。”
我在这里做错了什么?
基本上用户可以建立一个群组——我希望用户能够邀请他的 facebook 好友加入该群组。无论如何,当发送请求时,接收者只需按"is"并自动添加到发送者组?
注意我使用的是我的本地机器,也就是 localhost:3000
最佳答案
您可以尝试从 if 语句中删除 && response.post_id 部分吗?
根据请求对话框的 Facebook API 文档:https://developers.facebook.com/docs/reference/dialogs/requests/响应将只有“请求”和“到”数据。看起来您已经从他们为帖子对话框提供的示例中复制并粘贴了您的回调。如果删除后仍然出现错误,那么您没有收到响应,我不确定 JS SDK 如何处理响应。如果您可以使用 js sdk 调用其他 API,那么我真的不确定。
我最近使用 Facebook API 并选择不使用 JS SDK,因为它似乎与使用 accounts-facebook 包不一致。我很好奇你是否也在使用它。
一些 Facebook API 调用,如创建帖子(可能还有这个)确实需要一个对话框,我将概述我是如何在不使用 JS SDK 的情况下解决这个问题的,以防它对你或其他人有帮助。我只会形成 URL 客户端并打开一个弹出窗口,例如这是我处理发送帖子的方式:
'click .send-message': function() {
var recipient = this.facebook_id;
var config = Accounts.loginServiceConfiguration.findOne({service: 'facebook'});
var url = "http://www.facebook.com/dialog/feed?app_id=" + config.appId +
"&display=popup&to=" + recipient + "&redirect_uri=" + Meteor.absoluteUrl('_fb?close');
window.open(url, "Create Post", "height=240,width=450,left=100,top=100");
}
然后获取响应服务器端:
WebApp.connectHandlers
.use(connect.query())
.use(function(req, res, next) {
if(typeof(Fiber)=="undefined") Fiber = Npm.require('fibers');
Fiber(function() {
try {
var barePath = req.url.substring(0, req.url.indexOf('?'));
var splitPath = barePath.split('/');
if (splitPath[1] !== '_fb') {
return next();
}
if (req.query.post_id) {
//process it here
}
res.writeHead(200, {'Content-Type': 'text/html'});
var content = '<html><head><script>window.close()</script></head></html>';
res.end(content, 'utf-8');
} catch (err) {
}
}).run();
});
此代码与打开登录弹出窗口并监听响应时在 oauth 包中使用的代码非常相似。
关于javascript - 在 Meteor 中使用 Facebook 请求对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093290/