API для выявления ботов и вредоносного трафика

Идея

Подключение антифрода KillBot по АПИ осуществляется размещением JS кода на сайте. Этот код собирает и отправляет браузерные данные на сервер. Результат проверки нужно забирать отдельным запросом к серверу с передачей номера сессии. В планах сделать интеграцию через DNS проксирование по типу как сделано у СloudFlare. 

Для сбора данных нужно подключить скрипт https://data.killbot.ru/js/c.js - этот скрипт отправит данные на сервер 4-мя запросам с общим объемом отправляемых данных 5-15Kb.

Скрипт KillBot не собирает персональных данных, не собирает данные ввода форм, не запрашивает доступ к микрофону, локации, видеокамере и другим де-идентифицирующим объектам.

Получение результата проверки и сопутствующих данных осуществляется запросом на сервер https://data.killbot.ru/r/get.php . Так как мы не знаем когда именно все 4 запроса с данными дошли до сервера и рассчитались, то запрос https://data.killbot.ru/r/get.php нужно осуществлять по таймауту с возможностью повторения.

Подключение скрипта отправки данных c.js 

Ниже демонстрируется пример кода на JS, инициализирующий отправку данных на сервер KillBot.


        const kbKey = "Stitjtzrjo"; /* Нужно получить в личном кабинете KillBot - находится в первой строчке кода для размещения на сайте. */        

        let kbUserID = Math.floor(Math.random()*900000000); // ID пользователя, сохраняется в базе данных KillBot, можно сохранять как долгожитвущую куку, тип - MySQL BigInt
        let kbSessionID = Math.floor(Math.random()*900000000); //ID сессии, сохраняется в базе данных KillBot, можно сохранять как куку с коротким временем жихни, тип - MySQL BigInt
	var kbB = null; //Эта переменная здесь не используется, но без неё скрипт выдаст ошибку. Пусть пока остаётся, в следующих версиях исправим.

        try{
            //Подключаем скрипт c.js который собирает и отправляет браузерные данные на сервер
            var kbTS = document.createElement("script"); 
            kbTS.type = "text/javascript"; 
            kbTS.async = true;
            kbTS.src = "https://data.killbot.ru/js/c.js?hash_str=" + kbKey + "&r="+ btoa(document.referrer)+"&url="+btoa(location.href)+"&c="+kbSessionID+"&kbUserID="+kbUserID;
            document.head.appendChild(kbTS);
        }
        catch(e){         
            let message = 'KB Error: ' + e.name + ":" + e.message;            
            console.log(message);    
            alert(message);
            die(message);
        }

Пример получения результата проверки на JS

Результат проверки нужно получать GET запросом с передачей параметра сессии, пример запроса: https://data.killbot.ru/r/get.php?c={{kbSessionID}}

Результат проверки можно получать средствами JS или на бекенде. При получении результата проверки средствами JS помните, что бот может имитировать наш сервер фейковым, поэтому, для надёжности, результирующий ответ можно получать и на бекенде. Ниже пример получения результата проверки на JS: если данные не получены, то скрипт делает запрос на сервер ещё раз.


        const kbTimeout = 2000; /* период через который делать запрос на сервер для получения результата. */
        const kbMaxRequests = 10; /* максимальное число запросов на сервер чтобы забрать результат. */	

        let response = null;
        let requestCount = 0;

        function makeRequest() {
            if (requestCount >= kbMaxRequests) {
                if (response){
                    complete(response);            
                }else{
                    fail();           
                }
                return;
            }

            requestCount++;
            const xhr = new XMLHttpRequest();
            xhr.open('GET', 'https://data.killbot.ru/r/get.php?c='+kbSessionID, true);
            xhr.timeout = 15000; 

            xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4) { // 4 means the request is done.
                        if (xhr.status === 200) { // 200 means a successful return.
                            try {
                                response = JSON.parse(xhr.responseText);
                                
                                if (!response || response.hasOwnProperty("error")==true || response.l == false) {
                                    setTimeout(makeRequest, kbTimeout);
                                } else {
                                    complete(response); 
                                }
                            } catch (e) {
                                console.error('Error parsing JSON response:', e);
                                setTimeout(makeRequest, kbTimeout);
                            }
                        } else {
                            console.error('HTTP error: '+xhr.status+"; "+xhr.statusText);
                            setTimeout(makeRequest, kbTimeout);
                        }
                    }
                };

                xhr.send();
        }
        function complete(response){
            //Действия при успешном получении данных от сервера KillBot
        }

        function fail(){
            //Действия на ошибку, когда данные не получены
        }

Пример ответа cервера response на запрос https://data.killbot.ru/r/get.php :


{
	"bot":false, //Результат проверки на бота по всей логике скрипта, выставелнной в настройках скрипта KillBot, fraud.true - то это бот
	"fraud":false, //То же самое что и параметр bot, если bot.true - то это бот
	"l":true, //Прогружен скрипт полностью или нет. Простые боты могут не прогружать скрипт полностью, так как они оптимизируют время своей работы. Но из-за интернет соединения в некоторых случаях для реального пользователя скрипт так же может не прогрузится. l.true - значит скрипn прогружен польностью без ошибок
	"d":false, //Параметр из настроек скрипта: запретить заход или нет. Если d.true, то для этого визита нужно запретить заход на сайт
	"snsht":2969538378, //Слепок браузера основной
	"snsht_d":2696850341, //Слепок браузера детализированный
	"ua":"Chrome", //Браузер витзита, для информации - берётся из user-agent
	"sess":"457868305", //Номер сессии: kbSessionID
	"UserID":"468073784", //ID пользователя: kbUserID
	"capt":false, //Параметр из настроек скрипта: показать капчу или нет. Если capt.true, то для этого визита нужно запретить показать капчу
	"bl":false, //Есть ли слепок браузера snsht в группе известных ботов.
	"wl":true, //Есть ли слепок браузера snsht в группе известных браузеров.
	"wld":false, //Есть ли детализированный слепок браузера snsht в группе известных браузеров.
	"bld":false, //Есть ли детализированный слепок браузера snsht_d в группе известных ботов.
	"ip":"51.158.237.65", //ip с которого произошел визит
	"inf":false, //Параметр из настроек скрипта: показать бесконечную капчу или нет. Если inf.true, то для этого визита нужно показать бесконечную капчу - капчу которую нельзя пройти
	"sc":true, //Системный параметр для внутреннего использования в KillBot - он не нужен
	"t":true, //Платный скрипт или нет, если t.true - значит скрипт работает в платном режиме без ограничений
	"utm":"bot" //Параметр из настроек скрипта: название http параметра в который нужно поместить результат проверки на бота.
	"url": ""; //Параметр из настроек скрипта: url страницы на который нужно совершить редирект для этого визита
}

В случае ошибки ответ response будет содержать поле error с текстом ошибки.

Пример ошибочного ответа:


{
	"error_code":100, //Код ошибки. error_code=100: ID сессии (kbSessionID) не существует, error_code=200: любая другая ошибка - смотрите описание
	"error":true, //это значит что произошла ошибка
	"m":"KillBot session does not exist kbSessionID=255483105" //текст ошибки
}

Пример рабочего HTML кода с демонстрацией работы API KillBot.

Вот страница c кодом, который отправляет данные браузера на сервер и получает результат проверки: https://killbot.ru/snpsht.html

Смотрите код этой страницы, копируйте себе и на её основании создавайте свои приложения.