Озвучка

Заметки Гримм
Закончен
5.94
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / вымышленный мир / приключения / супер сила / фэнтези / экшен / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 24 мин
  • Режиссер: Shizutaka Sugahara
  • Описание: Аниме "Заметки Гримм" погружает зрителей в захватывающий мир, где реальность переплетается с мрачными легендами и мифами. Это произведение привлекает внимание благодаря своей необычной концепции, глубоким персонажам и богатой визуальной эстетике. Сюжет строится вокруг главного героя, который оказывается втянутым в опасные приключения, полные тайн и загадок. "Заметки Гримм" предлагает уникальный взгляд на борьбу добра и зла, а также исследует темы дружбы, предательства и самопознания. Основной сюжет разворачивается вокруг юного героя, который неожиданно обнаруживает, что
Лазурный путь
Закончен
6.29
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / 3D-графика / военное / вымышленный мир / фантастика / экшен / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 23 мин
  • Режиссер: Motoki Tanaka
  • Описание: Аниме "Лазурный путь" — это захватывающая история о приключениях, дружбе и самопознании, которая погружает зрителей в мир морских путешествий и загадочных тайн. Сюжет разворачивается вокруг группы молодых людей, стремящихся найти легендарный артефакт, который может изменить их судьбы. Это аниме привлекает внимание не только яркой анимацией и запоминающимися персонажами, но и глубокими темами, такими как поиски себя и преодоление внутренних конфликтов. Основной сюжет "Лазурного пути" начинается с главного героя, который мечтает о свободе и приключениях. Он покидает родной
Реальная девушка 2
Закончен
7.67
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / дружба / наше время / романтика / сёдзё / школа / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 22 мин
  • Режиссер: Takashi Naoya
  • Описание: Аниме "Реальная девушка 2" продолжает захватывающую историю о любви, дружбе и самопознании, которая завоевала сердца зрителей по всему миру. Этот романтический сериал предлагает уникальное сочетание комедии и драмы, погружая зрителей в мир отношений, где реальность и мечты сталкиваются. Сюжет разворачивается вокруг главного героя, который, несмотря на свои неудачи в любви, стремится найти свое место в жизни и разобраться в своих чувствах. Во втором сезоне "Реальной девушки" мы вновь встречаемся с Хикари, которая продолжает развивать свои отношения с Мизусавой. Их связь
Рандеву с жизнью 3
Закончен
7.19
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / гарем / меха / романтика / супер сила / фантастика / фэнтези / школа / экшен / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 24 мин
  • Режиссер: Keitarou Motonaga
  • Описание: Рандеву с жизнью 3 — это продолжение популярной аниме-серии, которая сочетает в себе элементы фэнтези, комедии и романтики. Сюжет вновь переносит нас в мир, где главный герой, Субару Нацуки, продолжает свои приключения, сталкиваясь с новыми вызовами и сложностями. Эта часть аниме сохраняет привлекательные аспекты предыдущих сезонов, включая глубокую проработку персонажей, эмоциональные моменты и захватывающие сюжетные повороты. Основной сюжет разворачивается вокруг Субару, который, как и прежде, обладает уникальной способностью возвращаться в прошлое после своей смерти. Однако с каждой новой
Ревизия
Закончен
6.02
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / 3D-графика / будущее / дружба / меха / постапокалиптический мир / фантастика / экшен / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 22 мин
  • Режиссер: Gorou Taniguchi
  • Описание: Аниме "Ревизия" представляет собой захватывающее путешествие в мир, где реальность и виртуальность переплетаются, создавая уникальную атмосферу для зрителей. Сюжет сосредоточен на исследовании человеческой природы, социальных взаимодействий и моральных дилемм, что делает его особенно привлекательным для любителей глубоких историй. Это аниме поднимает важные вопросы о свободе выбора и последствиях, которые могут возникнуть из-за вмешательства в судьбы людей. Основной сюжет "Ревизии" разворачивается в недалеком будущем, где технологии достигли невероятного прогресса. Главный
Сарадзаммай
Закончен
7.47
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / сверхъестественное / фэнтези / экшен / 2019
  • Эпизоды: 11 из ?
  • Год: 2019
  • Сезон: Весна 2019
  • Время: 22 мин
  • Режиссер: Нобуюки Такэути
  • Описание: Сарадзаммай — это аниме, которое погружает зрителя в мир, наполненный мистикой, психологией и глубокими человеческими переживаниями. Созданное талантливым режиссером, это произведение выделяется яркой анимацией и оригинальным стилем повествования. Основная идея «Сарадзаммай» вращается вокруг связи между людьми, их внутренними страхами и желаниями, а также о том, как важно открываться и доверять другим. Это аниме привлекает внимание не только захватывающим сюжетом, но и философскими размышлениями о дружбе, любви и поиске себя. Основной сюжет «Сарадзаммай» начинается с того, что трое главных
Уиз
Закончен
5.52
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / 3D-графика / музыкальные / супер сила / экшен / 2019
  • Эпизоды: из ?
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 23 мин
  • Режиссер: Хиромити Канадзава, Синго Судзуки
  • Описание: Аниме "Уиз" погружает зрителя в удивительный мир, где магия, приключения и глубокие человеческие эмоции переплетаются в захватывающем сюжете. Эта история привлекает внимание благодаря ярким персонажам, уникальной анимации и продуманному миру, наполненному загадками и испытаниями. Основная идея аниме заключается в поиске смысла жизни и самопознания, что делает его особенно близким и понятным для зрителей. Сюжет "Уиз" начинается с того, что главный герой, молодой маг по имени Рен, сталкивается с неожиданной угрозой, которая ставит под сомнение мир, в котором он живет. В его
Эндро!
Закончен
6.9
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / вымышленный мир / дружба / повседневность / фэнтези / 2019
  • Эпизоды: из ?
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 23 мин
  • Режиссер: Kaori
  • Описание: Эндро! — это яркое и увлекательное аниме, которое сочетает в себе элементы фэнтези, комедии и приключений. История разворачивается в мире, полном магии и героических подвигов, где группа девушек-героинь сталкивается с необычными испытаниями. Основная идея аниме заключается в том, чтобы показать, как дружба и командная работа помогают преодолевать трудности и достигать поставленных целей. Привлекательные персонажи и их динамичные взаимодействия делают Эндро! по-настоящему запоминающимся произведением. Сюжет аниме Эндро! следует за приключениями группы девушек, которые обучаются в Академии
Юно: Девушка, что воспевает любовь на грани этого мира
Закончен
6.59
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / драма / путешествие в другой мир / фантастика / 2019
  • Эпизоды: 26 из 26
  • Год: 2019
  • Сезон: Весна 2019
  • Время: 23 мин
  • Режиссер: Tetsuo Hirakawa
  • Описание: Аниме "Юно: Девушка, что воспевает любовь на грани этого мира" погружает зрителей в волшебный и трогательный мир, где любовь и музыка становятся связующими нитями между реальностью и потусторонним. Это произведение привлекает своей уникальной концепцией, яркими персонажами и глубокими эмоциональными переживаниями, которые оставляют след в сердце каждого зрителя. Сюжет разворачивается вокруг главной героини Юно, одаренной певицы, которая обладает способностью влиять на мир вокруг нее с помощью музыки. Она живет в мире, где границы между жизнью и смертью размыты, и ее песни способны
Перекрёстный огонь: Проект «Призрак»
Закончен
  • Жанр: Все аниме в одном месте на AnimeGo / ONA / Завершён / Озвучка / военное / детектив / экшен / 2019
  • Год: 2019
  • Сезон: Лето 2019
  • Время: 21 мин
  • Описание: Перекрёстный огонь: Проект «Призрак» — это захватывающее аниме, которое погружает зрителей в мир высоких технологий, военных конфликтов и сложных человеческих отношений. Сюжет сосредоточен на группе элитных бойцов, которые используют свои уникальные навыки и способности, чтобы противостоять опасным угрозам, ставя на карту не только свои жизни, но и судьбу всего человечества. Аниме привлекает внимание зрителей динамичными боями, продуманным сюжетом и глубокими персонажами, каждый из которых имеет свои внутренние демоны и мотивации. Основной сюжет разворачивается вокруг команды, известной как
Вход Регистрация
Войти в свой аккаунт
И получить новые возможности
Забыли пароль?
/** * Получение статистики верификации ботов */ function domain_shield_get_bot_verification_stats($days = 7) { global $db; $where_clause = ''; if ($days > 0) { $where_clause = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } $result = $db->query(" SELECT COUNT(*) as total, SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified, SUM(CASE WHEN is_verified = 0 THEN 1 ELSE 0 END) as failed FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} "); if ($result && $row = $db->get_row($result)) { return [ 'total' => intval($row['total']), 'verified' => intval($row['verified']), 'failed' => intval($row['failed']) ]; } return ['total' => 0, 'verified' => 0, 'failed' => 0]; } /** * Получение детальной статистики верификации ботов */ function domain_shield_get_detailed_bot_stats($days = 7) { global $db; $where_clause = ''; if ($days > 0) { $where_clause = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } $result = $db->query(" SELECT COUNT(*) as total, SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified, SUM(CASE WHEN is_verified = 0 THEN 1 ELSE 0 END) as failed, COUNT(DISTINCT ip_address) as unique_ips FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} "); if ($result && $row = $db->get_row($result)) { return [ 'total' => intval($row['total']), 'verified' => intval($row['verified']), 'failed' => intval($row['failed']), 'unique_ips' => intval($row['unique_ips']) ]; } return ['total' => 0, 'verified' => 0, 'failed' => 0, 'unique_ips' => 0]; } /** * Получение логов верификации ботов с фильтрацией */ function domain_shield_get_bot_logs($page = 1, $limit = 50, $filter_verified = 'all', $filter_days = 7, $search_ip = '', $search_bot = '') { global $db; $offset = ($page - 1) * $limit; $where_conditions = []; // Фильтр по статусу верификации if ($filter_verified !== 'all') { $where_conditions[] = "is_verified = " . intval($filter_verified); } // Фильтр по дням if ($filter_days > 0) { $where_conditions[] = "created_at >= DATE_SUB(NOW(), INTERVAL {$filter_days} DAY)"; } // Поиск по IP if (!empty($search_ip)) { $search_ip = $db->safesql($search_ip); $where_conditions[] = "ip_address LIKE '%{$search_ip}%'"; } // Поиск по типу бота if (!empty($search_bot)) { $search_bot = $db->safesql($search_bot); $where_conditions[] = "user_agent LIKE '%{$search_bot}%'"; } $where_clause = ''; if (!empty($where_conditions)) { $where_clause = 'WHERE ' . implode(' AND ', $where_conditions); } // Получаем общее количество записей $count_result = $db->query(" SELECT COUNT(*) as total FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} "); $total = 0; if ($count_result && $count_row = $db->get_row($count_result)) { $total = intval($count_row['total']); } // Получаем записи для текущей страницы $result = $db->query(" SELECT * FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} ORDER BY created_at DESC LIMIT {$offset}, {$limit} "); $logs = []; if ($result) { while ($row = $db->get_row($result)) { $logs[] = $row; } } $pages = ceil($total / $limit); return [ 'logs' => $logs, 'total' => $total, 'pages' => $pages, 'current_page' => $page, 'per_page' => $limit ]; } /** * Экспорт логов верификации в CSV */ function domain_shield_export_bot_logs($filter_verified = 'all', $filter_days = 7, $search_ip = '', $search_bot = '') { global $db; $where_conditions = []; // Фильтр по статусу верификации if ($filter_verified !== 'all') { $where_conditions[] = "is_verified = " . intval($filter_verified); } // Фильтр по дням if ($filter_days > 0) { $where_conditions[] = "created_at >= DATE_SUB(NOW(), INTERVAL {$filter_days} DAY)"; } // Поиск по IP if (!empty($search_ip)) { $search_ip = $db->safesql($search_ip); $where_conditions[] = "ip_address LIKE '%{$search_ip}%'"; } // Поиск по типу бота if (!empty($search_bot)) { $search_bot = $db->safesql($search_bot); $where_conditions[] = "user_agent LIKE '%{$search_bot}%'"; } $where_clause = ''; if (!empty($where_conditions)) { $where_clause = 'WHERE ' . implode(' AND ', $where_conditions); } $result = $db->query(" SELECT * FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} ORDER BY created_at DESC LIMIT 10000 "); // Создаем CSV контент $csv_content = "\xEF\xBB\xBF"; // UTF-8 BOM $csv_content .= "Дата/Время,IP адрес,User-Agent,Верифицирован,Hostname,Разрешенный IP,Время верификации (мс)\n"; if ($result) { while ($row = $db->get_row($result)) { $csv_content .= sprintf( '"%s","%s","%s","%s","%s","%s","%s"' . "\n", $row['created_at'], $row['ip_address'], str_replace('"', '""', $row['user_agent']), $row['is_verified'] ? 'Да' : 'Нет', $row['hostname'] ?: 'Не разрешается', $row['resolved_ip'] ?: '', $row['verification_time'] ?: '' ); } } return $csv_content; } /** * Очистка старых логов верификации */ function domain_shield_clear_old_bot_logs($days = 30) { global $db; $days = intval($days); if ($days < 1) return false; $result = $db->query(" DELETE FROM " . PREFIX . "_domain_shield_bot_verification WHERE created_at < DATE_SUB(NOW(), INTERVAL {$days} DAY) "); return $result !== false; } /** * Верификация Google ботов по официальной методологии Google */ function domain_shield_verify_google_bot($ip_address, $user_agent = '') { $start_time = microtime(true); try { // 1. Обратный DNS запрос $hostname = gethostbyaddr($ip_address); if ($hostname === $ip_address) { // Hostname не разрешается domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } // 2. Проверяем что hostname принадлежит Google $valid_google_domains = [ '.googlebot.com', '.google.com', '.googleusercontent.com' ]; $is_valid_domain = false; foreach ($valid_google_domains as $domain) { if (substr($hostname, -strlen($domain)) === $domain) { $is_valid_domain = true; break; } } if (!$is_valid_domain) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, null, round((microtime(true) - $start_time) * 1000)); return false; } // 3. Прямой DNS запрос для проверки $resolved_ip = gethostbyname($hostname); if ($resolved_ip !== $ip_address) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return false; } // Все проверки пройдены domain_shield_log_bot_verification($ip_address, $user_agent, true, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return true; } catch (Exception $e) { domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } } /** * Получение информации о Google боте по User-Agent */ function domain_shield_get_google_bot_info($user_agent) { $ua = strtolower($user_agent); // Основные поисковые роботы Google if (strpos($ua, 'googlebot') !== false) { if (strpos($ua, 'googlebot-image') !== false) { return [ 'name' => 'Googlebot-Image', 'purpose' => 'Индексация изображений для Google Картинки', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } elseif (strpos($ua, 'googlebot-video') !== false) { return [ 'name' => 'Googlebot-Video', 'purpose' => 'Индексация видео контента', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } elseif (strpos($ua, 'googlebot-news') !== false) { return [ 'name' => 'Googlebot-News', 'purpose' => 'Индексация новостного контента', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } else { return [ 'name' => 'Googlebot', 'purpose' => 'Основной поисковый робот Google для веб-страниц', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high', 'note' => 'Главный робот для индексации веб-страниц' ]; } } // Специальные роботы Google if (strpos($ua, 'adsbot-google') !== false) { return [ 'name' => 'AdsBot-Google', 'purpose' => 'Проверка качества рекламных объявлений Google Ads', 'respects_robots' => false, 'category' => 'special', 'note' => 'Может игнорировать robots.txt при проверке рекламы' ]; } if (strpos($ua, 'feedfetcher-google') !== false) { return [ 'name' => 'Feedfetcher-Google', 'purpose' => 'Получение RSS и Atom фидов', 'respects_robots' => true, 'category' => 'special' ]; } if (strpos($ua, 'google-site-verification') !== false) { return [ 'name' => 'Google Site Verification', 'purpose' => 'Подтверждение владения сайтом в Google Search Console', 'respects_robots' => false, 'category' => 'user-triggered', 'note' => 'Инициируется пользователем' ]; } if (strpos($ua, 'google-structured-data-testing-tool') !== false) { return [ 'name' => 'Google Structured Data Testing Tool', 'purpose' => 'Тестирование структурированных данных', 'respects_robots' => false, 'category' => 'user-triggered' ]; } if (strpos($ua, 'googleother') !== false) { return [ 'name' => 'GoogleOther', 'purpose' => 'Различные внутренние сервисы Google', 'respects_robots' => true, 'category' => 'special' ]; } return null; } /** * Универсальная функция верификации поисковых ботов */ function domain_shield_verify_search_bot($ip_address, $user_agent = '') { $ua = strtolower($user_agent); // Определяем тип бота по User-Agent if (strpos($ua, 'yandex') !== false) { return [ 'bot_type' => 'yandex', 'verified' => domain_shield_verify_yandex_bot($ip_address, $user_agent), 'bot_info' => domain_shield_get_yandex_bot_info($user_agent) ]; } elseif (strpos($ua, 'google') !== false || strpos($ua, 'adsbot') !== false) { return [ 'bot_type' => 'google', 'verified' => domain_shield_verify_google_bot($ip_address, $user_agent), 'bot_info' => domain_shield_get_google_bot_info($user_agent) ]; } elseif (strpos($ua, 'bingbot') !== false || strpos($ua, 'msnbot') !== false) { return [ 'bot_type' => 'bing', 'verified' => domain_shield_verify_bing_bot($ip_address, $user_agent), 'bot_info' => domain_shield_get_bing_bot_info($user_agent) ]; } return [ 'bot_type' => 'unknown', 'verified' => false, 'bot_info' => null ]; } /** * Верификация Bing ботов */ function domain_shield_verify_bing_bot($ip_address, $user_agent = '') { $start_time = microtime(true); try { // 1. Обратный DNS запрос $hostname = gethostbyaddr($ip_address); if ($hostname === $ip_address) { domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } // 2. Проверяем что hostname принадлежит Microsoft/Bing $valid_bing_domains = [ '.search.msn.com', '.msn.com' ]; $is_valid_domain = false; foreach ($valid_bing_domains as $domain) { if (substr($hostname, -strlen($domain)) === $domain) { $is_valid_domain = true; break; } } if (!$is_valid_domain) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, null, round((microtime(true) - $start_time) * 1000)); return false; } // 3. Прямой DNS запрос для проверки $resolved_ip = gethostbyname($hostname); if ($resolved_ip !== $ip_address) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return false; } domain_shield_log_bot_verification($ip_address, $user_agent, true, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return true; } catch (Exception $e) { domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } } /** * Получение информации о Bing боте */ function domain_shield_get_bing_bot_info($user_agent) { $ua = strtolower($user_agent); if (strpos($ua, 'bingbot') !== false) { return [ 'name' => 'Bingbot', 'purpose' => 'Основной поисковый робот Bing для индексации веб-страниц', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } if (strpos($ua, 'msnbot') !== false) { return [ 'name' => 'MSNBot', 'purpose' => 'Поисковый робот Microsoft (устаревшая версия)', 'respects_robots' => true, 'category' => 'main' ]; } if (strpos($ua, 'bingpreview') !== false) { return [ 'name' => 'BingPreview', 'purpose' => 'Создание превью страниц для результатов поиска Bing', 'respects_robots' => true, 'category' => 'special' ]; } return null; } /** * Получение статистики по типам ботов */ function domain_shield_get_bot_type_stats($days = 7) { global $db; $where_clause = ''; if ($days > 0) { $where_clause = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } $result = $db->query(" SELECT CASE WHEN LOWER(user_agent) LIKE '%yandex%' THEN 'yandex' WHEN LOWER(user_agent) LIKE '%google%' OR LOWER(user_agent) LIKE '%adsbot%' THEN 'google' WHEN LOWER(user_agent) LIKE '%bing%' OR LOWER(user_agent) LIKE '%msn%' THEN 'bing' ELSE 'other' END as bot_type, COUNT(*) as total, SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified, SUM(CASE WHEN is_verified = 0 THEN 1 ELSE 0 END) as failed FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} GROUP BY bot_type ORDER BY total DESC "); $stats = []; if ($result) { while ($row = $db->get_row($result)) { $stats[$row['bot_type']] = [ 'total' => intval($row['total']), 'verified' => intval($row['verified']), 'failed' => intval($row['failed']), 'success_rate' => $row['total'] > 0 ? round(($row['verified'] / $row['total']) * 100, 1) : 0 ]; } } return $stats; }/ ** * Получение статистики верификации ботов */ function domain_shield_get_bot_verification_stats($days = 7) { global $db; $where_clause = ''; if ($days > 0) { $where_clause = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } $result = $db->query(" SELECT COUNT(*) as total, SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified, SUM(CASE WHEN is_verified = 0 THEN 1 ELSE 0 END) as failed FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} "); if ($result && $row = $db->get_row($result)) { return [ 'total' => intval($row['total']), 'verified' => intval($row['verified']), 'failed' => intval($row['failed']) ]; } return ['total' => 0, 'verified' => 0, 'failed' => 0]; } /** * Получение детальной статистики верификации ботов */ function domain_shield_get_detailed_bot_stats($days = 7) { global $db; $where_clause = ''; if ($days > 0) { $where_clause = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } $result = $db->query(" SELECT COUNT(*) as total, SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified, SUM(CASE WHEN is_verified = 0 THEN 1 ELSE 0 END) as failed, COUNT(DISTINCT ip_address) as unique_ips FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} "); if ($result && $row = $db->get_row($result)) { return [ 'total' => intval($row['total']), 'verified' => intval($row['verified']), 'failed' => intval($row['failed']), 'unique_ips' => intval($row['unique_ips']) ]; } return ['total' => 0, 'verified' => 0, 'failed' => 0, 'unique_ips' => 0]; } /** * Получение логов верификации ботов с фильтрацией */ function domain_shield_get_bot_logs($page = 1, $limit = 50, $filter_verified = 'all', $filter_days = 7, $search_ip = '', $search_bot = '') { global $db; $offset = ($page - 1) * $limit; $where_conditions = []; // Фильтр по статусу верификации if ($filter_verified !== 'all') { $where_conditions[] = "is_verified = " . intval($filter_verified); } // Фильтр по дням if ($filter_days > 0) { $where_conditions[] = "created_at >= DATE_SUB(NOW(), INTERVAL {$filter_days} DAY)"; } // Поиск по IP if (!empty($search_ip)) { $search_ip = $db->safesql($search_ip); $where_conditions[] = "ip_address LIKE '%{$search_ip}%'"; } // Поиск по типу бота if (!empty($search_bot)) { $search_bot = $db->safesql($search_bot); $where_conditions[] = "user_agent LIKE '%{$search_bot}%'"; } $where_clause = ''; if (!empty($where_conditions)) { $where_clause = 'WHERE ' . implode(' AND ', $where_conditions); } // Получаем общее количество записей $count_result = $db->query(" SELECT COUNT(*) as total FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} "); $total = 0; if ($count_result && $count_row = $db->get_row($count_result)) { $total = intval($count_row['total']); } // Получаем записи для текущей страницы $result = $db->query(" SELECT * FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} ORDER BY created_at DESC LIMIT {$offset}, {$limit} "); $logs = []; if ($result) { while ($row = $db->get_row($result)) { $logs[] = $row; } } $pages = ceil($total / $limit); return [ 'logs' => $logs, 'total' => $total, 'pages' => $pages, 'current_page' => $page, 'per_page' => $limit ]; } /** * Экспорт логов верификации в CSV */ function domain_shield_export_bot_logs($filter_verified = 'all', $filter_days = 7, $search_ip = '', $search_bot = '') { global $db; $where_conditions = []; // Фильтр по статусу верификации if ($filter_verified !== 'all') { $where_conditions[] = "is_verified = " . intval($filter_verified); } // Фильтр по дням if ($filter_days > 0) { $where_conditions[] = "created_at >= DATE_SUB(NOW(), INTERVAL {$filter_days} DAY)"; } // Поиск по IP if (!empty($search_ip)) { $search_ip = $db->safesql($search_ip); $where_conditions[] = "ip_address LIKE '%{$search_ip}%'"; } // Поиск по типу бота if (!empty($search_bot)) { $search_bot = $db->safesql($search_bot); $where_conditions[] = "user_agent LIKE '%{$search_bot}%'"; } $where_clause = ''; if (!empty($where_conditions)) { $where_clause = 'WHERE ' . implode(' AND ', $where_conditions); } $result = $db->query(" SELECT * FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} ORDER BY created_at DESC LIMIT 10000 "); // Создаем CSV контент $csv_content = "\xEF\xBB\xBF"; // UTF-8 BOM $csv_content .= "Дата/Время,IP адрес,User-Agent,Верифицирован,Hostname,Разрешенный IP,Время верификации (мс)\n"; if ($result) { while ($row = $db->get_row($result)) { $csv_content .= sprintf( '"%s","%s","%s","%s","%s","%s","%s"' . "\n", $row['created_at'], $row['ip_address'], str_replace('"', '""', $row['user_agent']), $row['is_verified'] ? 'Да' : 'Нет', $row['hostname'] ?: 'Не разрешается', $row['resolved_ip'] ?: '', $row['verification_time'] ?: '' ); } } return $csv_content; } /** * Очистка старых логов верификации */ function domain_shield_clear_old_bot_logs($days = 30) { global $db; $days = intval($days); if ($days < 1) return false; $result = $db->query(" DELETE FROM " . PREFIX . "_domain_shield_bot_verification WHERE created_at < DATE_SUB(NOW(), INTERVAL {$days} DAY) "); return $result !== false; } /** * Верификация Google ботов по официальной методологии Google */ function domain_shield_verify_google_bot($ip_address, $user_agent = '') { $start_time = microtime(true); try { // 1. Обратный DNS запрос $hostname = gethostbyaddr($ip_address); if ($hostname === $ip_address) { // Hostname не разрешается domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } // 2. Проверяем что hostname принадлежит Google $valid_google_domains = [ '.googlebot.com', '.google.com', '.googleusercontent.com' ]; $is_valid_domain = false; foreach ($valid_google_domains as $domain) { if (substr($hostname, -strlen($domain)) === $domain) { $is_valid_domain = true; break; } } if (!$is_valid_domain) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, null, round((microtime(true) - $start_time) * 1000)); return false; } // 3. Прямой DNS запрос для проверки $resolved_ip = gethostbyname($hostname); if ($resolved_ip !== $ip_address) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return false; } // Все проверки пройдены domain_shield_log_bot_verification($ip_address, $user_agent, true, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return true; } catch (Exception $e) { domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } } /** * Получение информации о Google боте по User-Agent */ function domain_shield_get_google_bot_info($user_agent) { $ua = strtolower($user_agent); // Основные поисковые роботы Google if (strpos($ua, 'googlebot') !== false) { if (strpos($ua, 'googlebot-image') !== false) { return [ 'name' => 'Googlebot-Image', 'purpose' => 'Индексация изображений для Google Картинки', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } elseif (strpos($ua, 'googlebot-video') !== false) { return [ 'name' => 'Googlebot-Video', 'purpose' => 'Индексация видео контента', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } elseif (strpos($ua, 'googlebot-news') !== false) { return [ 'name' => 'Googlebot-News', 'purpose' => 'Индексация новостного контента', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } else { return [ 'name' => 'Googlebot', 'purpose' => 'Основной поисковый робот Google для веб-страниц', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high', 'note' => 'Главный робот для индексации веб-страниц' ]; } } // Специальные роботы Google if (strpos($ua, 'adsbot-google') !== false) { return [ 'name' => 'AdsBot-Google', 'purpose' => 'Проверка качества рекламных объявлений Google Ads', 'respects_robots' => false, 'category' => 'special', 'note' => 'Может игнорировать robots.txt при проверке рекламы' ]; } if (strpos($ua, 'feedfetcher-google') !== false) { return [ 'name' => 'Feedfetcher-Google', 'purpose' => 'Получение RSS и Atom фидов', 'respects_robots' => true, 'category' => 'special' ]; } if (strpos($ua, 'google-site-verification') !== false) { return [ 'name' => 'Google Site Verification', 'purpose' => 'Подтверждение владения сайтом в Google Search Console', 'respects_robots' => false, 'category' => 'user-triggered', 'note' => 'Инициируется пользователем' ]; } if (strpos($ua, 'google-structured-data-testing-tool') !== false) { return [ 'name' => 'Google Structured Data Testing Tool', 'purpose' => 'Тестирование структурированных данных', 'respects_robots' => false, 'category' => 'user-triggered' ]; } if (strpos($ua, 'googleother') !== false) { return [ 'name' => 'GoogleOther', 'purpose' => 'Различные внутренние сервисы Google', 'respects_robots' => true, 'category' => 'special' ]; } return null; } /** * Универсальная функция верификации поисковых ботов */ function domain_shield_verify_search_bot($ip_address, $user_agent = '') { $ua = strtolower($user_agent); // Определяем тип бота по User-Agent if (strpos($ua, 'yandex') !== false) { return [ 'bot_type' => 'yandex', 'verified' => domain_shield_verify_yandex_bot($ip_address, $user_agent), 'bot_info' => domain_shield_get_yandex_bot_info($user_agent) ]; } elseif (strpos($ua, 'google') !== false || strpos($ua, 'adsbot') !== false) { return [ 'bot_type' => 'google', 'verified' => domain_shield_verify_google_bot($ip_address, $user_agent), 'bot_info' => domain_shield_get_google_bot_info($user_agent) ]; } elseif (strpos($ua, 'bingbot') !== false || strpos($ua, 'msnbot') !== false) { return [ 'bot_type' => 'bing', 'verified' => domain_shield_verify_bing_bot($ip_address, $user_agent), 'bot_info' => domain_shield_get_bing_bot_info($user_agent) ]; } return [ 'bot_type' => 'unknown', 'verified' => false, 'bot_info' => null ]; } /** * Верификация Bing ботов */ function domain_shield_verify_bing_bot($ip_address, $user_agent = '') { $start_time = microtime(true); try { // 1. Обратный DNS запрос $hostname = gethostbyaddr($ip_address); if ($hostname === $ip_address) { domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } // 2. Проверяем что hostname принадлежит Microsoft/Bing $valid_bing_domains = [ '.search.msn.com', '.msn.com' ]; $is_valid_domain = false; foreach ($valid_bing_domains as $domain) { if (substr($hostname, -strlen($domain)) === $domain) { $is_valid_domain = true; break; } } if (!$is_valid_domain) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, null, round((microtime(true) - $start_time) * 1000)); return false; } // 3. Прямой DNS запрос для проверки $resolved_ip = gethostbyname($hostname); if ($resolved_ip !== $ip_address) { domain_shield_log_bot_verification($ip_address, $user_agent, false, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return false; } domain_shield_log_bot_verification($ip_address, $user_agent, true, $hostname, $resolved_ip, round((microtime(true) - $start_time) * 1000)); return true; } catch (Exception $e) { domain_shield_log_bot_verification($ip_address, $user_agent, false, null, null, round((microtime(true) - $start_time) * 1000)); return false; } } /** * Получение информации о Bing боте */ function domain_shield_get_bing_bot_info($user_agent) { $ua = strtolower($user_agent); if (strpos($ua, 'bingbot') !== false) { return [ 'name' => 'Bingbot', 'purpose' => 'Основной поисковый робот Bing для индексации веб-страниц', 'respects_robots' => true, 'category' => 'main', 'priority' => 'high' ]; } if (strpos($ua, 'msnbot') !== false) { return [ 'name' => 'MSNBot', 'purpose' => 'Поисковый робот Microsoft (устаревшая версия)', 'respects_robots' => true, 'category' => 'main' ]; } if (strpos($ua, 'bingpreview') !== false) { return [ 'name' => 'BingPreview', 'purpose' => 'Создание превью страниц для результатов поиска Bing', 'respects_robots' => true, 'category' => 'special' ]; } return null; } /** * Получение статистики по типам ботов */ function domain_shield_get_bot_type_stats($days = 7) { global $db; $where_clause = ''; if ($days > 0) { $where_clause = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } $result = $db->query(" SELECT CASE WHEN LOWER(user_agent) LIKE '%yandex%' THEN 'yandex' WHEN LOWER(user_agent) LIKE '%google%' OR LOWER(user_agent) LIKE '%adsbot%' THEN 'google' WHEN LOWER(user_agent) LIKE '%bing%' OR LOWER(user_agent) LIKE '%msn%' THEN 'bing' ELSE 'other' END as bot_type, COUNT(*) as total, SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified, SUM(CASE WHEN is_verified = 0 THEN 1 ELSE 0 END) as failed FROM " . PREFIX . "_domain_shield_bot_verification {$where_clause} GROUP BY bot_type ORDER BY total DESC "); $stats = []; if ($result) { while ($row = $db->get_row($result)) { $stats[$row['bot_type']] = [ 'total' => intval($row['total']), 'verified' => intval($row['verified']), 'failed' => intval($row['failed']), 'success_rate' => $row['total'] > 0 ? round(($row['verified'] / $row['total']) * 100, 1) : 0 ]; } } return $stats; }