За последние 24 часа нас посетил 26941 программист и 2042 робота. Сейчас ищут 1086 программистов ...

JavaScript class captchaCV

Тема в разделе "JavaScript и AJAX", создана пользователем Vladimir Kheifets, 5 мар 2025.

Метки:
  1. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Класс captchaCV создаёт captcha и проверяет введённой код.
    https://github.com/VladimirKheifets/JS-Class-captchaCV
    Демо:
    https://www.alto-booking.com/developer/captchaCV
    https://www.alto-booking.com/developer/captchaCV//?la=de
    https://www.alto-booking.com/developer/captchaCV/?la=ru
    Пимер:
    HTML:
    1. <link rel="stylesheet" href="captchaCV.css">
    2. <script src="captchaCV.min.js"></script>
    3. <script src="index.js"></script>
    4. </head>
    5. <div id="captcha"></div>
    6. <br>
    7. <button type="submit">Senden</button>
    8. </form>
    9. </body>
    10. </html>
    index.js
    Код (Javascript):
    1. window.addEventListener("load", () => {
    2.   let myCaptha = new captchaCV("captcha");
    3.   document.forms[0].addEventListener('submit', function(e){
    4.     e.preventDefault();
    5.     alert(myCaptha.verification());
    6.    });
    7. });
    captchaCV.css
    Код (CSS):
    1. #captcha{
    2.   display:table;
    3. }
    4.  
    5. #captcha div{
    6.   display:table-cell;
    7.   vertical-align:middle;
    8.   text-align:center;
    9.   min-width:30px;
    10. }
    11.  
    12. #captcha span{
    13.   font-size: 25px;
    14.   cursor:pointer;
    15.   transform: rotate(0);
    16.   margin: 0 0 0 0;
    17.   position: relative;
    18.   display:inline-block;
    19.   line-height:30px;
    20. }
    21.  
    22. #captcha span::before
    23. {
    24.   content:"\1F5D8";
    25. }
    26.  
    27. #captcha span:hover{
    28.    animation: rotate 2s linear infinite;
    29. }
    30.  
    31. @keyframes rotate {
    32.   100% {
    33.     transform: rotate(720deg);
    34.   }
    35. }
    36.  
    37. #captcha canvas{
    38.   border: 1px solid #cccccc;
    39. }
    40.  
    41. #captcha input{
    42.   height: 30px;
    43.   width: 200px;
    44. }
     
    artoodetoo нравится это.
  2. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Ну красиво, да.
    Только два момента:
    1. На GitHub обычно выкладывают исходник, а не минифицированную версию.
    2. Каптчу валидоровать на бэкенде нужно. Если эта библиотека только для рисования каптчи -- то не плохо бы уметь рисовать переданную строку.
     
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Добрый день!
    Принципально то, что эта капча создаётся и проверяется на фронтенде
    Если Вы внимательно посмотрите описание и примеры, то увидите, что у класса есть два метода:
    create и valdation.
    Метод create вызывается из конструктора, а метод valdation из обработчика события submit,
    Удачи!
     
    #3 Vladimir Kheifets, 6 мар 2025
    Последнее редактирование: 6 мар 2025
  4. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Какие области применения такой капчи? От чего она защищает, от человека? :)

    То есть это просто визуальный элемент, который можно использовать только в клиентских приложениях (со всеми вытекающими)?
     
    #4 brevis, 6 мар 2025
    Последнее редактирование: 6 мар 2025
    don.bidon нравится это.
  5. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Область применения такая же как и у любой капчи. Защита от человека.
    Попробуйте вставить эту капчу и отправить на сервер, например, контактный формуляр.
    Показать как?
    Можете ради интереса попробовать взломать код этой капчи, не человеком, а хакнуть программно.
    Может быть Вы считате, что необходимо обязательно использоаать гдлиб и рисовать на PHP?
     
    #5 Vladimir Kheifets, 6 мар 2025
    Последнее редактирование: 6 мар 2025
  6. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    1. Я вас, видимо, удивлю, но капча обычно применяется для зашиты от роботов ("для различения компьютеров и людей").
    2. Отправить на сервер, например, контактный формуляр, эта капча вообще никак не препятствует. Отправка на сервер, например, контактного формуляра -- это просто http-запрос.

    3. Рисовать можно как угодно. Валидировать нужно на сервере.
     
  7. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Допустим, запускаем робота на эту капчу
    PHP:
    1. <?PHP
    2. echo htmlentities(file_get_contents("https://www.alto-booking.com/developer/captchaCV"));
    3. /*
    4. <html> <head> <!-- https://www.alto-booking.com/developer/captchaCV/?la=ru --> <link rel="stylesheet" href="captchaCV.css"> <script src="captchaCV.min.js"></script> <script src="index.js"></script> </head> <body> <form> <div id="captcha"></div> <br> <button type="submit">Senden</button> </form> </body> </html>
    5. */
    6.  
    7. echo "<br>";
    8. echo htmlentities(file_get_contents("https://www.alto-booking.com/developer/captchaCV/index.js"));
    9. /*
    10. URL(window.location.href); var la = url.searchParams.get("la"); if(!la) la = "en"; if(data.dictionary[la]) dS = data.dictionary[la]; else dS = data.dictionary["en"]; //------------------------------------------------------- let myCaptha = new captchaCV("captcha", dS["placeH"]); document.forms[0].addEventListener('submit', function(e){ e.preventDefault(); err = myCaptha.verification(); alert(`${dS["msg0"]} ${dS["msg"][err]}!`); }); }); });
    11. */
    Сможет робот найти код, который требуется ввести в капчу?
    А DOM-элементы капчи найдёт робот?
    Так показать Вам как встроить эту капчу в контактный формуляр?
    Мы ж не ядерной физикой занимаемся, проверяется всё очень просто.
    Без синхрофазатронов.
     
    #7 Vladimir Kheifets, 6 мар 2025
    Последнее редактирование: 6 мар 2025
  8. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Вы, очевидно, не понимаете сути.
    Роботу вообще не нужно вводить никакие коды, если используется такая капча.
    Да и человек может легко ее обойти, вот демонстрация: https://www.youtube.com/shorts/KvuICzuuXgU
    Удачи! :)
     
  9. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Добрый день!
    Я подключил капчу к простенькому контактному формуляру.
    Вот демонстрация:
    https://www.alto-booking.com/developer/captchaCV/feedback/
    Легко обошли?
    Удачи!
     
  10. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Да:
    Код (Text):
    1. curl 'https://www.alto-booking.com/developer/captchaCV/feedback/' \
    2.   -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary86N2BnvskAqtD6al' \
    3.   --data-raw $'------WebKitFormBoundary86N2BnvskAqtD6al\r\nContent-Disposition: form-data; name="name"\r\n\r\ntest\r\n------WebKitFormBoundary86N2BnvskAqtD6al\r\nContent-Disposition: form-data; name="email"\r\n\r\ntest@test\r\n------WebKitFormBoundary86N2BnvskAqtD6al\r\nContent-Disposition: form-data; name="message"\r\n\r\ntest\r\n------WebKitFormBoundary86N2BnvskAqtD6al--\r\n'
     
  11. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Добрый день!
    Простите, Вы не обошли капчу, а открыли для себя HTML-код формуля. Это можно было сделать ещё легче
    и читабельнее из консоли браузера.
    HTML:
    1. <link rel="stylesheet" href="captchaCV.css">
    2. <script src="captchaCV.min.js"></script>
    3. <script src="index.js"></script>
    4. input[name='name'],input[name='email'],textarea{
    5.     display: block;
    6.     width: 380px;
    7.     margin: 10 0 10 0;
    8.     padding: 3px;
    9.     font-size: 16px;
    10. }
    11. body > div + div{
    12.     font-family: arial;
    13.     font-size: 20px;
    14.     padding-top: 30px
    15. }
    16. </head>
    17. <div align=center>
    18. <input type="text" name="name" type="text" placeholder="name" required>
    19. <input type="email" name="email" placeholder="email" required>
    20. <textarea name="message" placeholder="message"  required></textarea>
    21. <div id="captcha"></div>
    22. <br>
    23. <button type="submit">Senden</button>
    24. </form>
    25. </div>
    26. <div align=center></div>
    27. </body>
    28. </html>
    Также в браузере Вы можете легко увидеть и перезаписать JS.
    Вы писали, что можете легко отправить feedback не вводя капчу.
    Покажите, пожалуйста, сообщение, с сервере подтверждаюшее отправку с обходом капчи.
    Удачи!
     
  12. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Перечитайте ещё раз (или столько, сколько вам необходимо) мои сообщения.
    Я лишь повторю ещё один раз (надеюсь на понимание): ваша капча никак не препятствует роботу отправить спам.
    На этом моя участь окончена, я сделал все, что мог.
    Удачи, она вам точно понадобится :)

    Если нажмете на ссылку под словом "Да" в моём сообщении -- увидите.
    Если не открывается -- вот скриншот https://ibb.co/ffVqpK3
     
    #12 brevis, 8 мар 2025 в 07:59
    Последнее редактирование: 8 мар 2025 в 08:07
  13. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    P.S. Строгость вашей капчи компенсируется необязательностью вводить код :)
     
  14. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Простите, что надоедаю Вам, но хотелось бы узнать как Вы это сделали.
    Дело в том, что валидация кода капчи происходит на сервере перед отправкой.
    Здесь была ошибка
    PHP:
    1. if($_SESSION["cc"] ==$_SESSION["cv"])
    2.   {
    3.   $res["err"]=0;
    4.   $res["msg"] = $m1;
    5.   $res["msg"] .= ".<br>Your message has been sent successfully.";
    6.   $res["msg"] .= "<br>We will contact you promptly.";
    7. ...
    8.   }
    Изменил на
    PHP:
    1. if(isset($_SESSION["cc"]) && isset($_SESSION["cv"]) && $_SESSION["cc"] == $_SESSION["cv"])
     
    #14 Vladimir Kheifets, 8 мар 2025 в 13:42
    Последнее редактирование: 8 мар 2025 в 13:47
  15. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Если у вас все же есть валидация на сервере -- это правильный путь.
    Только есть вопросы к релизации: откуда берутся параметры в сессии.
    И почему-то сейчас все время ответ такой:
    Thank you for your feedback.
    Unfortunately your message was not sent.
    Please try again later again
     
    Vladimir Kheifets нравится это.
  16. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Прежде всего хочу Вас поблагодарить за внимание, которое Вы уделили этой теме.

    Данные на сервер отправляются из класса через fetch JSON-request.
    Валидация происходит и на стороне клиента и на сервере.
    Если сравнение введённого кода на стороне клиента выполняется успешно,
    то на сервер отправляется fetch POST-request
    Проверка кода на на сервере блокирует взлом.
    При этом выдаётся это сообщение.
    Если Вы на странице введёте данные и код капчи, то
    формуляр закроется и выйдет нормальное сообщение.
     
    #16 Vladimir Kheifets, 8 мар 2025 в 18:06
    Последнее редактирование: 8 мар 2025 в 18:14
  17. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Я добрался до ноутбука и смог посмотреть детальнее.
    К сожалению, такая реализация не обеспечивает необходимой функциональности.

    Клиент просит бэкенд сгенерировать капчу и она возвращается в отрытом виде:
    Код (Text):
    1. curl -X POST -d '{"nChars": 6}' https://www.alto-booking.com/developer/captchaCV/feedback/
    2. {"randomChars":["I",6,"Y","K",4,"A"],"rightCode":"i6yk4a"}
    За пару запросов ChatGPT помог мне быстро собрать робота:
    PHP:
    1. <?php
    2. // Функция для извлечения кук из заголовков ответа
    3. function extractCookies($header) {
    4.     $cookies = [];
    5.     // Разбиваем заголовок по строкам
    6.     $lines = explode("\r\n", $header);
    7.     foreach ($lines as $line) {
    8.         if (preg_match('/^Set-Cookie:\s*([^;]+)/i', $line, $matches)) {
    9.             $cookies[] = $matches[1];
    10.         }
    11.     }
    12.     // Собираем куки в одну строку для заголовка Cookie
    13.     return implode('; ', $cookies);
    14. }
    15. $url = 'https://www.alto-booking.com/developer/captchaCV/feedback/';
    16. // 1. Отправляем GET-запрос и получаем заголовки вместе с телом ответа
    17. $ch = curl_init($url);
    18. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    19. curl_setopt($ch, CURLOPT_HEADER, true);
    20. $response = curl_exec($ch);
    21. // Определяем размер заголовка для разделения заголовков и тела
    22. $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    23. $header = substr($response, 0, $header_size);
    24. $body = substr($response, $header_size);
    25. // Извлекаем куки из заголовков
    26. $cookies = extractCookies($header);
    27. // Функция для выполнения POST-запроса с заданными данными
    28. function doPost($url, $postData, $cookies = '') {
    29.     $ch = curl_init($url);
    30.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    31.     curl_setopt($ch, CURLOPT_POST, true);
    32.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
    33.         'Cookie: ' . $cookies
    34.     ]);
    35.     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    36.     $response = curl_exec($ch);
    37.     curl_close($ch);
    38.     return $response;
    39. }
    40.  
    41. // 2. POST-запрос с запросом капчи
    42. $captcha = json_decode(doPost($url, json_encode(['nChars' => 6]), $cookies), true);
    43. // 3. POST-запрос с капчей
    44. doPost($url.'?', json_encode(['cv' => $captcha['rightCode']]), $cookies);
    45. // 4. POST-запрос с данными формы
    46. echo doPost($url, ['name' => 'test', 'email' => 'test@test', 'message' => 'test'], $cookies);
    Результат работы: https://ibb.co/cKJ89YqF
     
  18. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Добрый день!
    Большое спасибо за повощь в дороботке.
    Я проверял изменения внесённый в код и Вы выявили их узвимость.
    Вернул предыдущую версию. Ваш робот выдаёт
     
  19. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Теперь стало еще хуже: роботу теперь достаточно просто отправить два http запроса (cc и cv) с любым кодом:
    PHP:
    1. // 3. POST-запрос с капчей
    2. doPost($url.'?', json_encode(['cc' => '111111']), $cookies);
    3. // 4. POST-запрос с капчей
    4. doPost($url.'?', json_encode(['cv' => '111111']), $cookies);
    Полный код робота:
    PHP:
    1. <?php
    2. // Функция для извлечения кук из заголовков ответа
    3. function extractCookies($header) {
    4.     $cookies = [];
    5.     // Разбиваем заголовок по строкам
    6.     $lines = explode("\r\n", $header);
    7.     foreach ($lines as $line) {
    8.         if (preg_match('/^Set-Cookie:\s*([^;]+)/i', $line, $matches)) {
    9.             $cookies[] = $matches[1];
    10.         }
    11.     }
    12.     // Собираем куки в одну строку для заголовка Cookie
    13.     return implode('; ', $cookies);
    14. }
    15. $url = 'https://www.alto-booking.com/developer/captchaCV/feedback/';
    16. // 1. GET-запрос и получаем заголовки вместе с телом ответа
    17. $ch = curl_init($url);
    18. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    19. curl_setopt($ch, CURLOPT_HEADER, true);
    20. $response = curl_exec($ch);
    21. // Определяем размер заголовка для разделения заголовков и тела
    22. $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    23. $header = substr($response, 0, $header_size);
    24. $body = substr($response, $header_size);
    25. // Извлекаем куки из заголовков
    26. $cookies = extractCookies($header);
    27. // Функция для выполнения POST-запроса с заданными данными
    28. function doPost($url, $postData, $cookies = '') {
    29.     $ch = curl_init($url);
    30.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    31.     curl_setopt($ch, CURLOPT_POST, true);  
    32.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
    33.         'Cookie: ' . $cookies
    34.     ]);
    35.     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    36.     $response = curl_exec($ch);
    37.     curl_close($ch);
    38.     return $response;
    39. }
    40. // 2. POST-запрос с запросом капчи
    41. json_decode(doPost($url, json_encode(['nChars' => 6]), $cookies), true);
    42. // 3. POST-запрос с капчей
    43. doPost($url.'?', json_encode(['cc' => '111111']), $cookies);
    44. // 4. POST-запрос с капчей
    45. doPost($url.'?', json_encode(['cv' => '111111']), $cookies);
    46. // 5. POST-запрос с данными формы
    47. echo doPost($url, ['name' => 'test', 'email' => 'test@test', 'message' => 'test'], $cookies);
     
  20. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Спасибо. Оба варинта index.php и index2.php, робот не проходит.
     
  21. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Ну я добавил установку user-agent и теперь проходит.
    Код (Text):
    1.  
    2. curl_setopt($ch, CURLOPT_HTTPHEADER, [
    3.     'User-Agent: Robot',
    4. ]);
    Вы "лечите" не то.
    Дело не в конкретном роботе.
    Тут принцип неверен.

    1. Код капчи должен генерироваться только на сервере.
    2. На клиент передаваться должно либо изображение с кодом, либо какие-то опорные данные, по которым можно нарисовать капчу (капчи бывают не только формата ввода кода с изображения). Но ни в коем случае не сам код или любые данные, по которым его можно восстановить.
    3. Ну и с клиента код не должен устанавливаться (cc и cv).
     
  22. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Это была временная заглушка, но по хошему в curl нужно имитировать браузер.
    Я про cc и cv понял поэтому сделал вариант2,
    Работаю дальше. За Ваш робот ещё раз спасибо.
    Пригодится для тестирования.
     
    #22 Vladimir Kheifets, 10 мар 2025 в 14:20
    Последнее редактирование: 10 мар 2025 в 14:27
  23. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.862
    Симпатии:
    752
    Адрес:
    Татарстан
    по хорошему нужно делать как пишет вам @brevis
    формировать изображение капчи на сервере..... клиент не должен знать его в открытом или другом виде
    ну и соответственно потом проверять так-же на сервере
     
  24. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    477
    Симпатии:
    93
    Адрес:
    Бавария, Германия
    Добрый день!
    Большое спасибо! Я акцептировал все замечания, доработал код
    и протестировал роботом разработанным коллегой brevis
    Актуальный результат

    PHP:
    1. (
    2.     [cc] => grkZ_w
    3. )
    4. (
    5.     [err] => 1
    6.     [msg] => Thank you for your feedbackThank you for your feedback.
    7. Unfortunately your message was not sent.
    8. Please try again later again
    9. )
    Робот
    PHP:
    1. <?php
    2. // Функция для извлечения кук из заголовков ответа
    3. function extractCookies($header) {
    4.     $cookies = [];
    5.     // Разбиваем заголовок по строкам
    6.     $lines = explode("\r\n", $header);
    7.     foreach ($lines as $line) {
    8.         if (preg_match('/^Set-Cookie:\s*([^;]+)/i', $line, $matches)) {
    9.             $cookies[] = $matches[1];
    10.         }
    11.     }
    12.     // Собираем куки в одну строку для заголовка Cookie
    13.     return implode('; ', $cookies);
    14. }
    15. $url = 'https://www.alto-booking.com/developer/captchaCV/feedback/index.php';
    16. // 1. Отправляем GET-запрос и получаем заголовки вместе с телом ответа
    17. $ch = curl_init($url);
    18. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    19. curl_setopt($ch, CURLOPT_HEADER, true);
    20. $response = curl_exec($ch);
    21.  
    22. // Определяем размер заголовка для разделения заголовков и тела
    23. $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    24. $header = substr($response, 0, $header_size);
    25. $body = substr($response, $header_size);
    26. // Извлекаем куки из заголовков
    27. $cookies = extractCookies($header);
    28. // Функция для выполнения POST-запроса с заданными данными
    29. function doPost($url, $postData, $cookies = '') {
    30.     $ch = curl_init($url);
    31.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    32.     curl_setopt($ch, CURLOPT_POST, true);
    33.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
    34.         'Cookie: ' . $cookies
    35.     ]);
    36.     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    37.     $response = curl_exec($ch);
    38.     curl_close($ch);
    39.     return $response;
    40. }
    41.  
    42. // 2. POST-запрос с запросом капчи
    43. $captcha = json_decode(doPost($url, json_encode(['nChars' => 6]), $cookies), true);
    44. echo "<pre>";
    45. print_r($captcha);
    46. // 3. POST-запрос с капчей
    47. doPost($url.'?', json_encode(['cv' => $captcha['cc']]), $cookies);
    48. // 4. POST-запрос с данными формы
    49. print_r(json_decode(doPost($url, ['name' => 'test', 'email' => 'test@test', 'message' => 'test'], $cookies),true));
     
  25. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    84
    Симпатии:
    22
    Вы делаете ерунду.
    Либо вы действительно не понимаете, либо намеренно зачем-то убеждаете себя, что делаете не ерунду.
    Кодирование на клиенте никак не поможет. Добавляем одну функцию и робот опять работает:
    PHP:
    1. <?php
    2. // Функция для извлечения кук из заголовков ответа
    3. function extractCookies($header) {
    4.     $cookies = [];
    5.     // Разбиваем заголовок по строкам
    6.     $lines = explode("\r\n", $header);
    7.     foreach ($lines as $line) {
    8.         if (preg_match('/^Set-Cookie:\s*([^;]+)/i', $line, $matches)) {
    9.             $cookies[] = $matches[1];
    10.         }
    11.     }
    12.     // Собираем куки в одну строку для заголовка Cookie
    13.     return implode('; ', $cookies);
    14. }
    15. function dec($strIn) {
    16.     $A = str_split("V2SMJNZHD9KF4I6E13OW8LPBTAQCX5Y7GUR");
    17.     $outStr = [];
    18.     $arr = str_split($strIn);
    19.     foreach ($arr as $value) {
    20.         $index = ord($value) - 90;
    21.         $outStr[] = $A[$index];
    22.     }
    23.     return implode('', $outStr);
    24. }
    25. $url = 'https://www.alto-booking.com/developer/captchaCV/feedback/index.php';
    26. // 1. Отправляем GET-запрос и получаем заголовки вместе с телом ответа
    27. $ch = curl_init($url);
    28. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    29. curl_setopt($ch, CURLOPT_HEADER, true);
    30. curl_setopt($ch, CURLOPT_HTTPHEADER, [
    31.     'User-Agent: Robot',
    32. ]);
    33. $response = curl_exec($ch);
    34. // Определяем размер заголовка для разделения заголовков и тела
    35. $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    36. $header = substr($response, 0, $header_size);
    37. $body = substr($response, $header_size);
    38. // Извлекаем куки из заголовков
    39. $cookies = extractCookies($header);
    40. // Функция для выполнения POST-запроса с заданными данными
    41. function doPost($url, $postData, $cookies = '') {
    42.     $ch = curl_init($url);
    43.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    44.     curl_setopt($ch, CURLOPT_POST, true);
    45.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
    46.         'Cookie: ' . $cookies,
    47.         'User-Agent: Robot',
    48.     ]);
    49.     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    50.     $response = curl_exec($ch);
    51.     curl_close($ch);
    52.     return $response;
    53. }
    54. // 2. POST-запрос с запросом капчи
    55. $captcha = json_decode(doPost($url, json_encode(['nChars' => 6]), $cookies), true);
    56. // 3. POST-запрос с капчей
    57. doPost($url.'?', json_encode(['cv' => strtolower(dec($captcha['cc']))]), $cookies);
    58. // 4. POST-запрос с данными формы
    59. print_r(json_decode(doPost($url, ['name' => 'test', 'email' => 'test@test', 'message' => 'test'], $cookies),true));