Подтвердить что ты не робот

Phantomjs - Cookie не отправляется ни на какие запросы XHR/POST/GET AJAX

Я нашел интересную проблему при попытке входа в систему с помощью PhantomJS. Я не понимаю, почему это происходит на самом деле.

В основном вы запускаете удаленный отладчик, например:

/usr/local/bin/phantomjs --web-security=no --remote-debugger-port=13379 --remote-debugger-autorun=yes /tmp/test.js 

В удаленном отладчике:

> location.href = "https://www.mysite.com/login"
> $('input[name="username_or_email"]').val('[email protected]')
> $('input[name="password"]').val('wrongpassword')

> $('button[type="submit"]').submit()

Выполнение этого в Chrome даст мне правильное сообщение "неправильного пароля" после запроса XHR, тогда как использование phantomjs дает мне общую ошибку, поскольку cookie не отправляется с phantomjs (я рассмотрел заголовки).

Я очень смущен тем, почему phantomjs не отправляет cookie с запросом POST. Кто-нибудь знает, как мы можем получить phantomjs для отправки cookie с ВСЕМИ запросами, как и должно быть? Настройка файла cookie также не имеет никакого значения.

4b9b3361

Ответ 1

Хорошо, это похоже на то, что связано с сеансовыми файлами cookie, а не с обычными кукисами.

Это огромный поток разработчиков, отвечающих за функцию cookie фантомов и некоторых парней с той же проблемой, что и ваша.

https://groups.google.com/forum/#!msg/phantomjs/2UbPkIibnDg/JLV9jBKxhIQJ

Если вы не хотите задерживать весь файл, в основном: Phantomjs ведет себя как обычный браузер и удаляет все куки сессии, когда браузер закрывается, в вашем случае, когда заканчивается выполнение script.

Таким образом, даже если вы установите параметр - cookies-file =/path/to/cookies.txt, вы будете хранить только обычные куки файлы на нем, для выполнения субсекументов.

Для вас есть два возможных подхода. Один из них состоит в том, чтобы делать все запросы в пределах одного и того же script, а другой - хранить и восстанавливать файлы cookie вручную.

В потоке есть несколько функций, которые вы можете использовать для этого.

function saveCookies(sessionCookieFile, page) {
    var fs = require("fs");
    fs.write(sessionCookieFile, JSON.stringify(page.cookies));
}

function restoreCookies(sessionCookieFile, page) {
    var fs = require("fs");
    var cookies = fs.read(sessionCookieFile);
    page.cookies = JSON.parse(cookies);
}

var page = require('webpage').create();

И, если все не удается...

Вы можете скачать исходный код и перекомпилировать phantomjs

Вам нужно будет отредактировать src/cookiejar.cpp и удалить или прокомментировать purgeSessionCookies();

Надеюсь, это поможет.