radrigo 180 Опубликовано: 30 августа 2023 Рассказать Опубликовано: 30 августа 2023 (изменено) Всем привет. В общем на сайте замучили комментаторы с забугорных IP-адресов. Решил написать плагин, чтобы можно было добавлять комментарии только с российских ip-адресов. Или же чтобы гости не могли добавлять комментарии с зарубежных ip-адресов. Ниже пример плагина, который запрещает добавлять комментарии гостям с зарубежных ip-адресов, если конечно на сайте включена возможность комментировать гостям. Для определения страны по ip-адресу использовал сайт http://ip-api.com/. Собственно может кому пригодится. И может быть кто подскажет, если что-то сделал не так. Постарался расписать всё максимально для понимания В файле engine/modules/show.full.php находим $tpl->compile( 'addcomments' ); $tpl->clear(); Ниже добавляем if ($is_logged === false) { function checkLocation($ip) { // Папка для кэша $cacheDir = 'cache/ip/'; $timeCache = 60 * 60 * 24 * 7; if (!file_exists($cacheDir)) { mkdir($cacheDir, 0755, true); } // Путь к файлу кэша для данного IP $cacheFile = $cacheDir . md5($ip) . '.json'; // Если файл кэша существует и не просрочен, используем его данные if (file_exists($cacheFile) && time() - filemtime($cacheFile) < $timeCache) { $cachedData = file_get_contents($cacheFile); $data = json_decode($cachedData, true); // Получаем данные о стране из кэша return $data['country']; } else { // Формируем URL запроса к сервису определения местоположения IP $url = "http://ip-api.com/json/{$ip}"; // Отправляем GET-запрос и получаем ответ $context = stream_context_create(array( 'http' => array( 'timeout' => 2 ) )); $response = @file_get_contents($url, false, $context); if ($response !== false) { // Декодируем JSON-ответ $data = json_decode($response, true); // Кэшируем полученные данные file_put_contents($cacheFile, $response); // Получаем страну комментатора return $data['country']; } else { // В случае превышения лимита запроса проверяем наличие кэша if (file_exists($cacheFile)) { $cachedData = file_get_contents($cacheFile); $data = json_decode($cachedData, true); // Получаем данные о стране из кэша return $data['country']; } else { // Если кэша нет, то присваиваем страну 'Russia' return 'Russia'; } } } } // Определяем ip-адрес $rus_ip = $_SERVER['REMOTE_ADDR']; if (checkLocation($rus_ip) != 'Russia') { // Если не из России, то выводим наш html-код $tpl->result['addcomments'] = '<div class="not_add_com" id="addcomment"><div class="coments__text"><b>Гости</b> из вашей страны не могут оставлять комментарии на сайте. Авторизируйтесь или <b><a href="/index.php?do=register">пройдите регистрацию</a></b>.</div></div>'; } } Изменено 30 августа 2023 пользователем radrigo Цитата Ссылка на сообщение Поделиться на других сайтах
Gameer 310 Опубликовано: 31 августа 2023 Рассказать Опубликовано: 31 августа 2023 Вместо $rus_ip = $_SERVER['REMOTE_ADDR']; используйте переменную $_IP 1 1 Цитата Ссылка на сообщение Поделиться на других сайтах
crafic 32 Опубликовано: 31 августа 2023 Рассказать Опубликовано: 31 августа 2023 (изменено) не знал про этот сайт. что то не нашел сколько запросов в день можно отправить. комменты не так часто добавляются. кэш особо там и не нужен нашел. 15 requests per minute from an IP address для batch и 45 для обычного режима Изменено 31 августа 2023 пользователем crafic Цитата Ссылка на сообщение Поделиться на других сайтах
radrigo 180 Опубликовано: 31 августа 2023 Рассказать Опубликовано: 31 августа 2023 Автор 10 часов назад, Gameer сказал: Вместо $rus_ip = $_SERVER['REMOTE_ADDR']; используйте переменную $_IP Спасибо. Не знал, что в DLE есть такая глобальная переменная Цитата Ссылка на сообщение Поделиться на других сайтах
MSK 289 Опубликовано: 31 августа 2023 Рассказать Опубликовано: 31 августа 2023 13 часов назад, radrigo сказал: // Путь к файлу кэша для данного IP $cacheFile = $cacheDir . md5($ip) . '.json'; Представляете, сколько файлов может быть??? А ведь на многих хостингах есть лимиты на к-во файлов. Цитата Ссылка на сообщение Поделиться на других сайтах
radrigo 180 Опубликовано: 31 августа 2023 Рассказать Опубликовано: 31 августа 2023 Автор 15 минут назад, MSK сказал: Представляете, сколько файлов может быть??? А ведь на многих хостингах есть лимиты на к-во файлов. Да, знаю. Но я писал для себя, и у меня тоже есть лимиты, которые вполне позволяют. На VIP хостинге рег.ру лимиты на количество файлов 1 млн. Сейчас мой сайт насчитывает около 200 тыс файлов. Но без кэша будет гораздо больше обращений к сайту http://ip-api.com/, а там тоже есть лимиты. Полагаю надо кэш сохранять в папке engine/cache, которая периодически очищается. Либо же запустить какой-нибудь скрипт по крону, который будет удалять старые файлы. Цитата Ссылка на сообщение Поделиться на других сайтах
Хоббит 35 Опубликовано: 7 сентября 2023 Рассказать Опубликовано: 7 сентября 2023 31.08.2023 в 17:52, radrigo сказал: Да, знаю. Но я писал для себя, и у меня тоже есть лимиты, которые вполне позволяют. На VIP хостинге рег.ру лимиты на количество файлов 1 млн. Сейчас мой сайт насчитывает около 200 тыс файлов. Но без кэша будет гораздо больше обращений к сайту http://ip-api.com/, а там тоже есть лимиты. Полагаю надо кэш сохранять в папке engine/cache, которая периодически очищается. Либо же запустить какой-нибудь скрипт по крону, который будет удалять старые файлы. Для тех кто используют Cloudflre можно получить заголовок HTTP_CF_IPCOUNTRY и открыть комменты только для РФ. И никакие лимиты не нужны. Цитата Ссылка на сообщение Поделиться на других сайтах
TeraMoune 56 Опубликовано: 7 сентября 2023 Рассказать Опубликовано: 7 сентября 2023 31.08.2023 в 14:52, radrigo сказал: Да, знаю. Но я писал для себя, и у меня тоже есть лимиты, которые вполне позволяют. На VIP хостинге рег.ру лимиты на количество файлов 1 млн. Сейчас мой сайт насчитывает около 200 тыс файлов. Но без кэша будет гораздо больше обращений к сайту http://ip-api.com/, а там тоже есть лимиты. Полагаю надо кэш сохранять в папке engine/cache, которая периодически очищается. Либо же запустить какой-нибудь скрипт по крону, который будет удалять старые файлы. Наверное стоит подумать о заранее подготовленных данных, а не дёргать сервис для каждого IP и кэшировать данные. Например есть такой сервис, https://sypexgeo.net/ru/about/. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.