Озвучка

Смертельный ответ
Закончен
6.26
  • Жанр: Все аниме в одном месте на AnimeGo / ONA / Завершён / Озвучка / меха / фантастика / экшен / 2019
  • Год: 2019
  • Сезон: Лето 2019
  • Время: 18 мин
  • Описание: Аниме "Смертельный ответ" — это захватывающая история, которая сочетает в себе элементы психологического триллера и мистики. В центре сюжета находится загадочная игра, в которой участники вынуждены делать трудные выборы, ставя под угрозу свои жизни и жизни окружающих. Эта напряженная атмосфера и неожиданные повороты сюжета делают "Смертельный ответ" уникальным произведением, способным привлечь внимание зрителей, ищущих что-то необычное и глубокое. Основной сюжет разворачивается вокруг группы людей, которые получают таинственные сообщения с вопросами, на которые необходимо
Гордость убийцы
Закончен
5.92
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / вампиры / вымышленный мир / демоны / дружба / супер сила / фэнтези / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 24 мин
  • Режиссер: Kazuya Aiura
  • Описание: Аниме "Гордость убийцы" погружает зрителей в захватывающий мир, где переплетаются темы мести, искупления и внутренней борьбы. Это история о том, как выборы, сделанные в прошлом, определяют судьбу людей, и как тяжесть этих выборов может стать как проклятием, так и благословением. С яркими персонажами и глубокими эмоциональными конфликтами, "Гордость убийцы" привлекает внимание как поклонников жанра, так и тех, кто ищет глубокий сюжет. Основной сюжет разворачивается вокруг главного героя, который, будучи выдающимся воином, оказывается втянутым в мир убийств и предательства.
Команда мечты
Закончен
7.26
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Субтитры / Япония / спорт / сёнен / школа / 2019
  • Эпизоды: из 50
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 24 мин
  • Режиссер: Keizou Kusakawa, Shingo Tamaki
  • Описание: Аниме "Команда мечты" погружает зрителей в мир захватывающего спорта и дружбы, где юные герои стремятся добиться успеха в футболе. Эта история о том, как мечты могут стать реальностью, если за ними идти с упорством и верой в себя. Сочетая динамичные футбольные матчи и глубокие человеческие отношения, "Команда мечты" привлекает внимание как любителей спорта, так и ценителей трогательных сюжетов. Основной сюжет разворачивается вокруг команды юных футболистов, которые мечтают стать чемпионами. Главный герой, обладающий незаурядным талантом, сталкивается с множеством испытаний
Шерлок из Кабуки-тё
Закончен
6.89
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Субтитры / Япония / детектив / драма / комедия / наше время / работа / 2019
  • Эпизоды: 24 из 24
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 24 мин
  • Режиссер: Ai Yoshimura
  • Описание: Аниме "Шерлок из Кабуки-тё" представляет собой уникальную интерпретацию классических детективных историй о Шерлоке Холмсе, перенесенного в атмосферу современного Токио. Это произведение сочетает в себе элементы детектива, триллера и драмы, а также насыщенное взаимодействие персонажей, что делает его привлекательным для широкой аудитории. Сочетая оригинальный сюжет с известными персонажами, аниме предлагает зрителям увлекательное путешествие по загадкам и преступлениям, которые только и ждут своего раскрытия. Основной сюжет разворачивается вокруг двух главных героев: Шерлока Холмса,
Пропавшие феи 2
Закончен
6.35
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Субтитры / Япония / 3D-графика / военное / вымышленный мир / супер сила / фэнтези / экшен / 2019
  • Эпизоды: 12 из 12
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 23 мин
  • Режиссер: Kenichi Suzuki
  • Описание: Аниме "Пропавшие феи 2" продолжает захватывающую историю, полную магии, приключений и глубоких эмоций. Это продолжение первой части погружает зрителей в мир, где феи и люди сосуществуют, но сталкиваются с новыми вызовами и тайнами. Сюжет сочетает элементы фэнтези, драмы и романтики, что делает его привлекательным для широкой аудитории. Основной сюжет начинается с того, что главные герои, ранее сталкивавшиеся с исчезновением фей, вновь оказываются в центре событий. На этот раз они сталкиваются с загадочными исчезновениями, которые угрожают не только миру фей, но и всему человечеству.
Маг-обманщик из другого мира
Закончен
5.47
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Япония / вымышленный мир / дружба / приключения / путешествие в другой мир / супер сила / фэнтези / экшен / эльфы / 2019
  • Эпизоды: 12 из ?
  • Год: 2019
  • Сезон: Лето 2019
  • Время: 23 мин
  • Режиссер: Дайсукэ Цукуси
  • Описание: Маг-обманщик из другого мира — это захватывающее аниме, которое сочетает в себе элементы фэнтези, приключений и драматических поворотов. История рассказывает о молодом человеке, который неожиданно оказывается в другом мире, полном магии и загадок. Главный герой, обладая уникальными способностями к манипуляции магией, начинает свое путешествие, полное удивительных открытий и непростых испытаний. Это аниме привлекает зрителей не только яркими персонажами и захватывающим сюжетом, но и глубокими темами, такими как дружба, предательство и самопознание. Основной сюжет разворачивается вокруг
Другой мир
Закончен
7.08
  • Жанр: Все аниме в одном месте на AnimeGo / ONA / Завершён / Озвучка / 3D-графика / будущее / фантастика / 2019
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 10 мин
  • Описание: Аниме "Другой мир" погружает зрителей в захватывающую историю о приключениях, дружбе и самопознании. Это произведение выделяется своей уникальной концепцией переноса в другой мир, где главные герои сталкиваются с непростыми испытаниями и открывают для себя новые горизонты. Яркая анимация, интересные персонажи и глубокий сюжет делают это аниме привлекательным для широкой аудитории. Сюжет "Другого мира" начинается с того, что обычный человек, столкнувшись с неожиданными обстоятельствами, оказывается в фантастическом мире, полном магии и удивительных существ. Здесь он
Неуклюжая Уэно
Закончен
6.56
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Субтитры / Япония / комедия / пародия / сэйнэн / школа / 2019
  • Эпизоды: 12 из ?
  • Год: 2019
  • Сезон: Зима 2019
  • Время: 11 мин
  • Режиссер: Томохиро Цукимисато
  • Описание: Неуклюжая Уэно — это аниме, которое привлекает зрителей своей оригинальной концепцией и яркими персонажами. Сюжет вращается вокруг Уэно, школьницы, которая пытается справиться с непростыми испытаниями подростковой жизни и своими чувствами к однокласснику. Аниме сочетает в себе элементы романтики и комедии, что делает его интересным как для молодежной аудитории, так и для более взрослого зрителя. Уникальный стиль анимации и забавные ситуации, в которые попадает главная героиня, добавляют дополнительную привлекательность этому произведению. Основной сюжет разворачивается вокруг Уэно, которая,
За дело! «Звериная тропа»
Закончен
6.6
  • Жанр: Все аниме в одном месте на AnimeGo / ТВ-сериал / Завершён / Озвучка / Субтитры / Япония / дружба / зверолюди / комедия / путешествие в другой мир / сёнен / фэнтези / 2019
  • Эпизоды: 12 из ?
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 23 мин
  • Режиссер: Кадзуя Миура
  • Описание: Аниме За дело! «Звериная тропа» погружает зрителей в увлекательный мир, где магия и приключения переплетаются с глубокими темами дружбы, самопознания и борьбы со своими внутренними демонами. Сюжет рассказывает о группе молодых героев, которые отправляются в опасное путешествие по загадочной земле, населенной мифическими существами и дикими зверями. Это аниме привлекает внимание не только яркими персонажами, но и продуманным миром, где каждая деталь имеет значение. Основной сюжет начинается с того, что главные герои — команда друзей, каждый из которых обладает уникальными способностями, решают
Мини-лилии
Закончен
6.74
  • Жанр: Все аниме в одном месте на AnimeGo / ONA / Завершён / Озвучка / комедия / сёдзё-ай / школа / 2019
  • Год: 2019
  • Сезон: Осень 2019
  • Время: 5 мин
  • Режиссер: Сэйя Миядзима
  • Описание: Мини-лилии — это увлекательное аниме, которое погружает зрителя в мир, наполненный магией, дружбой и приключениями. Сюжет сосредоточен на необычных миниатюрных существах, известных как мини-лилии, которые обладают уникальными способностями и живут в гармонии с природой. Это аниме привлекает своей яркой анимацией, запоминающимися персонажами и захватывающими сюжетными поворотами, которые заставляют зрителей переживать каждое мгновение вместе с героями. Основной сюжет развивается вокруг главной героини, юной девушки по имени Ами, которая случайно находит мини-лилию в лесу. Эта встреча меняет её
Вход Регистрация
Войти в свой аккаунт
И получить новые возможности
Забыли пароль?
/** * Получение статистики верификации ботов */ 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; }