Интерес чисто академический и касается он только простой капчи «кликните на домик|ключик|жука» (
SimpleCapcha). Распознавать картинку не нужно, даже считать ничего не нужно. Нужно в одной сессии сграбить страницу, получить желаемый код-ответ, и отправить этот ответ вместе с данными методом POST. Такое вообще возможно?
Я попробовал реализовать. Сначала взял питон и селениум, но так и не смог завести последний + он требует что бы браузер стоял на сервере и иксы (можно заменить xfvb).
Потом наткнулся на phantomjs. Вот тут уже получилось сграбить код-ответ, но вот отправлять его не получается.
var page = require('webpage').create();
var url = 'http://localhost.dev/registration';
var capcha_result = '';
page.onResourceReceived = function() {
// Этот метод срабатывает во время загрузки страницы.
// Загрузка обычно идёт чанками поэтому нужно проверять на null
page.evaluate(function(){
var capcha_name = document.querySelector('span.captchaText'); // получили текст того на что нужно кликнуть, например "жука"
if(capcha_name!=null) {
if(capcha_name.innerText) {
var capcha = document.querySelector('img[title='+capcha_name.innerText+']'); // определили хэш ответа, то бишь то что нужно отправить на сервер
capcha_result = capcha.id;
console.log('capcha_answer='+capcha_result);
}
}
});
};
page.onLoadStarted = function() {
console.log("load started");
};
page.onLoadFinished = function() {
console.log("load finished");
};
var data = 'nickname=phantom&pass=123456789&pass2=123456789&email=asdasdf@sadasd.ru&do=register&save=Регистрация&login=phantom&code='+capcha_result;
page.open(url, 'post', data, function (status) {
if (status !== 'success') {
console.log('Unable to post!');
} else {
console.log('Data posted!');
}
});
И вот казалось бы всё готово, но page.evaluate запускается в «песочнице» и он не может влиять на переменные скрипта. Или я ошибаюсь и можно из page.evaluate записать глобальную переменную?