1

我正在尝试使用 Facebook JavaScript SDK 向用户朋友发送“应用”邀请。这是单击 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.');
                }
            }
        );

它正在工作。有一个与所有用户朋友的 Facebook 对话,但在尝试发送消息时,我收到响应错误 = '帖子未发布。'

我在这里做错了什么?

基本上用户可以建立一个组 - 我希望用户能够邀请他的 Facebook 朋友加入该组。无论如何,在发送请求时,接收者只会按“是”并自动添加到发件人组中吗?

注意我正在使用我的本地机器,也就是 localhost:3000

4

1 回答 1

3

您可以尝试从 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 包中在打开登录弹出窗口并监听响应时使用的代码非常相似。

于 2013-10-04T00:47:21.980 回答