Соскоб веб-страницы Nodejs с помощью файла cookie аутентификации

В последнее время я пытаюсь собрать информацию с веб-сайта (kicktipp), используя Nodejs, модуль запроса и cheerio. Поскольку этот сайт требует аутентификации для просмотра большинства его сайтов, я попытался войти в систему с помощью почтового запроса и проверить, вошел ли пользователь в систему, используя следующий код (я заменил учетные данные фиктивными данными, но я использую реальные данные в своем реальном скрипте ):

var request = require('request');
var jar = request.jar();
var request = request.defaults({
  jar: jar,
  followAllRedirects: true
});
var jar = request.jar();
var cheerio = require('cheerio');

request.post({
    url: 'http://www.kicktipp.de/info/profil/loginaction',
    headers: { 'content-type': 'application/x-www-form-urlencoded' },
    method: 'post',
    jar: jar,
    body: '[email protected]&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden'
}, function(err, res, body){
  if(err) {
    return console.error(err);
  };

  request.get({
    url: 'http://www.kicktipp.de/',
    method: 'get',
    jar: jar
  }, function(err, res, body) {
    if(err) {
      return console.error(err);
    };

    var $ = cheerio.load(body);
    var text = $('.dropdownbox > li > a').text();
    console.log(text);
    var error = $('#kicktipp-content > div.messagebox.errors > p').text();
    console.log(error);
    var cookies = jar.getCookies('http://www.kicktipp.de/');
    console.log(cookies);
  });
});

Параметры, отправляемые html-формой (проверенные браузером), выглядят так:

[email protected]&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden

С этим скриптом мой cookie jar выглядит так:

[ Cookie="JSESSIONID=F650D7F5CD6AF4F6B0944B2190EE2D29.kt213; Path=/; hostOnly=true; aAge=1ms; cAge=179ms" ]

JSESSIONID успешно сохранен, но сервер не будет зарегистрирован, так как console.log(text) печатает Login, но он должен печатать Logout, если пользователь правильно вошел в систему.

После проверки запроса на вход в браузере я обнаружил, что браузер получает новый файл cookie каждый раз, когда страница в этом домене запрашивается через set-cookie в заголовке ответа, например:

Set-Cookie: login=bS5zcGxpZXRob2V2ZXJAZ21haWwuY29tOjE0NzU0MDA3MjAxMjA6Mzg1NTI4OGY3ODgzN2FkMzllNTA0NWNkY2ZjMjBjZGM; Domain=.kicktipp.de; Expires=Sun, 02-Oct-2016 09:32:00 GMT; Path=/; HttpOnly

Однако я не могу (или просто не знаю, как) получить этот файл cookie в моей банке запросов и, следовательно, посетить страницу как вошедший в систему пользователь.

Есть ли что-то, чего мне здесь не хватает, чтобы оставаться в системе (или вообще входить на страницу)? Заранее спасибо.


person mspl    schedule 03.10.2015    source источник
comment
Я пробовал вышеуказанное решение. Он отлично работает для моего первого веб-сайта, где токен CSRF не используется, но не работает для моего второго веб-сайта, где используется токен CSRF. Он дает мне код ответа 500. Ниже приведены шаги, которые я реализовал в коде. Получите токен CSRF, используя метод get в первом квесте. Прошел то же самое с методом POST, но он не работает. Пожалуйста, предложите.   -  person pratik    schedule 09.01.2020


Ответы (1)


Проблема в том, что этой странице, похоже, нужен определенный файл cookie, который вы получаете при первом посещении страницы (в данном случае это файл cookie часового пояса). Чтобы получить этот файл cookie, вам просто нужно посетить страницу (используя запрос GET) перед отправкой запроса на вход (POST) на сервер. В этом случае это так же просто, как обернуть код выше другим запросом GET:

var loginLink = 'http://www.kicktipp.de/info/profil/login';

// creating a clean jar
var j = request.jar();

request.get({url: loginLink, jar: j}, function(err, httpResponse, html) {
  // place POST request and rest of the code here
});
person mspl    schedule 04.09.2016