通过Facebook Graph Node JS发布帖子

时间:2013-04-16 00:22:33

标签: node.js facebook-graph-api permissions facebook-page facebook-access-token

我目前正在寻求通过创建自定义应用程序来自动完成一些任务,该应用程序允许我轻松地在我的Facebook页面上发布状态更新(而不是我的个人时间轴)。我的后端正在NodeJS上运行。

我的客户端代码包含以下内容:

window.fbAsyncInit = function() {
FB.init({
    appId : 'xxxxxxxxxxxxx', // App ID
    channelUrl : '//xxxxxxxxxxx, // Channel File
    status : true, // check login status
    cookie : true, // enable cookies to allow the server to access the session
    xfbml : true // parse XFBML
});

// Additional init code here
FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
        console.log("You are signed into FB");
        var access_token = FB.getAuthResponse()['accessToken'];
        console.log('Access Token = ' + access_token);
        FB.api('/me/accounts', function(response) {
          for(var i=0;i <response.data.length;i++){;
            var page = response.data[i];
            if(page.id==my_id){
                var page_token = page.access_token;
                console.log(page_token);
                var param = 'callback=?&username=' + GetURLParameter('username')+'&session='+ GetURLParameter('session')+'&access_token='+ page_token;
                $.post(saveTokenEndpoint, param, function(data) {
                    console.log(data);
                });
            }
          }
        });

        FB.api('/me', function(response) {
            username = response.name;
            userid = response.id;
            $('#username').text('~Hi '+username+'!');       
            $(document).trigger('fbInit');
        });

        // connected
    } else if (response.status === 'not_authorized') {
        // not_authorized
        login();
    } else {
        login();
        // not_logged_in
    }

});

};

// Load the SDK Asynchronously
( function(d) {
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {
        return;
    }
    js = d.createElement('script');
    js.id = id;
    js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    ref.parentNode.insertBefore(js, ref);
}(document));

function login() {
FB.login(function(response) {
    if (response.authResponse) {
        console.log("You are signed into FB");
        var access_token = FB.getAuthResponse()['accessToken'];
        FB.api('/me', function(response) {
            username = response.name;
            userid = response.id;
            $('#username').text('~Hi '+username+'!');
            $(document).trigger('fbInit');
        });
        FB.api('/me/accounts', function(response) {
          // handle response
          for(page in response.data){
            if(page.id==my_id){
                var page_token = page.access_token;
                console.log(page_token);
                var param = 'callback=?&username=' + GetURLParameter('username')+'&session='+ GetURLParameter('session')+'&access_token='+ page_token;
                $.post(saveTokenEndpoint, param, function(data) {
                    console.log(data);
                });
            }
          }
        });

    } else {
        // cancelled
    }
}, {scope: 'publish_stream, manage_pages, offline_access'});
}

我的服务器端代码:

// saves the token received for future use in posting
app.post('/api/saveToken',function(req,res){
    var username = req.body.username;
    var access_token = req.body.access_token;
    var session = req.body.session;
    user.findOne({
        username: username,
        session: session
    },function(err, userObj){
        if(userObj!=null){
            userObj.token = access_token;
            console.log(access_token);
            userObj.save();
            res.jsonp({status:'true'});
        }else{
            res.jsonp({status:'false'});
        }
    });
});

我正在使用此方法在我的网页上发布我的帖子:

var data = querystring.stringify({
access_token: token,
message: message
});

                        var options = {
                            host: 'graph.facebook.com',
                            port: 443,
                        path: '/app_name/feed',
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded',
                            'Content-Length': data.length
                        }
                    };

                    var req = https.request(options, function(res) {
                        res.setEncoding('utf8');
                        res.on('data', function (chunk) {
                            console.log("body: " + chunk);
                        });
                        res.on('end', function(){ // see http nodejs documentation to see end
                            console.log("\nfinished posting message");
                            conObj.approval = 'published';
                            conObj.save();
                        });
                    });
                    req.on('error', function(e) {
                        console.error(e);
                    });
                    req.write(data);
                    req.end();

现状:

我的代码正在运行,我实际上可以看到我页面墙上的帖子。

BUT

  

除了我以外,其他任何人都不会看到。

我如何正确地发表意见: 当我直接从Graph API Explorer(/ me / accounts)复制令牌时,我得到了它的工作。 https://developers.facebook.com/tools/explorer?method=GET&path=me%2Faccounts

最终,我想做的就是找到一种方法在我的页面上发帖子

我监控了两个令牌之间的差异,但没有发现任何差异。他们的范围是“公众”和“每个人”。

专家建议!我发现这一切都非常令人费解。

如果所有其他方法都失败,我打算尝试NodeJS facebook,例如facebook-node-sdknodejs-facebook-sdk库。

感谢您提前回复!

1 个答案:

答案 0 :(得分:2)

你应该做OAUTH服务器端,而不是客户端。

以下是使用node.js通过Facebook Graph API发布帖子的工作示例:http://code.runnable.com/facebook/UTlPM1-f2W1TAABY

您尚未使用的唯一依赖项是您应该使用的请求。