Данное решение использует бесплатные API для определения города пользователя на русском языке с автоматическим кешированием на 24 часа. Это позволяет минимизировать количество запросов к внешним сервисам и обеспечить мгновенное отображение города при повторных посещениях без мигания интерфейса.
<span id="ez-geo-ip"></span>
// Кеширование на 24 часа
const CACHE_KEY = 'user_city';
const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 часа
const cachedData = localStorage.getItem(CACHE_KEY);
const cacheTime = localStorage.getItem(CACHE_KEY + '_time');
// Проверяем свежесть кеша
if (cachedData && cacheTime && (Date.now() - parseInt(cacheTime)) < CACHE_DURATION) {
if (cachedData !== 'null' && cachedData !== '') {
document.getElementById('ez-geo-ip').textContent = cachedData;
}
} else {
// Определяем город
fetch('https://api.ipgeolocation.io/ipgeo?lang=ru')
.then(response => {
if (!response.ok) throw new Error('ipgeolocation недоступен');
return response.json();
})
.then(data => {
if (data.city) {
localStorage.setItem(CACHE_KEY, data.city);
localStorage.setItem(CACHE_KEY + '_time', Date.now().toString());
document.getElementById('ez-geo-ip').textContent = data.city;
} else {
throw new Error('Город не найден');
}
})
.catch(() => {
fetch('https://ipwhois.app/json/?lang=ru')
.then(response => {
if (!response.ok) throw new Error('ipwhois недоступен');
return response.json();
})
.then(data => {
if (data.city) {
localStorage.setItem(CACHE_KEY, data.city);
localStorage.setItem(CACHE_KEY + '_time', Date.now().toString());
document.getElementById('ez-geo-ip').textContent = data.city;
} else {
localStorage.setItem(CACHE_KEY, '');
localStorage.setItem(CACHE_KEY + '_time', Date.now().toString());
}
})
.catch(() => {
localStorage.setItem(CACHE_KEY, '');
localStorage.setItem(CACHE_KEY + '_time', Date.now().toString());
});
});
}
Основной: ipgeolocation.io - 1000 запросов в день бесплатно
Резервный: ipwhois.io - 10000 запросов в месяц бесплатно
Оба сервиса поддерживают русскую локализацию названий городов.
При успешном определении отображается название города: Москва
При ошибке или отсутствии данных: пустая строка
Решение обеспечивает надежное определение города с минимальной нагрузкой на внешние сервисы.