Публикация комментария к API Reddit с модулем запроса NodeJs

Итак, я создаю довольно глупого бота для коллеги Redditor. И для этого нужно войти в систему, а затем оставить комментарий. Документация Reddit довольно скудна, ИМХО, поэтому я надеюсь, что кто-то может показать мне, где я ошибаюсь.

Насколько я понимаю, мне нужно публиковать на https://ssl.reddit.com/api/login, извлеките файл cookie, а затем отправьте этот файл cookie вместе с предоставленным модхэшем на https://api.reddit.com/api/comment. Но я продолжаю получать 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
    }
  });
}

person joeLepper    schedule 08.02.2014    source источник
comment
Вы поняли это?   -  person fulvio    schedule 13.02.2014
comment
ваш метод postComment(); имеет methods: 'POST', и он должен быть method: 'POST' (т. е. method, а не methods).   -  person fulvio    schedule 13.02.2014
comment
Ага. Я решил эту проблему и ряд других. Я собираюсь пойти дальше и добавить ответ.   -  person joeLepper    schedule 14.02.2014


Ответы (1)


Так что я решил проблему, хотя и не к моему удовлетворению. Ниже приведена рабочая версия того, что я опубликовал в эти выходные. Был ряд вещей, которые я делал неправильно.

  • Как заметил gotnull выше, у меня были толстые пальцы method как methods.
  • По какой-то причине файл cookie запроса не работал у меня. Мне пришлось обрабатывать файл 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('// ------ //');
    }
  });
}
person joeLepper    schedule 14.02.2014