Еренда устроена так: Кодирование и декодирование просходит на сервере. На сервера генерерируется и запоминается закодированная капча и отправляется клиенту. На клиенте капча декодируется для рисования. С клиента отправляется введённая капча и она кодируется на сервере перед валидацией.
(дополнение) Работы отвечают Код (Text): {"err":1,"msg":"Thank you for your feedbackThank you for your feedback. Unfortunately your message was not sent. Please try again later again"}
Оно у вас и из веба сейчас не работает Особенно забавно видеть куски undefined на картинке В любом случае, все, что вы делаете на клиенте, будет скопировано в роботе. И в результате получается Windows Firewall. Удачи!
Добрый день! Вы меня удивили. У Вас выбирается JS из кеш браузера. При тестирование рекомендуется чистить кэш. Так выводится уменя
Да вы тоже всех нас тут, я бы сказал, сказочно (если вы понимание) удивляете Дело не в кеше, а в кривом коде. Вот варианты кода и токена, при которых после декодирования код содержит 5 символов, а должен содержать 6, отсюда и undefined при рисовании: Код (Text): ]OcfRN C7AHISDN2WGQMZFCPL9TRV3OJ6KBEUX851Y4 https://ibb.co/9RZ3JhM А даже если и в кеше, если вы сейчас исправили кривой код, то до того, как я вам о нем сказал вы и не подозревали об этом А еще у вас иногда на клинте проверка проходит (на кнопке Senden), а на сервере нет https://ibb.co/XrRY7LXf Вместо того, чтобы сделать правильно, вы наворотили дичи, в которой сами же и запутались.
Добрый день! 1. После Вашего сообщениия со скриншотом, код не изменялся. Ошибка, котоую Вы показали, могла быть только из-за кэша. 2. Вы написали: код ]OcfRN содержит 5 символов, а должен содержать 6. Однако при вычислении Вы или робот не учли в ]OcfRN, первый символ ] - Closing bracket (135, 5D, 01011101) , с ним получается 6. 3. Про то, что иногда... Я это заметил. Сейчас над этим работаю. Удачи! p.s. Обратите, пожалуйста, внимание на то. что я отвечаю на Ващи сообщения корректно.
Что я написал -- видно в соответствующем сообщении. А написал я следующее: Процитирую вас же: Код (Text): function dec(strIn, token) { let shift = token.substr(0, 1).charCodeAt(0); const A = token.substr(1).split(""); let outStr = []; let arr = strIn.split(""); for (let i in arr) { let value = arr[i]; outStr.push(A[value.charCodeAt(0) - shift]); } return outStr.join(""); } const token = 'C7AHISDN2WGQMZFCPL9TRV3OJ6KBEUX851Y4'; const strIn = ']OcfRN'; // input, 6 chars console.log(dec(strIn, token)); // output, 5 chars https://glot.io/snippets/h5frriiw78
@Vladimir Kheifets, не знаю что вы хотели написать, наверное что робот перестал работать Ну конечно, вы же придумали гениальную защиту: проверять время между запросами То есть просто вызов sleep обходит ваш замок, ключ от которого лежит под ковриком. PHP: <?php // Функция для извлечения кук из заголовков ответа function extractCookies($header) { $cookies = []; // Разбиваем заголовок по строкам $lines = explode("\r\n", $header); foreach ($lines as $line) { if (preg_match('/^Set-Cookie:\s*([^;]+)/i', $line, $matches)) { $cookies[] = $matches[1]; } } // Собираем куки в одну строку для заголовка Cookie return implode('; ', $cookies); } function dec($strIn, $token) { $shift = ord(substr($token, 0, 1)); $A = str_split(substr($token, 1)); $outStr = []; $arr = str_split($strIn); foreach ($arr as $value) { $index = ord($value) - $shift; $outStr[] = $A[$index]; } return implode('', $outStr); } $url = 'https://www.alto-booking.com/developer/captchaCV/feedback/index.php'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Robot', ]); $response = curl_exec($ch); // Определяем размер заголовка для разделения заголовков и тела $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($response, 0, $header_size); $body = substr($response, $header_size); curl_close($ch); // Извлекаем куки из заголовков $cookies = extractCookies($header); echo '[debug] cookies: ' . $cookies . PHP_EOL; // Функция для выполнения POST-запроса с заданными данными function doPost($url, $postData, $cookies = '') { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Cookie: ' . $cookies, 'User-Agent: Robot', ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); //curl_setopt($ch, CURLOPT_VERBOSE, 1); $response = curl_exec($ch); curl_close($ch); return $response; } $captcha = doPost($url, json_encode(['nChars' => 6]), $cookies); echo '[debug] encoded code: ' . $captcha . PHP_EOL; sleep(2); $token = doPost('https://www.alto-booking.com/developer/captchaCV/feedback/js/module/token.js', [], $cookies); preg_match('/\'(.+)\';/', $token, $t); $token = $t[1]; echo '[debug] token: ' . $token . PHP_EOL; sleep(2); $code = strtolower(dec($captcha, $token)); echo '[debug] decoded code: ' . $code . PHP_EOL; sleep(2); doPost($url.'?', json_encode(['cv' => $code]), $cookies); sleep(2); print_r(json_decode(doPost($url, ['name' => 'test', 'email' => 'test@test', 'message' => 'test'], $cookies),true)); Я все надеялся перейти к следующему этапу, проверить насколько легко распознать код с вашей картинки современными OCR средствами, но, увы, потерял интерес. Так как мы никак не можем пройти этап глупого робота... Я искренне надеюсь, что вы все же понимаете в чем тут проблема и просто демонстрируете упорство (зачем-то). Ибо если вы не понимаете -- то удача тут не поможет.
Добрый день! Спасибо за Ваше упорство. Я понимаю в чём проблема. Вы меня немного опередили с роботом. Сделал последнюю доработку. Код (Text): [debug] cookies: PHPSESSID=56ce2c96138a3d2d0557be87185e247b [debug] encoded code: _ZgOUQ [debug] token: 4Z6WPKB5DE2JG1QFYHLOXUIVMANTR7CS8394 [debug] decoded code: r9c Array ( [err] => 1 [msg] => Thank you for your feedbackThank you for your feedback. Unfortunately your message was not sent. Please try again later again ) Вы правы, что пора остановиться.
И в чем же? Судя по тому, что вы "сделали последнюю доработку" (переместили токен в <img src="...">), вы не понимаете в чем проблема.
Добрый день! Проблема в том, что код js нельзя скрыть. Однако, если программа поддерживается, то и робот нужно постоянно дорабатывать, причём для этого необходимо каждый раз инспектировать код. С этим может справиться, только восококвалифицированный специалист. Как следствие этого возникает вопрос практической рентабильности этой затеи. Эту игру можно было бы продолжить, токен может в следующий раз оказаться не там и не тот, или ... , но полагаю продолжать не стоит. Спасибо! Мне было очень приятно с Вами пообщаться. Удачи!
А можно один раз сделать правильно. Но если ваша капча позиционируется как артефакт для игры, а не как настоящая капча, которая может быть установлена, например, на миллионы wordpress веб-сайтов, то конечно вопросов к ней нет. В качестве игрушки вполне себе имеет право на существование.
Я не занимаюсь игрушками и не пишу плагины для wordpress. Между прочим, в своих проектах капчу на js я не применяю. Случайно попалась на DEV Community js-canvas капча. Решил, со ссылкой на автора, поэкспериментировать с этой затеей. Так получился этот класс. Не для миллионов wordpress веб-сайтов.
Последний эксперимент https://www.alto-booking.com/developer/captchaCV/feedback/index.php Робот от brevis Код (Text): [debug] cookies: [debug] encoded code: [debug] token: [debug] decoded code: Array ( [err] => 1 [msg] => Thank you for your feedbackThank you for your feedback. Unfortunately your message was not sent. Please try again later again )
Надеюсь это какой-то вид пост/мета/...- юмора. Ибо для последнего эксперимента вообще никакая логика в роботе не нужна. Достаточно ввести капчу один раз руками и потом ее использовать в каждом запросе: Код (Text): curl 'https://alto-booking.com/developer/captchaCV/feedback/index.php' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundaryTr6xOn5KALZDOtYT' \ --data-raw $'------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="name"\r\n\r\ntest\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="email"\r\n\r\ntest@test\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="message"\r\n\r\ntest\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="code"\r\n\r\nNTE5NDAy\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT--\r\n' Вам удачи. Ну а мне на этом позвольте откланяться, ибо играть в шахматы с голубями не интересно.