tubeCoding
Python
Java demo
한국어(ko)
English(en)
한국어(ko)
로그인
회원가입
새 파일
CSV 파일 추가
파일 이름
취소
파일 생성
코드 실행
해당 파일은 텍스트 편집기에서 표시할 수 없습니다.
콘솔 출력
[{"type": "TextFile", "filename": "main.py", "content": "import requests\r\nimport xml.etree.ElementTree as ET\r\nfrom datetime import datetime, timedelta\r\n\r\n# \uae30\uc0c1\uccad API \uc815\ubcf4\r\nSERVICE_KEY = \"m9JDST5bopm1QCsGbMHOiMil9Cj2y1F/V3doZqx0BtR4UN8/zwHZZtZ+sBVh/TT5m5EoXMNmdLO5Z9RH5dCyKQ==\"\r\nNX, NY = \"60\", \"127\" # \uac01 \uc9c0\uc5ed \uc88c\ud45c(\uc608\uc2dc\ub294 \uc11c\uc6b8)\r\n\r\ndef base_dt():\r\n now = datetime.now().replace(second=0, microsecond=0)\r\n base_time = now.replace(minute=0)\r\n if now.minute < 45:\r\n base_time -= timedelta(hours=1)\r\n return base_time.strftime(\"%Y%m%d\"), base_time.strftime(\"%H%M\")\r\n\r\ndef pty_text(code: str) -> str:\r\n return {\r\n \"0\": \"\ub9d1\uc74c\",\r\n \"1\": \"\ube44\",\r\n \"2\": \"\ube44/\ub208\",\r\n \"3\": \"\ub208\",\r\n \"4\": \"\uc18c\ub098\uae30\",\r\n \"5\": \"\ube57\ubc29\uc6b8\",\r\n \"6\": \"\ube57\ubc29\uc6b8/\ub208\ub0a0\ub9bc\",\r\n \"7\": \"\ub208\ub0a0\ub9bc\",\r\n }.get(code, \"\ub9d1\uc74c\")\r\n\r\ndef pty_emoji(text: str) -> str:\r\n if \"\ube44\" in text or \"\uc18c\ub098\uae30\" in text or \"\ube57\ubc29\uc6b8\" in text:\r\n return \"\ud83c\udf27\ufe0f\"\r\n if \"\ub208\" in text:\r\n return \"\u2744\ufe0f\"\r\n if \"\ub9d1\uc74c\" in text:\r\n return \"\u2600\ufe0f\"\r\n return \"\u2601\ufe0f\"\r\n\r\n# API \uc694\uccad \u2192 XML \ud30c\uc2f1 \u2192 \uac12 \ucd94\ucd9c\r\ndef fetch_nowcast(nx=NX, ny=NY):\r\n base_date, base_time = base_dt()\r\n url = \"http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst\"\r\n params = {\r\n \"serviceKey\": SERVICE_KEY,\r\n \"numOfRows\": \"100\",\r\n \"pageNo\": \"1\",\r\n \"dataType\": \"XML\",\r\n \"base_date\": base_date,\r\n \"base_time\": base_time,\r\n \"nx\": nx,\r\n \"ny\": ny,\r\n }\r\n r = requests.get(url, params=params, timeout=8)\r\n r.raise_for_status()\r\n root = ET.fromstring(r.content)\r\n\r\n # \uc624\ub958 \uba54\uc2dc\uc9c0 \ud655\uc778(\uc788\uc73c\uba74 \uc9c4\ub2e8\uc6a9 \ucd9c\ub825)\r\n result_msg = root.findtext(\".//resultMsg\")\r\n if result_msg and result_msg != \"NORMAL_SERVICE\":\r\n print(\"[\uc9c4\ub2e8] resultMsg:\", result_msg)\r\n\r\n data = {}\r\n for it in root.findall(\".//item\"):\r\n c = it.findtext(\"category\")\r\n v = it.findtext(\"obsrValue\") # \uc2e4\ud669 \uac12\r\n if c and v:\r\n data[c] = v\r\n info = {\r\n \"base\": f\"{base_date} {base_time[:2]}:{base_time[2:]}\",\r\n \"T1H\": data.get(\"T1H\", \"-\"), # \uae30\uc628(\u2103)\r\n \"REH\": data.get(\"REH\", \"-\"), # \uc2b5\ub3c4(%)\r\n \"WSD\": data.get(\"WSD\", \"-\"), # \ud48d\uc18d(m/s)\r\n \"PTY\": pty_text(data.get(\"PTY\", \"0\")),\r\n }\r\n return info\r\n\r\n# \ucf58\uc194 \ucd9c\ub825\r\ndef print_console(info):\r\n icon = pty_emoji(info[\"PTY\"])\r\n print(\"== \ub098\uc758 \ub0a0\uc528 \ub300\uc2dc\ubcf4\ub4dc (\ucf58\uc194) ==\")\r\n print(f\"\uae30\uc900 \uc2dc\uac01 : {info['base']} (45\ubd84 \uaddc\uce59 \uc801\uc6a9)\")\r\n print(f\"\uac15\uc218 \ud615\ud0dc : {info['PTY']} {icon}\")\r\n print(f\"\uae30\uc628(\u2103) : {info['T1H']}\")\r\n print(f\"\uc2b5\ub3c4(%) : {info['REH']}\")\r\n print(f\"\ud48d\uc18d(m/s) : {info['WSD']}\")\r\n\r\n# \uba54\uc778\r\nif __name__ == \"__main__\":\r\n try:\r\n info = fetch_nowcast()\r\n print_console(info)\r\n except Exception as e:\r\n print(\"[\uc5d0\ub7ec]\", e)", "locked": true}]