Не получается обойти каптчу

168
28 октября 2019, 22:10

Хочу получить результаты из формы на странице https://rosreestr.ru/wps/portal/p/cc_ib_portal_services/online_request/

Там есть каптча. Ее получил. Так же получил код из url который генирируется. Сделал запись куки. Получаю каптчу парсером, ввожу ее - но в итоге отвечает что каптча не варная.

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

Привожу свой код, который можно воспроизвести, только нужно будет подключить библиотеку HTML DOM PARSER:

session_start();
require_once __DIR__ . '/simple_html_dom_parser.php';
if (!$_GET) {
    $url = 'https://rosreestr.ru/wps/portal/p/cc_ib_portal_services/online_request/';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url); // отправляем на 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"); 
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвратить то что вернул сервер
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // следовать за редиректами
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// просто отключаем проверку сертификата 
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/my_cookies.txt'); // сохранять куки в файл
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/my_cookies.txt');
    $content = curl_exec($ch);
    preg_match_all('/^Content-Location:(.*)$/mi', $content, $matches);
    if (!empty($matches[1])) {  $realUrl = trim($matches[1][0]); }else{ exit('No real url'); }
    $findCaptcha = str_get_html($content);
    $img = $findCaptcha->find('tr td #captchaImage2');

    $urlCaptcha = $img[0]->src;
    $key = str_replace(array('p0/', '=NJcaptcha=/'), '', $urlCaptcha);
    $goToCaptcha = 'https://rosreestr.ru'.$realUrl.$urlCaptcha;
    $dopUrlForm = '=MEcontroller!QCPSearchAction==/';
    $formToUrl = explode('/', $realUrl);
    array_splice($formToUrl, 10);
    $goFormTo = 'https://rosreestr.ru'.implode('/', $formToUrl).'/p0/'.$key.$dopUrlForm;
    echo "<img src='".$goToCaptcha."'>";
    echo "<form method='get'><input type='text' name='captcha'><input type='submit' value='go'></form>";
    $_SESSION['referer'] = 'https://rosreestr.ru'.$realUrl;
    $_SESSION['form'] = $goFormTo;
}else{
    $post = 'search_action=true&subject=&region=&settlement=&cad_num=&start_position=59&obj_num=&old_number=&search_type=ADDRESS&subject_id=120000000000&region_id=120401000000&street_type=str0&street=&house=54%2F5&building=&structure=&apartment=&right_reg=&encumbrance_reg=&captchaText='.$_GET['captcha'];
    $ch1 = curl_init();
    curl_setopt($ch1, CURLOPT_URL, $_SESSION['form']);
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/my_cookies.txt'); // сохранять куки в файл
    curl_setopt($ch1, CURLOPT_COOKIEFILE, dirname(__FILE__).'/my_cookies.txt');
    curl_setopt($ch1, CURLOPT_POST, 1);
    curl_setopt($ch1, CURLOPT_POSTFIELDS, $post);
    curl_setopt($ch1, CURLOPT_REFERER, $_SESSION['referer']);
    curl_setopt($ch1, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"); 
    curl_setopt($ch1, CURLOPT_HEADER, array('Host: rosreestr.ru', 'Origin: https://rosreestr.ru', 'Upgrade-Insecure-Requests: 1'));
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, false);

    $data = curl_exec($ch1);
    echo $data;

}

Буду благодарен за помощь!

Answer 1

Насколько я понял, Ваш код работать в приведенном виде вообще не сможет:

$goFormTo = 'https://rosreestr.ru'.implode('/', $formToUrl).'/p0/'.$key.$dopUrlForm;

должно быть заменено на

$goFormTo = 'https://rosreestr.ru/'.implode('/', $formToUrl).'/p0/'.$key.$dopUrlForm;
//                               ^


А в остальном, всё вполне работает из командной строки, в том числе и с несколько упрощенными параметрами:

  • получаем начальную форму
    curl -b cookies.txt -c cookies.txt -i -o index.html https://rosreestr.ru/wps/portal/p/cc_ib_portal_services/online_request/
  • ищем в index.html заголовок Content-Location
  • ищем в index.html линк каптчи по строке captchaImage2
  • проводим манипуляции со строками, как описано в PHP коде вопроса
  • получаем картинку каптчи
    curl -b cookies.txt -c cookies.txt -o captcha.png https://rosreestr.ru/wps/portal/p/cc_ib_portal_services/online_request/!ut/p/z1/04_Sj9CPykssy0xPLMnMz0vMAfIjo8zi3QNNXA2dTQy93QMNzQ0cPR29DY0N3Q0MQkz1w_Eq8DfUj6JEP1ABSL8BDuBoANQfhdcKZyMCCkBOJGRJQW5ohEGmpyIAKLXudw!!/dz/d5/L2dBISEvZ0FBIS9nQSEh/p0/IZ7_01HA1A42KODT90AR30VLN22001=CZ6_GQ4E1C41KGQ170AIAK131G00T5=NJcaptcha=
  • распознаем каптчу в файле captcha.png
  • формируем запрос на данные (не забывая прописать правильную каптчу)
    curl -b cookies.txt -c cookies.txt -o reply.html -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "search_action=true&subject=&region=&settlement=&cad_num=&start_position=59&obj_num=&old_number=&search_type=ADDRESS&subject_id=145000000000&region_id=145263000000&street_type=str0&street=&house=&building=&structure=&apartment=&right_reg=&encumbrance_reg=&captchaText=53649" https://rosreestr.ru/wps/portal/p/cc_ib_portal_services/online_request/!ut/p/z1/04_Sj9CPykssy0xPLMnMz0vMAfIjo8zi3QNNXA2dTQy93QMNzQ0cPR29DY0N3Q0MQkz1w_Eq8DfUj6JEP1ABSL8BDuBoANQfhdcKZyMCCkBOJGRJQW5ohEGmpyIAKLXudw!!/p0/IZ7_01HA1A42KODT90AR30VLN22001=CZ6_GQ4E1C41KGQ170AIAK131G00T5=MEcontroller!QCPSearchAction==/
  • получаем результат в reply.html
READ ALSO
Генерация hash MCRYPT на nodejs для payeer

Генерация hash MCRYPT на nodejs для payeer

Подскажите как можно сделать такой hash на nodejs

130
Массив данных в базу данных php

Массив данных в базу данных php

у меня есть массив

137
Абстракция в контроллерах

Абстракция в контроллерах

Экспериментирую с созданием сайта-каталога с админ панелью на laravel 58

136
Как найти и выбрать элементы коллекции,используя методы map и search?

Как найти и выбрать элементы коллекции,используя методы map и search?

Получена коллекция с помощью модели eloquent:

122