Witam, czy jest możliwe zrobić licznik odwiedzin na stronie www który wykluczy całkowicie odwiedziny googlebota ? Próbowałem już wiele razy z czatem gpt rozwiązać ten problem, ale bez skutku.
Strona to https://www.dbgreat.com.pl

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20

- Rejestracja:ponad 8 lat
- Ostatnio:około 2 godziny
- Postów:3457
Pokaż obecny kod.
Możesz rozpoznać boty poprzez "nazwę przeglądarki" - user agent
Lista pierwsza z brzegu:
https://datadome.co/bot-management-protection/crawlers-list/
Dane znajdziesz w zmiennej $_SERVER
klucz chyba nawet nazywał się user_agent

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
Za pomocą kolumny is_bot
próbowałem ustawić na 1 dla botów, a 0 dla prawdziwych userów.
<?php
// Dodanie nowych kolumn, jeśli ich jeszcze nie ma
$sql_add_is_bot_column = "ALTER TABLE visitors
ADD COLUMN IF NOT EXISTS is_bot TINYINT(1) DEFAULT 0";
$conn->query($sql_add_is_bot_column);
$sql_add_columns = "ALTER TABLE visitors
ADD COLUMN IF NOT EXISTS reload_count INT DEFAULT 0,
ADD COLUMN IF NOT EXISTS last_reload_time DATETIME DEFAULT NULL";
$conn->query($sql_add_columns);
// Aktualizacja statusu wszystkich użytkowników na "offline", jeśli od ich ostatniej aktywności minęło więcej niż 5 minut
$sql_update_all_users = "UPDATE visitors SET status='offline' WHERE status='online' AND data_i_godzina < (NOW() - INTERVAL 5 MINUTE)";
$conn->query($sql_update_all_users);
// Funkcja sprawdzająca, czy to bot wyszukiwarek
function isSearchBot() {
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
$search_bots = ['googlebot', 'bingbot', 'yandexbot', 'baiduspider', 'slurp', 'duckduckbot', 'facebookexternalhit']; // Dodaj inne boty, jeśli są potrzebne
foreach ($search_bots as $bot) {
if (strpos($user_agent, $bot) !== false) {
return true; // Jeśli znaleziono jakikolwiek bot, zwróć true
}
}
return false; // Jeśli nie znaleziono bota, zwróć false
}
$user_ip = $_SERVER['REMOTE_ADDR'];
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'direct';
// Sprawdzenie, czy to bot wyszukiwarek
$is_bot = isSearchBot() ? 1 : 0;
if ($is_bot) {
$referer = 'direct'; // Ustaw referer na "bezpośrednia" dla botów wyszukiwarek
} elseif (empty($referer)) {
$referer = 'direct'; // Ustaw referer na "bezpośrednia" tylko jeśli jest pusty
}
// Sprawdzenie, czy adres IP znajduje się na liście wykluczonych
if (in_array($user_ip, $excluded_ips)) {
// Jeśli IP jest na liście, nie wykonujemy żadnych operacji związanych z liczeniem odwiedzin
exit();
}
if (!$is_bot) {
// Sprawdzenie czy użytkownik istnieje w bazie danych
$sql_check_user = "SELECT * FROM visitors WHERE ip='$user_ip'";
$result_check_user = $conn->query($sql_check_user);
if (!$result_check_user) {
die("Query failed: " . $conn->error);
}
if ($result_check_user->num_rows > 0) {
// Użytkownik istnieje
$row_user = $result_check_user->fetch_assoc();
$last_activity_timestamp = strtotime($row_user['data_i_godzina']);
$current_time = time();
$inactive_time = $current_time - $last_activity_timestamp;
if ($inactive_time > 300) { // Użytkownik jest offline po 5 minutach nieaktywności
$sql_update_user = "UPDATE visitors SET data_i_godzina=NOW(), status='offline', reload_count=0, is_bot=0 WHERE ip='$user_ip'";
$conn->query($sql_update_user);
} else {
// Użytkownik jest aktywny
$sql_update_user = "UPDATE visitors SET data_i_godzina=NOW(), reload_count=reload_count+1, last_reload_time=NOW(), is_bot=0 WHERE ip='$user_ip'";
$conn->query($sql_update_user);
// Ustawienie statusu na "online", jeśli użytkownik jest aktywny
if ($row_user['status'] == 'offline') {
$sql_update_status = "UPDATE visitors SET status='online' WHERE ip='$user_ip'";
$conn->query($sql_update_status);
}
}
} else {
// Użytkownik nie istnieje, dodaj go do bazy danych
$sql_insert_user = "INSERT INTO visitors (ip, data_i_godzina, status, referer, reload_count, last_reload_time, is_bot) VALUES (?, NOW(), 'online', ?, 0, NULL, 0)";
$stmt = $conn->prepare($sql_insert_user);
$stmt->bind_param("ss", $user_ip, $referer);
$stmt->execute();
$stmt->close();
}
} else {
// Obsługa przypadku, kiedy jest bot
$sql_check_user = "SELECT * FROM visitors WHERE ip='$user_ip'";
$result_check_user = $conn->query($sql_check_user);
if (!$result_check_user) {
die("Query failed: " . $conn->error);
}
if ($result_check_user->num_rows > 0) {
// Bot już istnieje, aktualizuj dane
$sql_update_user = "UPDATE visitors SET data_i_godzina=NOW(), is_bot=1 WHERE ip='$user_ip'";
$conn->query($sql_update_user);
} else {
// Bot nie istnieje, dodaj go do bazy danych
$sql_insert_user = "INSERT INTO visitors (ip, data_i_godzina, status, referer, reload_count, last_reload_time, is_bot) VALUES (?, NOW(), 'online', ?, 0, NULL, 1)";
$stmt = $conn->prepare($sql_insert_user);
$stmt->bind_param("ss", $user_ip, $referer);
$stmt->execute();
$stmt->close();
}
}
// Zliczanie odwiedzin dzisiaj (z wykluczeniem botów)
$sql_count_visits_today = "SELECT COUNT(*) as visit_count FROM visitors WHERE DATE(data_i_godzina) = CURDATE() AND is_bot = 0 AND ip NOT IN ('" . implode("','", $excluded_ips) . "')";
$result_count_visits_today = $conn->query($sql_count_visits_today);
if (!$result_count_visits_today) {
die("Query failed: " . $conn->error);
}
$row_count_visits_today = $result_count_visits_today->fetch_assoc();
$visits_today = $row_count_visits_today['visit_count'];
// Zliczanie użytkowników online (z wykluczeniem botów)
$sql_count_online = "SELECT COUNT(*) as online_count FROM visitors WHERE status='online' AND is_bot = 0 AND ip NOT IN ('" . implode("','", $excluded_ips) . "')";
$result_count_online = $conn->query($sql_count_online);
if (!$result_count_online) {
die("Query failed: " . $conn->error);
}
$row_count_online = $result_count_online->fetch_assoc();
$online_count = $row_count_online['online_count'];
echo "Liczba odwiedzin<br>dzisiaj: " . $visits_today . "<br><br>";
echo "Liczba gości online: " . $online_count;
?>
..
Próbowałem z user agents IsSearchBot ale to nic nie daje. Jedynie blokowanie adresów IP.
DZIĘKI chyba SIĘ UDAŁO - CHYBA TO ZASŁUGA $_SERVER['HTTP_USER_AGENT]
. Teraz jak wejdzie bot to ustawia wartość is_bot
w bazie danych na 1. Przynajmniej na razie tak to wygląda. Dam znać jak przyobserwuje czy dobrze zlicza statsy.
- screenshot-20241231063353.png (24 KB) - ściągnięć: 6
- screenshot-20241231060814.png (20 KB) - ściągnięć: 5

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
A czy plik z wynikami może wpłynąć na statystyki ?
<?php
// Lista znanych botów (możesz dodać więcej botów do tej listy)
$knownBots = [
'googlebot',
'bingbot',
'yandex',
'baiduspider',
'msnbot',
'duckduckbot',
'slurp',
'facebot',
'ia_archiver'
];
// Pobierz IP użytkownika
$userIP = $_SERVER['REMOTE_ADDR'];
// Sprawdzenie, czy tabela visitors istnieje
$checkTableQuery = "SHOW TABLES LIKE 'visitors'";
$result = $conn->query($checkTableQuery);
// Pobierz 20 ostatnich rekordów z tabeli visitors z uwzględnieniem nowych kolumn
$selectQuery1 = "SELECT `id`, `ip`, `data_i_godzina`, `status`, `reload_count`, `last_reload_time`, `is_bot` FROM `visitors` ORDER BY `data_i_godzina` DESC LIMIT 15";
$result1 = $conn->query($selectQuery1);
// Przygotuj tablicę na wiersze
$rows = array();
while ($row = $result1->fetch_assoc()) {
$isCurrentUserIP = ($row['ip'] == $_SERVER['REMOTE_ADDR']);
$style = $isCurrentUserIP ? 'color: #aa8a44; font-weight: bold;' : '';
// Dodaj wiersz do tablicy
$rows[] = array(
'style' => $style,
'id' => $row['id'],
'ip' => $row['ip'],
'data_i_godzina' => $row['data_i_godzina'],
'status' => $row['status'],
'reload_count' => $row['reload_count'],
'is_bot' => $row['is_bot'], // Dodana kolumna is_bot
'last_reload_time' => $row['last_reload_time']
);
}
// Sortuj tablicę, umieszczając wiersze z Twoim adresem IP na końcu
usort($rows, function ($a, $b) {
return ($a['style'] === '') ? -1 : 1;
});
// Wyświetlanie wyników pierwszej tabeli
if ($result1->num_rows > 0) {
// Wyświetl tabelę
echo "<h2>Ostatnie 20 rekordów z tabeli visitors</h2>";
echo "<table rules='all' style='border:1px solid rgba(255,255,255,0.1);width:100%;text-align:center;font-size:13;'>
<tr>
<th>ID</th>
<th>Adres IP</th>
<th>Data i Godzina</th>
<th>Reload Count</th>
<th>Status</th>
<th>Bot</th> <!-- Nowa kolumna dla is_bot -->
</tr>";
foreach ($rows as $row) {
echo "<tr style='{$row['style']}'>
<td>{$row['id']}</td>
<td>{$row['ip']}</td>
<td>{$row['data_i_godzina']}</td>
<td>{$row['reload_count']}</td>
<td>{$row['status']}</td>
<td>{$row['is_bot']}</td> <!-- Nowa kolumna dla is_bot -->
</tr>";
}
echo "</table>";
} else {
echo "Brak wyników do wyświetlenia.";
}
// Pobierz id, referer i datę z odpowiedniego zapytania SQL
$selectQueryReferer = "SELECT `id`, `referer`, `data_i_godzina` FROM `visitors` WHERE `referer` IS NOT NULL ORDER BY `data_i_godzina` DESC LIMIT 15";
$resultReferer = $conn->query($selectQueryReferer);
// Wyświetlanie wyników tabeli z refererem i datą
if ($resultReferer->num_rows > 0) {
echo "<h2>Tabela z Refererem</h2>";
echo "<table rules='all' style='border:1px solid rgba(255,255,255,0.1);width:100%;text-align:center;'>
<tr>
<th>ID</th>
<th>Referer</th>
<th>Data i Godzina</th>
</tr>";
while ($rowReferer = $resultReferer->fetch_assoc()) {
// Dodaj trzy kropki, jeśli referer ma więcej niż 20 znaków
$shortenedReferer = (strlen($rowReferer['referer']) > 50) ? substr($rowReferer['referer'], 0, 50) . "..." : $rowReferer['referer'];
echo "<tr>
<td>{$rowReferer['id']}</td>
<td style='width:40%'>{$shortenedReferer}</td>
<td>{$rowReferer['data_i_godzina']}</td>
</tr>";
}
echo "</table>";
} else {
echo "Brak wyników do wyświetlenia.";
}
// Pobierz codzienne odwiedziny (bez botów) z ostatnich 10 dni
$selectQuery2 = "SELECT DATE(`data_i_godzina`) AS `dzien`, COUNT(*) AS `liczba_odwiedzin`
FROM `visitors`
WHERE `is_bot` = 0
GROUP BY DATE(`data_i_godzina`)
ORDER BY `dzien` DESC
LIMIT 10";
$result2 = $conn->query($selectQuery2);
// Wyświetlanie wyników w tabeli
if ($result2->num_rows > 0) {
echo "<h2>Codzienne odwiedziny (bez botów) z ostatnich 10 dni</h2>";
echo "<table rules='all' style='border:1px solid rgba(255,255,255,0.1);width:100%;text-align:center;'>
<tr>
<th>Data</th>
<th>Liczba odwiedzin</th>
</tr>";
while ($row = $result2->fetch_assoc()) {
echo "<tr>
<td>{$row['dzien']}</td>
<td>{$row['liczba_odwiedzin']}</td>
</tr>";
}
echo "</table>";
} else {
echo "Brak wyników do wyświetlenia.";
}
// Zamknij połączenie z bazą danych
$conn->close();
?>

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
Przez chwilę działał licznik, coś sknociłem i nie wiem jak naprawić.
Obecny kod wygląda tak:
<?php
$excluded_ips = ['4.227.36.22', '10.0.0.1']; // Wykluczone IP
// Funkcja sprawdzająca, czy to bot na podstawie user agent
function isSearchBot() {
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
$search_bots = ['googlebot', 'bingbot', 'yandexbot', 'baiduspider', 'slurp', 'duckduckbot', 'facebookexternalhit'];
foreach ($search_bots as $bot) {
if (strpos($user_agent, $bot) !== false) {
return true;
}
}
return false;
}
function sendEmailNotification($ip) {
$to = 'fukurou@dbgreat.com.pl';
$subject = 'Nowa wizyta na stronie';
$message = "Nowy użytkownik odwiedził stronę. IP: $ip";
$headers = "From: no-reply@example.com";
mail($to, $subject, $message, $headers);
}
$user_ip = $_SERVER['REMOTE_ADDR'];
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'direct';
$is_bot = isSearchBot() ? 1 : 0;
// Dodanie kolumny is_bot, jeśli nie istnieje
$conn->query("ALTER TABLE visitors ADD COLUMN IF NOT EXISTS is_bot TINYINT(1) DEFAULT 0");
// Aktualizacja wszystkich rekordów botów
$conn->query("UPDATE visitors SET is_bot = 1 WHERE LOWER(user_agent) REGEXP 'googlebot|bingbot|yandexbot|baiduspider|slurp|duckduckbot|facebookexternalhit'");
if (in_array($user_ip, $excluded_ips)) {
exit(); // Wyjdź, jeśli to wykluczone IP
}
$sql_check_user = "SELECT * FROM visitors WHERE ip='$user_ip'";
$result_check_user = $conn->query($sql_check_user);
if ($result_check_user->num_rows > 0) {
$row_user = $result_check_user->fetch_assoc();
$inactive_time = time() - strtotime($row_user['data_i_godzina']);
if ($inactive_time > 300) {
$sql_update_user = "UPDATE visitors
SET data_i_godzina=NOW(), status='offline', reload_count=0, is_bot='$is_bot'
WHERE ip='$user_ip'";
} else {
$sql_update_user = "UPDATE visitors
SET data_i_godzina=NOW(),
reload_count = IF(ip != '79.175.215.54', reload_count + 1, reload_count),
last_reload_time=NOW(), status='online', is_bot='$is_bot'
WHERE ip='$user_ip'";
}
$conn->query($sql_update_user);
} else {
$sql_insert_user = "INSERT INTO visitors (ip, data_i_godzina, status, referer, reload_count, last_reload_time, is_bot) VALUES (?, NOW(), 'online', ?, 0, NULL, ?)";
$stmt = $conn->prepare($sql_insert_user);
$stmt->bind_param("ssi", $user_ip, $referer, $is_bot);
$stmt->execute();
$stmt->close();
if (!$is_bot) {
sendEmailNotification($user_ip);
}
}
$sql_count_visits_today = "SELECT COUNT(*) as visit_count FROM visitors
WHERE DATE(data_i_godzina) = CURDATE()
AND is_bot = 0
AND ip NOT IN ('" . implode("','", $excluded_ips) . "')
AND ip != '79.175.215.54'";
$result_count_visits_today = $conn->query($sql_count_visits_today);
$visits_today = $result_count_visits_today->fetch_assoc()['visit_count'];
$sql_count_online = "SELECT COUNT(*) as online_count FROM visitors
WHERE status='online'
AND is_bot = 0
AND ip NOT IN ('" . implode("','", $excluded_ips) . "')
AND ip != '79.175.215.54'";
$result_count_online = $conn->query($sql_count_online);
$online_count = $result_count_online->fetch_assoc()['online_count'];
echo "Liczba odwiedzin dzisiaj: " . $visits_today . "<br><br>";
echo "Liczba gości online: " . $online_count;
$conn->close();
?>

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
No bo drugi kod to wyświetlanie na stronie statystyk w formie tabelki. Skupmy się na tym ostatnim kodzie co podałem. Chcę żeby ustawiała się w bazie danych w tabeli "visitors" w kolumnie "is_bot" wartość 1 dla rekordów które pochodzą od botów. A dla prawdziwych użytkowników ma być 0. W ten sposób chcę zliczać tylko te odwiedziny co wskazują 0.

- Rejestracja:ponad 8 lat
- Ostatnio:około 2 godziny
- Postów:3457
// Dodanie kolumny is_bot, jeśli nie istnieje
$conn->query("ALTER TABLE visitors ADD COLUMN IF NOT EXISTS is_bot TINYINT(1) DEFAULT 0");
// Aktualizacja wszystkich rekordów botów
$conn->query("UPDATE visitors SET is_bot = 1 WHERE LOWER(user_agent) REGEXP 'googlebot|bingbot|yandexbot|baiduspider|slurp|duckduckbot|facebookexternalhit'");
Po co to wywołujesz za każdym razem?
Kolumnę dodajesz raz. Update też jak już raz.
W linii 47 w update znów sprawdzasz czy to bot. Jest sens? Raz wykryty wpis o automacie powinien już istnieć. Inna sprawa, że z takiego IP w teorii może się łączyć wielu użytkowników.
W linii 58 z kolei dodajesz tylko wpisy do bazy dla użytkowników nie rozpoznanych jako bot.
Ja bym na Twoim miejscu dokładnie przemyślał jak działa ten kod wygenerowany z chatu a jak chciałbyś żeby działał.

- Rejestracja:prawie 2 lata
- Ostatnio:około 2 miesiące
- Postów:351
Google ma różne boty i różnie się przedstawiają. Na szczęście Google podaje listę adresów IP, z których korzystają więc możesz je łatwo wykluczyć:
https://www.gstatic.com/ipranges/goog.json

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
patrze na referer, jak wchodzą z jakiegoś adresu to mam pewność że to człowiek, jak z direct to raczj bot
- screenshot-20241231164554.png (136 KB) - ściągnięć: 2
- Rejestracja:ponad 3 lata
- Ostatnio:około 2 godziny
- Postów:277
Mariusz Kubielas napisał(a):
Witam, czy jest możliwe zrobić licznik odwiedzin na stronie www który wykluczy całkowicie odwiedziny googlebota ? Próbowałem już wiele razy z czatem gpt rozwiązać ten problem, ale bez skutku.
Strona to https://www.dbgreat.com.pl
Oficjalne boty się przedstawiają w UserAgencie jako boty.
- Rejestracja:ponad 3 lata
- Ostatnio:około 2 godziny
- Postów:277
Mariusz Kubielas napisał(a):
patrze na referer, jak wchodzą z jakiegoś adresu to mam pewność że to człowiek, jak z direct to raczj bot
Wcale nie, crawlery działają w rózny sposób niektóre chodzą po stronach i wchodzą z jakiegoś adresu a niektóre robią "direct search" i wchodzą bezpośrednio.
Oficjalne boty najłatwiej wykosić po UserAgencie. A inne no cóż jak ktoś się kryje z tym że jest botem to możesz patrzeć na różne parametry przeglądarki i szukać jakiś schematów zgadzających się dla większej ilości połączeń.

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
A da sie zaktualizować istniejące już rekordy w bazie danych i oznaczyć które to boty tak jak to robię za pomocą wartości 1 w kolumnie "is_bot" ?

- Rejestracja:około 16 lat
- Ostatnio:około miesiąc
IMO, może dodaj kolumnę do db i zbieraj z każdego wejścia dane z 'HTTP_USER_AGENT' tak jak są w oryginale, bez obrabiana, po prostu zrób to przez kilka dni. Jak nazbierasz już sporą ilość danych zrób ich analizę np. pod kątem występowania nietypowych wpisów (typowych dla bot-a).
Po tej analizie może będzie łatwiej napisać jakiś sensowny kod do wyłapywania bot-ów.
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/W.X.Y.Z Safari/537.36
Twitterbot/1.0 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.12.3 Chrome/69.0.3497.128 Safari/537.36
itp.

- Rejestracja:około 16 lat
- Ostatnio:około miesiąc
Mariusz Kubielas napisał(a):
A da sie zaktualizować istniejące już rekordy w bazie danych i oznaczyć które to boty tak jak to robię za pomocą wartości 1 w kolumnie "is_bot" ?
jeżeli pytasz o sam sqł, jak najbardziej.
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;




- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
UDAŁO SIĘ, "troche"(bo całą nocke zarwałem) pomęczyłem chata gpt i się udało ustawia 1 dla botów. Jescze poobserwuje jakiś czas i dam znać czy działa.
Przyczyna była w tej funkcji:
function isSearchBot() {
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
// Lista botów do wykrycia (w tym boty Google, Bing, Yahoo, DuckDuckGo, Baidu, Yandex, Facebook i inne)
$bot_user_agents = [
'googlebot', 'bingbot', 'yahoo', 'duckduckbot', 'baiduspider',
'yandexbot', 'facebookexternalhit', 'facebot', 'mj12bot', 'twitterbot',
'slurp', 'crawl', 'spider', 'bot', 'crawler', 'googlebot-mobile', 'googlebot-image',
'mediapartners-google', 'adsbot-google', 'google-sitemaps', 'feedfetcher-google',
'ahrefsbot', 'seokicks-robot', 'bingbot', 'semrushbot', 'majesticbot', 'seznambot'
];
foreach ($bot_user_agents as $bot) {
if (strpos($user_agent, $bot) !== false) {
return true; // Jeśli znaleziono jakikolwiek bot, zwróć true
}
}
return false; // Jeśli nie znaleziono żadnego bota, zwróć false
}
 - ściągnięć: 3

- Rejestracja:około 16 lat
- Ostatnio:około miesiąc
Proponuje taką zmianę w liniii 2, jeżeli $_SERVER['HTTP_USER_AGENT'] zwróci '' pusty to nie ma sensu wykonywać reszty kodu, można od razu zwrócić false.
$user_agent = $_SERVER['HTTP_USER_AGENT'] ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
if (!$user_agent) return false;


- Rejestracja:około 16 lat
- Ostatnio:około miesiąc
Sprawdź to [ wersja online ]:
$http_users_agent = [
'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36', // Googlebot
'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/W.X.Y.Z Safari/537.36', // Bingbot
'Twitterbot/1.0 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.12.3 Chrome/69.0.3497.128 Safari/537.36', // Twitterbot
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', // Zwykły użytkownik
'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36', // Kolejny zwykły użytkownik
'Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)' // AhrefsBot
];
function isSearchBot() {
$user_agent = $_SERVER['HTTP_USER_AGENT'] ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
if (!$user_agent) return false;
$bot_user_agents = [
'googlebot', 'bingbot', 'yahoo', 'duckduckbot', 'baiduspider',
'yandexbot', 'facebookexternalhit', 'facebot', 'mj12bot', 'twitterbot',
'slurp', 'crawl', 'spider', 'bot', 'crawler', 'googlebot-mobile', 'googlebot-image',
'mediapartners-google', 'adsbot-google', 'google-sitemaps', 'feedfetcher-google',
'ahrefsbot', 'seokicks-robot', 'bingbot', 'semrushbot', 'majesticbot', 'seznambot'
];
$clean_user_agent = preg_replace('/[^a-z]+/', ' ', $user_agent);
$user_agent = preg_split('/\W+/', $clean_user_agent);
return !empty(array_intersect($user_agent, $bot_user_agents));
}
// dla testu
foreach ($http_users_agent as $agent) {
$_SERVER['HTTP_USER_AGENT'] = $agent;
//echo $agent . PHP_EOL . (isSearchBot() ? 'true' : 'false') . PHP_EOL . PHP_EOL; // wersja konsolowa
echo "$agent<br>" . (isSearchBot() ? 'true' : 'false') . '<br><br>'; // wersja html
}
lub [ wersja online ]:
function isSearchBot() {
$user_agent = $_SERVER['HTTP_USER_AGENT'] ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
if (!$user_agent) return false;
$bot_user_agents = file('bot_user_agents.dat', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$clean_user_agent = preg_replace('/[^a-z]+/', ' ', $user_agent);
$user_agent = preg_split('/\W+/', $clean_user_agent);
return !empty(array_intersect($user_agent, $bot_user_agents));
}
bot_user_agents.dat
googlebot
bingbot
yahoo
duckduckbot
baiduspider
yandexbot
facebookexternalhit
facebot
mj12bot
twitterbot
slurp
crawl
spider
bot
crawler
googlebot-mobile
googlebot-image
mediapartners-google
adsbot-google
google-sitemaps
feedfetcher-google
ahrefsbot
seokicks-robot
semrushbot
majesticbot
seznambot

- Rejestracja:ponad 8 lat
- Ostatnio:około 2 godziny
- Postów:3457
Wersja uproszczona do minimum:
<?php
function isSearchBot(userAgent) {
return stripos($userAgent, 'bot') !== false;
}
// Funkcja testująca różne User Agenty
function testUserAgents() {
$userAgents = [
// Popularne przeglądarki
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/115.0',
'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
// Boty
'Googlebot/2.1 (+http://www.google.com/bot.html)',
'Mozilla/5.0 (compatible; Bingbot/2.0; +http://www.bing.com/bingbot.htm)',
'DuckDuckBot/1.1 (+https://duckduckgo.com/duckduckbot)',
'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)',
// Fałszywe boty (test)
'Mozilla/5.0 (compatible; Fakebot/1.0; +http://fakebot.com)',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Bot/537.36',
];
foreach ($userAgents as $agent) {
$result = isSearchBot($agent) ? 'BOT' : 'Przeglądarka';
echo "User-Agent: $agent\nWynik: $result\n\n";
}
}
// Uruchomienie testów
testUserAgents();
?>
Online:
https://onlinephp.io/c/33a1b
Przy takim sprawdzaniu wystarczy szukać wystąpienia napisu bot

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
OK, wszystko działa, tylko nie wyświetla ile osob odwiedziło dziś strone i liczby online. Prawdopodobnie w którymś miejcu w kodzie jest błąd.
Edit: exit() przerwał działanie dalszego skryptu dlatego nie wyświetlało się w ogóle "echo". Zamiast exit () dałem return; - nie wiem czy dobrze zrobiłem ?


- Rejestracja:około 16 lat
- Ostatnio:około miesiąc
@jurek1980
[ pełny przykład online ]
function isBot($userAgent) {
return (bool)array_filter(['bot', 'google-', 'crawl'], function($needle) use ($userAgent) {
return stripos($userAgent, $needle) !== false;
});
}
// Funkcja testująca różne User Agenty
function testUserAgents() {
$userAgents = [
'Mozilla/5.0 (compatible; OnCrawl/2.0; +https://www.oncrawl.com)',
'Mozilla/5.0 (compatible; Google-InspectionTool/1.0;)',
// Popularne przeglądarki
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/115.0',
'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
// Boty
'Googlebot/2.1 (+http://www.google.com/bot.html)',
'Mozilla/5.0 (compatible; Bingbot/2.0; +http://www.bing.com/bingbot.htm)',
'DuckDuckBot/1.1 (+https://duckduckgo.com/duckduckbot)',
'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)',
// Fałszywe boty (test)
'Mozilla/5.0 (compatible; Fakebot/1.0; +http://fakebot.com)',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Bot/537.36',
];
foreach ($userAgents as $agent) {
$result = isBot($agent) ? 'BOT' : 'Przeglądarka';
echo "User-Agent: $agent\nWynik: $result\n\n";
}
}
// Uruchomienie testów
testUserAgents();

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
Ok. 500 botów mi wykluczyło od północy do teraz, czyli w ciągu niecałej godziny
Nie wiem, wydaje mi się że dalej odwiedzają strone boty, bo w rekordach nie ma przeładowań, a zawsze jak ktoś wchodził to widziałem kilka przeładowań. Teraz pokazuje same zera, więc to pewno googleboty, albo jakieś inne. Plus jest taki, że jest teraz taka garstka botów. Zaledwie 22 odwiedziny do południa to i tak git. Może da się jeszcze jakoś je wykopać. Może za pomocą tego kodu co podałeś @VBService jak myślisz ?

- Rejestracja:3 miesiące
- Ostatnio:15 dni
- Postów:20
Najlepsze jest to, że dzisiaj porównałem odwiedziny z mojego licznika do licznika google analytics i taki sam wynik wczoraj 55 odwiedzin. To znaczy że całkowicie wyeliminowałem boty. Tak się cieszę, dziękuję za rady, pomogliście. Z botami by było z 5 tys. wyświetleń. Wchodzą jeden na sekunde.

4w0rX4t4X