const kbKey = "SttzrYdjo"; /* Нужно получить в личном кабинете 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);
}
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(){
//Действия на ошибку, когда данные не получены
}
{
"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 страницы на который нужно совершить редирект для этого визита
}
{
"error_code":100, //Код ошибки. error_code=100: ID сессии (kbSessionID) не существует, error_code=200: любая другая ошибка - смотрите описание
"error":true, //это значит что произошла ошибка
"m":"KillBot session does not exist kbSessionID=255483105" //текст ошибки
}
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Слепок браузера</title>
<style>
.spinner {
border: 16px solid #f3f3f3; /* Light grey */
border-top: 16px solid #3498db; /* Blue */
border-radius: 50%;
width: 60px;
height: 60px;
animation: spin 2s linear infinite;
display: inline-block;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.hidden {
display: none;
}
</style>
</head>
<body>
<div id="warning"></div>
<div id="result"><div id="spinner" class="spinner"></div></div>
<div id="desc"></div>
<script>
// Проверка протокола
if (location.protocol !== 'https:') {
let message = '<b>WARNING:</b> Для стабильной работы, KillBot нужно запускать скрипт через HTTPS.';
document.getElementById('warning').innerHTML = message;
}
const kbKey = "SttzrYdjo"; /* Нужно получить в личном кабинете KillBot - находится в первой строчке кода для размещения на сайте. */
const kbTimeout = 2000; /* период через который делать запрос на сервер для получения результата. */
const kbMaxRequests = 10; /* максимальное число запросов на сервер чтобы забрать результат. */
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);
}
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){
document.getElementById('result').innerHTML = 'Слепок браузера: <b>' + response.snsht+'</b>';
if (response.wl==true) document.getElementById('result').innerHTML += " <span style = 'color:green'>[Есть в списках настоящих браузеров]</span>";
document.getElementById('result').innerHTML += '<br>';
document.getElementById('result').innerHTML += 'Код прогружен полностью: <b>' + (response.l?'ДА':'НЕТ')+'</b>';
document.getElementById('desc').innerHTML = '<ul>';
document.getElementById('desc').innerHTML += '<li>Слепок браузера может варьироваться в зависимости от версии браузера, версии OC и установленных расширений. Слепок бота в абсолютном большинстве случаев будет отличаться от слепка настоящего браузера. Даже если бот повторит какой-либо слепок, то визиты только за этим слепком можно обрабатывать подругому.';
document.getElementById('desc').innerHTML += '</ul>';
}
function fail(){
document.getElementById('result').innerText = 'Ошибка: таймаут, слепок браузера не получен.';
}
setTimeout(makeRequest, kbTimeout);
</script>
</body>
</html>