Перейти к публикации

Запрет комментировать не из России


Рекомендованные сообщения

  Всем привет.

В общем на сайте замучили комментаторы с забугорных 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>';
	}
}

 

Изменено пользователем radrigo
Ссылка на сообщение
Поделиться на других сайтах
  • radrigo изменил заголовок на Запрет комментировать не из России

не знал про этот сайт. что то не нашел сколько запросов в день можно отправить.  комменты не так часто добавляются. кэш особо там и не нужен

нашел. 15 requests per minute from an IP address для batch и 45 для обычного режима

Изменено пользователем crafic
Ссылка на сообщение
Поделиться на других сайтах
10 часов назад, Gameer сказал:

Вместо $rus_ip = $_SERVER['REMOTE_ADDR']; используйте переменную $_IP

Спасибо. Не знал, что в DLE есть такая глобальная переменная

Ссылка на сообщение
Поделиться на других сайтах
13 часов назад, radrigo сказал:

// Путь к файлу кэша для данного IP $cacheFile = $cacheDir . md5($ip) . '.json';

Представляете, сколько файлов может быть??? 

А ведь на многих хостингах есть лимиты на к-во файлов.

Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, MSK сказал:

Представляете, сколько файлов может быть??? 

А ведь на многих хостингах есть лимиты на к-во файлов.

Да, знаю. Но я писал для себя, и у меня тоже есть лимиты, которые вполне позволяют. На VIP хостинге рег.ру лимиты на количество файлов 1 млн. Сейчас мой сайт насчитывает около 200 тыс файлов.
Но без кэша будет гораздо больше обращений к сайту http://ip-api.com/, а там тоже есть лимиты. Полагаю надо кэш сохранять в папке engine/cache, которая периодически очищается. Либо же запустить какой-нибудь скрипт по крону, который будет удалять старые файлы.

Ссылка на сообщение
Поделиться на других сайтах
31.08.2023 в 17:52, radrigo сказал:

Да, знаю. Но я писал для себя, и у меня тоже есть лимиты, которые вполне позволяют. На VIP хостинге рег.ру лимиты на количество файлов 1 млн. Сейчас мой сайт насчитывает около 200 тыс файлов.
Но без кэша будет гораздо больше обращений к сайту http://ip-api.com/, а там тоже есть лимиты. Полагаю надо кэш сохранять в папке engine/cache, которая периодически очищается. Либо же запустить какой-нибудь скрипт по крону, который будет удалять старые файлы.

Для тех кто используют Cloudflre можно получить заголовок HTTP_CF_IPCOUNTRY и открыть комменты только для РФ. И никакие лимиты не нужны.

Ссылка на сообщение
Поделиться на других сайтах
31.08.2023 в 14:52, radrigo сказал:

Да, знаю. Но я писал для себя, и у меня тоже есть лимиты, которые вполне позволяют. На VIP хостинге рег.ру лимиты на количество файлов 1 млн. Сейчас мой сайт насчитывает около 200 тыс файлов.
Но без кэша будет гораздо больше обращений к сайту http://ip-api.com/, а там тоже есть лимиты. Полагаю надо кэш сохранять в папке engine/cache, которая периодически очищается. Либо же запустить какой-нибудь скрипт по крону, который будет удалять старые файлы.

Наверное стоит подумать о заранее подготовленных данных, а не дёргать сервис для каждого IP и кэшировать данные. Например есть такой сервис, https://sypexgeo.net/ru/about/.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...