使用NodeJs请求模块向Reddit API发表评论

所以我正在为Redditor的同事构build一个非常愚蠢的机器人。 它需要login,然后发表评论。 Reddit的文档相当稀less,恕我直言,所以我希望有人能告诉我我要去哪里错了。

据我了解,我需要张贴到https://ssl.reddit.com/api/login ,检索一个cookie,然后发送该cookie,以及提供的modhash https://api.reddit.com/api /评论 。 但是当我遵循这些步骤时,我一直得到一个403 statusCode。 我敢肯定,我错过了一些愚蠢的东西,但我似乎无法告诉它是什么。

相关代码:

 var request = require('request') , modhash; request.defaults({jar:true}); function login () { var options = { url : 'https://ssl.reddit.com/api/login?api_type=json&user=USERNAME&passwd=PASSWORD&rem=true', headers : { 'User-Agent' : 'fooBot/0.1 by USERNAME' }, method : 'POST' }; request(options, function (err, res, body) { if (err) { console.log(err.json.errors); return; } else { var parsedBody = JSON.parse(body); modhash = body.json.data.modhash; } }); } function postComment () { var parentId = 't1_cf9k3wa' , options = { url : 'https://api.reddit.com/api/comment?api_type=json&text=foobar&thing_id=' + parentId, headers : { 'User-Agent' : 'fooBot/0.1 by USERNAME', 'X-Modhash' : modhash }, methods : 'POST' }; request(options, function (err, res, body) { if (err) { console.log(err); return; } else { // this blows up } }); } 

       

网上收集的解决方案 "使用NodeJs请求模块向Reddit API发表评论"

所以我已经解决了这个问题,虽然不能令我满意。 下面是我在本周末发布的工作版本。 有很多事情我做错了。

  • 正如上面提到的那样,我用胖手指method作为methods
  • 无论出于何种原因,请求的cookiesjar不适合我。 我必须手动处理cookie,如代码所示。
  • api.reddit.com不处理https所以我不得不发送请求发表评论https://en.reddit.com/

我仍然不满意这种方式,因为它通过在URI中限制​​我的消息的长度。 从我的理解,我需要在POSTDATA中的消息,但我一直无法哄请求为我做这件事。

我最初的问题已经解决,但是当我重新访问机器人时,我需要为此打开第二个问题。

 var request = require('request') , argv = require('yargs').argv , modhash , cookie; function login () { var options = { url : 'https://ssl.reddit.com/api/login?api_type=json&user=' + argv.user + '&passwd=' + argv.pass + '&rem=True', headers : { 'User-Agent' : 'fooBot/0.1 by USERNAME', }, method : 'POST' }; request(options, function (err, res, body) { if (err) { console.log('LOGIN ERROR:'); console.log(err.json.errors); return; } else { var parsedBody = JSON.parse(body); modhash = parsedBody.json.data.modhash; cookie = parsedBody.json.data.cookie; } }); } function postComment (parentId) { var text = 'message message message.' , options = { url : 'https://en.reddit.com/api/comment?api_type=json&text=' + encodeURIComponent(text) + '&thing_id=' + parentId, headers : { 'User-Agent' : 'fooBot/0.1 by USERNAME', 'X-Modhash' : modhash, 'Cookie' : 'reddit_session=' + encodeURIComponent(cookie) }, method : 'POST' }; request(options, function (err, res, body) { if (err) { console.log('COMMENT POST ERROR:'); console.log(err.stack); return; } else { console.log('// ------ //'); console.log(body); console.log('// ------ //'); } }); }