node.js - 通过 Facebook Graph Node JS 发布帖子

标签 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();

现状:

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

但是

It does not appear to anyone else except myself.

我如何让它暂时正确显示: 当我直接从 Graph API Explorer 复制 token 时(/me/accounts),我让它工作了。 https://developers.facebook.com/tools/explorer?method=GET&path=me%2Faccounts

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

我监控了通过这两个 token 产生的差异,没有发现任何差异。他们的范围是“公众”和“每个人”。

请专家指教!我觉得这一切都很令人费解。

我打算尝试 NodeJS facebook,例如 facebook-node-sdknodejs-facebook-sdk如果一切都失败了,请使用库。

感谢您提前回复!

最佳答案

您应该在服务器端执行 OAUTH,而不是客户端。

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

您尚未使用的唯一依赖项是 request,您应该使用它。

关于node.js - 通过 Facebook Graph Node JS 发布帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026779/

相关文章:

c# - Facebook c# sdk : deleting a request-id

javascript - NodeJS递归列出目录中的文件

javascript - 使用 FB.ui 在应用程序请求中设置好友 ID?

node.js - 电影不是构造函数 - Mongoose

javascript - Facebook api Javascript 发布到 friend 墙

mysql - 如何让一个 MySQL 用户只能访问一个模式

postgresql - 需要帮助来严格指定 PostgreSQL 的摄取者角色

SQL 代码未运行,收到 "permission denied for schema public"错误消息

javascript - 如何在 Node JS 中 gzip 一个 jade 模板

node.js - 如何解决 "Unable to resolve some modules oracledb"?