프로그래밍/자바스크립트
JS : 오늘, 내일 날씨 및 온도 구현하기 (openweathermap 활용)
재우니
2024. 10. 31. 22:01
API KEY
https://home.openweathermap.org/api_keys
API 문서
https://openweathermap.org/forecast5
활용 자료
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>오늘과 내일의 날씨</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
}
.weather-container {
display: inline-block;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
margin: 10px;
}
</style>
</head>
<body>
<h1>오늘과 내일의 날씨</h1>
<div id="today-weather" class="weather-container">
<h2>오늘</h2>
<p id="today-status">날씨 정보를 불러오는 중...</p>
<img id="today-icon" src="" alt="오늘 날씨 아이콘" style="display: none;">
</div>
<div id="tomorrow-weather" class="weather-container">
<h2>내일</h2>
<p id="tomorrow-status">날씨 정보를 불러오는 중...</p>
<img id="tomorrow-icon" src="" alt="내일 날씨 아이콘" style="display: none;">
</div>
<script>
const apiKey = ""; // 발급받은 API 키를 입력하세요
const lat = "37.5665"; // 서울의 위도
const lon = "126.9780"; // 서울의 경도
const forecastUrl = `https://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lon}&appid=${apiKey}&units=metric&lang=kr`;
const weatherDescKo = {
201: '가벼운 비를 동반한 천둥구름', 200: '비를 동반한 천둥구름', 202: '폭우를 동반한 천둥구름', 210: '약한 천둥구름', 211: '천둥구름',
212: '강한 천둥구름', 221: '불규칙적 천둥구름', 230: '약한 연무를 동반한 천둥구름', 231: '연무를 동반한 천둥구름', 232: '강한 안개비를 동반한 천둥구름',
300: '가벼운 안개비', 301: '안개비', 302: '강한 안개비', 310: '가벼운 적은비', 311: '적은비', 312: '강한 적은비', 313: '소나기와 안개비',
314: '강한 소나기와 안개비', 321: '소나기', 500: '약한 비', 501: '중간 비', 502: '강한 비', 503: '매우 강한 비', 504: '극심한 비', 511: '우박',
520: '약한 소나기 비', 521: '소나기 비', 522: '강한 소나기 비', 531: '불규칙적 소나기 비', 600: '가벼운 눈', 601: '눈', 602: '강한 눈',
611: '진눈깨비', 612: '소나기 진눈깨비', 615: '약한 비와 눈', 616: '비와 눈', 620: '약한 소나기 눈', 621: '소나기 눈', 622: '강한 소나기 눈',
701: '박무', 711: '연기', 721: '연무', 731: '모래 먼지', 741: '안개', 751: '모래', 761: '먼지', 762: '화산재', 771: '돌풍', 781: '토네이도',
800: '구름 한 점 없는 맑은 하늘', 801: '약간의 구름이 낀 하늘', 802: '드문드문 구름이 낀 하늘', 803: '구름이 거의 없는 하늘', 804: '구름으로 뒤덮인 흐린 하늘'
};
async function getWeather() {
try {
const response = await fetch(forecastUrl);
const data = await response.json();
const today = new Date();
const tomorrow = new Date();
tomorrow.setDate(today.getDate() + 1);
let todayForecast = null;
let tomorrowForecast = null;
data.list.forEach(item => {
const forecastDate = new Date(item.dt_txt);
if (!todayForecast && forecastDate.getDate() === today.getDate()) {
todayForecast = item;
}
if (!tomorrowForecast && forecastDate.getDate() === tomorrow.getDate()) {
tomorrowForecast = item;
}
});
if (todayForecast) {
const todayDesc = weatherDescKo[todayForecast.weather[0].id] || todayForecast.weather[0].description;
document.getElementById("today-status").innerText = `상태: ${todayDesc}, 온도: ${todayForecast.main.temp}°C`;
document.getElementById("today-icon").src = `https://openweathermap.org/img/wn/${todayForecast.weather[0].icon}.png`;
document.getElementById("today-icon").style.display = "inline";
} else {
document.getElementById("today-status").innerText = "오늘의 날씨 정보를 불러오지 못했습니다.";
}
if (tomorrowForecast) {
const tomorrowDesc = weatherDescKo[tomorrowForecast.weather[0].id] || tomorrowForecast.weather[0].description;
document.getElementById("tomorrow-status").innerText = `상태: ${tomorrowDesc}, 온도: ${tomorrowForecast.main.temp}°C`;
document.getElementById("tomorrow-icon").src = `https://openweathermap.org/img/wn/${tomorrowForecast.weather[0].icon}.png`;
document.getElementById("tomorrow-icon").style.display = "inline";
} else {
document.getElementById("tomorrow-status").innerText = "내일의 날씨 정보를 불러오지 못했습니다.";
}
} catch (error) {
console.error("날씨 정보를 가져오는 중 오류 발생:", error);
document.getElementById("today-status").innerText = "날씨 정보를 불러오지 못했습니다.";
document.getElementById("tomorrow-status").innerText = "날씨 정보를 불러오지 못했습니다.";
}
}
getWeather();
</script>
</body>
</html>
참고 사이트
https://gist.github.com/choipd/e73201a4653a5e56e830