Как загрузить данные из PHP после капчи без перезагрузки страницы?

Приветствую.

Опишу ситуацию, чтобы было понятно.
Есть страница сайта. Перед ее отдачей работает код PHP. Этот код проверяет IP-адрес посетителя. Если с IP-адресом все нормально, то посетитель увидит перед собой страницу сайта. Если же IP-адрес попадает под фильтр, то вместо страницы посетитель увидит перед собой капчу. Ну, а как это обычно бывает: если посетитель решает капчу, то ему показывается страница, а если не решает — будет решать капчу до бесконечности, если не надоест, разумеется.

Я не пойму то, как можно отдать посетителю страницу после решения им капчи без перезагрузки страницы. Сайт работает на PHP.

Опишу текущую реализацию, чуть упростив ее сокращением кода.

Встроенный в страницу код проверки
// вот такой код выполняется перед показом страницы посетителю
// если ip не подходит, то показываем ему капчу (captcha.html)
// если ip нормальный, то показываем страницу (index.html)
<?php
// Проверка IP
$ip = $_SERVER['REMOTE_ADDR'];
if ($ip == "XX.XX.XX.XX") {
    include 'captcha.html';
    exit;
} else {
    // Блок else можно и не использовать
    include 'index.html';
    exit;
}

captcha.html
<!-- работает через яндекс.капчу -->
<!-- капча запрашивает данные с сервера яндекса через js и вставляет их в атрибут -->
<!-- полученные данные через js отправляют в php обработчик (request_response.php) -->
<!doctype html>
<html lang="en">
<head>
    <script src="https://smartcaptcha.yandexcloud.net/captcha.js" defer=""></script>
</head>
<body>

    <div
        id="smart-captcha"
        class="smart-captcha"
        data-callback="check_token"
    ></div>

    <script>
        function check_token(token) {
            // получаю токен капчи из поля 
            var token_block = document.querySelector("#smart-captcha > input[type=hidden]");
            var token = token_block.getAttribute("name");
            
            // формирую данные
            var data = {};
            data["token"] = token;

            // отправляют данные в обработчик
            fetch("request_response.php", {
                "method": "POST",
                "headers": {
                    "Content-Type": "application/json; charset=utf-8"
                },
                    "body": JSON.stringify(data)
                }).then(function(data) {
                    console.log(data);
                    if (data["passed"] == "passed") {
                        // если капча пройдена, то перезагружаю страницу
                        window.location.reload();
                    }
                })
          }
    </script>
</body>
</html>

request_response.php
// в обработчике отправляется запрос к серверу яндекса
// яндекс может вернуть два ответа: все хорошо + что-то не то
// если все хорошо, тогда надо показать посетителю страницу
// и делаю я это, отправляя в скрипт о том, что все хорошо
// скрипт перезагружает страницу, если все хорошо
if(isset($_POST)){
    // отправка запроса к яндексу
    // получение ответа
    // формирование json для ответа в js
    // отправка ответа в js
    echo json_encode($dats);
}

И на этом шаге я застрял: получаю ответ из PHP-обработчика и перезагружаю страницу через JS. Хотелось бы при успешности прохождения капчи как-то отдавать страницу без ее перезагрузки через JS.

Предполагаю, что есть какая-то возможность на этапе проверки IP-адреса в условии if-else прервать выполнение показа страницы и показать ее после прохождения капчи. В PHP/JS я не силен. Подскажите, пожалуйста, решение, если оно есть.

Если это имеет значение, то PHP код проверки подключен файле index.php командой include_once.
weranda
25 февраля 2024, 12:27
modx.pro
664
0

Комментарии: 5

vit
vit
25 февраля 2024, 17:01
0
Я бы сделал с помощью js
Типо если капча выполнена показывается контент
    Артур Шевченко
    25 февраля 2024, 21:34
    0
    // отправляют данные в обработчик
                fetch("request_response.php", {
                    "method": "POST",
                    "headers": {
                        "Content-Type": "application/json; charset=utf-8"
                    },
                        "body": JSON.stringify(data)
                    }).then(function(data) {
                        console.log(data);
                        if (data["passed"] == "passed") {
                            // если капча пройдена, то перезагружаю страницу
                            window.location.reload();
                        }
                    })
    Тут вместо перезагрузки вставляй в новый контент из data.
      weranda
      26 февраля 2024, 09:03
      0
      А как и откуда его получить, чтобы этот код корректно завелся?
        Артур Шевченко
        26 февраля 2024, 15:14
        0
        У тебя капча на всех страницах или на одной?
          weranda
          27 февраля 2024, 08:26
          0
          Файл проверки, как уже писал, прописать в index.php корня сайта. Страница с капчей — отдельный HTML файл. При попадании под фильтр, показываю страницу капчи (код выше). В общем, к примеру, если при открытии страницы сайта попадается что-то подозрительное, то это подозрительное отправляется на проверку.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5