88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
# weather.py
|
|
|
|
import requests
|
|
import json
|
|
import re
|
|
from datetime import datetime
|
|
from config import serviceKey, TODAY
|
|
|
|
def parse_precip(value):
|
|
if value == '강수없음':
|
|
return 0.0
|
|
elif '1mm 미만' in value:
|
|
return 0.5
|
|
else:
|
|
match = re.search(r"[\d.]+", value)
|
|
if match:
|
|
return float(match.group())
|
|
else:
|
|
return 0.0
|
|
|
|
def get_precipitation_summary(retry=True):
|
|
url = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst"
|
|
|
|
params = {
|
|
'serviceKey': serviceKey,
|
|
'numOfRows': '1000',
|
|
'pageNo': '1',
|
|
'dataType': 'JSON',
|
|
'base_date': TODAY,
|
|
'base_time': '0800',
|
|
'nx': '57',
|
|
'ny': '130'
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
|
|
try:
|
|
data = response.json()
|
|
total_rainfall = 0.0
|
|
|
|
lines = [
|
|
'<style>',
|
|
'.weatherinfo table {',
|
|
' border-collapse: collapse;',
|
|
' border-spacing: 0;',
|
|
' display: inline-table;',
|
|
'}',
|
|
'.weatherinfo td, .weatherinfo th {',
|
|
' padding: 0;',
|
|
' border: 1px solid #333;',
|
|
'}',
|
|
'.weatherinfo h3 {',
|
|
' font-size: 2em;',
|
|
' text-align: center;',
|
|
' margin: 20px 0;',
|
|
'}',
|
|
'</style>',
|
|
'<div class="weatherinfo">',
|
|
'<h3>[시간대별 강수량]</h3>',
|
|
'<table>',
|
|
'<tr><th>시간</th><th>강수량</th></tr>'
|
|
]
|
|
|
|
for item in data['response']['body']['items']['item']:
|
|
if item['category'] == 'PCP' and item['fcstDate'] == TODAY:
|
|
time = item['fcstTime'] # 예: '1100'
|
|
if 900 < int(time) < 2300:
|
|
mm = parse_precip(item['fcstValue'])
|
|
time_str = f"{time[:2]}:{time[2:]}" # '11:00'
|
|
lines.append(f'<tr><td>{time_str}</td><td>{mm}mm</td></tr>')
|
|
total_rainfall += mm
|
|
|
|
lines.append('</table></div>')
|
|
lines.append(f'<p style="text-align:center;">영업시간 중 총 예상 강수량: <strong>{total_rainfall:.1f}mm</strong></p>')
|
|
|
|
return ''.join(lines)
|
|
|
|
except json.decoder.JSONDecodeError:
|
|
if retry:
|
|
print("⚠️ JSON 디코드 오류 발생, 재시도 중...")
|
|
return get_precipitation_summary(retry=False)
|
|
else:
|
|
return "⚠️ 응답이 JSON 형식이 아닙니다."
|
|
|
|
# 테스트용
|
|
if __name__ == "__main__":
|
|
print(get_precipitation_summary())
|