๐ฏ ์ ๋ชฉ: 10๋ถ ๋ง์ ์์ฑํ๋ ๋ง์ถคํ ๋ ์จ ์๋ฆผ ํ์ด์ฌ ์คํฌ๋ฆฝํธ
๐ฆ๏ธ ์ฌ๋ฌ๋ถ, ํน์ ์ค๋งํธํฐ์ ๋ ์จ ์๋ฆผ์ด ๋งค๋ฒ ๊ทธ๋ฅ ๋์ด๊ฐ๊ฑฐ๋ ๋๋ฌด ์ผ๋ฐ์ ์ด์ด์ ๋ต๋ตํ์ จ๋์? ๐ง ์๋๋ฉด ๋ด๊ฐ ์ํ๋ ํ๊ธฐ ๋ฐฉ์์ผ๋ก, ํน์ ์ง์ญ ๋ ์จ๋ง ๋ฑ๋ฑ ๋ง์ถฐ์ ๋ฐ๊ณ ์ถ์๋ฐ ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ์ ๊ณ ๋ฏผ ์ค์ด์ ๊ฐ์? โ๏ธ ์ค๋์ ๋ฑ 10๋ถ์ด๋ฉด ์์ฑํ ์ ์๋ ‘๋ง์ถคํ ๋ ์จ ์๋ฆผ ํ์ด์ฌ ์คํฌ๋ฆฝํธ’์ ๋ํด ์๊ฐํ ๊ฒ์! ๐ ์ด ๊ธ์ ๋๊น์ง ์ฝ์ผ๋ฉด ๋๊ตฌ๋ ์์ฝ๊ฒ ์์ ๋ง์ ๋ ์จ ์๋ฆผ ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ณผ ์ ์์ต๋๋ค! ๐
๐ ์ค๋ ์ฃผ์ ๋ฌด์?
์ด ๊ธ์์๋ ํ์ด์ฌ(Python)์ ํ์ฉํ์ฌ ๊ฐ์ธ ๋ง์ถคํ ๋ ์จ ์๋ฆผ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ณผ์ ์ ์์ธํ๊ฒ ์๋ดํฉ๋๋ค. ๐ ์ด๋ณด์๋ ๋ฐ๋ผ ํ ์ ์๋๋ก ๋จ๊ณ๋ณ๋ก ์ฌ์ด ์ค๋ช ๊ณผ ํจ๊ป, ์ค์ฉ์ ์ธ ํ๋ ๊ฐ๋ ๋ฃ์์ด์! ๐
๐ฅ ์ ์ด ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ๊ฐ?
- โ ์ธํฐ๋ท ๋ ์จ ์๋น์ค ๋์ , ์ํ๋ ์ง์ญ ์ ๋ณด๋ง ๋น ๋ฅด๊ฒ ๋ฐ๊ณ ์ถ์ ๋
- โ ํน์ ์กฐ๊ฑด(๋ ์จ ๋น/๋/๊ตฌ๋ฆ ๋ง์/๊ธฐ์จ ๋ฑ)์ ๋ง๋ ์๋ฆผ๋ง ๋ฐ๊ณ ์ถ์ ๋
- โ ๋๋ง์ ๋ง์ถคํ ์๋ฆผ ์์คํ ์ ์ง์ ๋ง๋ค์ด ๋ณผ ์์ ์ด ์๊ธธ ๋
- โ 10๋ถ ๋ง์ ์์ฑํ๋ ์ฌ์ด ํ๋ก์ ํธ๋ก, ํ์ด์ฌ ๊ธฐ์ด ์ค๋ ฅ์ ๋์ด๊ณ ์ถ์ ๋
๐ ์ง๊ธ ๋ฐ๋ก ์์ํด ๋ณผ๊น์?
๐ป ํ์ํ ๊ฒ๊ณผ ์ฌ์ ์ค๋น
๐ ๊ธฐ๋ณธ ์กฐ๊ฑด
- Python 3.x ๋ฒ์ ์ค์น โ (Python ๊ณต์ ํํ์ด์ง์์ ๋ฌด๋ฃ ๋ค์ด๋ก๋!)
- ์ธํฐ๋ท ์ฐ๊ฒฐ OK ๐
- ๊ฐ๋จํ ํ ์คํธ ์๋ํฐ (VSCode, ์์๋ธ ๋ฑ ์ถ์ฒ) ๐
๐ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- requests (์น ์์ฒญ์ฉ) โ
- schedule (์ค์ผ์ค๋ฌ) โ
- pandas (์๋ฃ์ฒ๋ฆฌ์ฉ, ์ ํ์ ) โ
bash
pip install requests schedule pandas
๐ API ํค ๋ฐ๊ธ ํ์
- OpenWeatherMap ๋๋ ๊ธฐ์์ฒญ OpenAPI ํ์ฉ ์ถ์ฒ โ๏ธ
- ๋ฌด๋ฃ ํ๋์ผ๋ก ์ถฉ๋ถํ ๊ฐ๋ฅ!
๐งฉ ํต์ฌ ๋จ๊ณ๋ณ ๊ตฌํ ๋ฐฉ๋ฒ
1. โ๏ธ API ์ฐ๋ ์ค๋นํ๊ธฐ
- ๋ฌด๋ฃ API ํค ๋ฐ๊ธ ํ, API ์๋ํฌ์ธํธ(URL) ํ ์คํธ
- ์์ ์ด ์ํ๋ ์ง์ญ(์๋, ๊ฒฝ๋ ๋๋ ๋์๋ช ) ํ์ ์ ๋ณด ์ ๋ ฅ
๐น ์์: OpenWeatherMap API ๊ตฌ์กฐ
python
api_key = "๋น์ ์_APIํค"
city = "์์ธ"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
2. ๐ข ๋ ์จ ๋ฐ์ดํฐ ์์ฒญ ๋ฐ ํ์ฑํ๊ธฐ
- requests๋ก API ํธ์ถ ํ, JSON ํ์์ผ๋ก ๋ฐ์์ค๊ธฐ
- ๋์ ๋๋ฆฌ์์ ์ํ๋ ์ ๋ณด ์ถ์ถ (์จ๋, ๊ฐ์๋, ๋ ์จ ์ํ ๋ฑ)
python
import requests
response = requests.get(url)
data = response.json()
์จ๋ = data['main']['temp']
๋ ์จ์ํ = data['weather'][0]['description']
โญ ์ฌ๊ธฐ์ ์ค์ํ ์ !
- ‘units=metric’์ผ๋ก ํ๋ฉด ์ญ์จ๋ก ๋ฐ๋ก ํ์๋ฉ๋๋ค
- ‘response.json()’์ผ๋ก ์ฝ๊ฒ ํ์ฑ ๊ฐ๋ฅ!
3. ๐ ๋ง์ถค ์กฐ๊ฑด๋ณ ์๋ฆผ ์ค์ ํ๊ธฐ
- ์๋ฅผ ๋ค์ด, ๊ฐ์ํ๋ฅ 50% ์ด์์ด๋ฉด ์๋ฆผ ๋ณด๋ด๊ธฐ
- ๋๋, ์จ๋ 0๋ ์ดํ์ด๋ฉด ‘์ถ์ด ๋ ์จ์ ๋๋ค’ ์๋ฆผ ๋ณด๋ด๊ธฐ
python
if 'rain' in ๋ ์จ์ํ or ์จ๋ < 0:
send_alert("์ค๋์ ์ฐ์ฐ์ด ํ์! ๋๋ ๋๋ฌด ์ถฅ๋ค์! โ๐ฅถ")
โญ ์ค์ํ ํฌ์ธํธ!
- ์กฐ๊ฑด๋ฌธ์ ๋ค์ํ๊ฒ ํ์ฅ ๊ฐ๋ฅ
- ํ์ ์, ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ผ๋ก ์กฐ๊ฑด ๋ฐ๊พธ๊ธฐ
4. ๐ฑ ์๋ฆผ ๋ณด๋ด๊ธฐ (์ด๋ฉ์ผ, ๋ฌธ์, ์ฑ ํธ์ ๋ฑ)
- ๊ฐ๋จํ๊ฒ ์ด๋ฉ์ผ ๋๋ ์ฌ๋(Slack), ํ ๋ ๊ทธ๋จ(Telegram) ์ฐ๋ ๊ฐ๋ฅ
- ์ฌ๊ธฐ์๋ ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ ์์ !
python
import smtplib
def send_email(subject, body):
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("์ด๋ฉ์ผ@gmail.com", "๋น๋ฐ๋ฒํธ")
message = f"Subject:{subject}\n\n{body}"
server.sendmail("์ด๋ฉ์ผ@gmail.com", "๋ฐ๋์ด์ด๋ฉ์ผ", message)
server.quit()
โญ ์ฐธ๊ณ !
- Gmail SMTP๋ ‘๋ณด์ ์์ค ๋ฎ์ ์ฑ ํ์ฉ’ ํ์, ๋๋ ์ฑ ๋น๋ฐ๋ฒํธ ์ฌ์ฉ ์ถ์ฒโ
5. ๐ ์ค์ผ์ค๋ฌ ๋ฑ๋ก์ผ๋ก ๋งค์ผ/์๊ฐ๋ณ ์๋ํ
- schedule ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
- ๋งค์ผ ์ค์ 7์๋ง๋ค ์๋ฆผ ๋ณด๋ด๊ธฐ
python
import schedule
import time
def job():
# ๋ ์จ ์ฒดํฌ ๋ฐ ์๋ฆผ ๋ณด๋ด๊ธฐ
check_weather_and_notify()
schedule.every().day.at("07:00").do(job)
while True:
schedule.run_pending()
time.sleep(60)
๐ ์ ์ฒด ์ฝ๋ ์ ๋ฆฌ + ์คํ ๋ฐฉ๋ฒ
python
import requests
import schedule
import time
import smtplib
API ์ ๋ณด
API_KEY = "์ฌ๋ฌ๋ถ์_APIํค"
CITY = "์์ธ" # ์ํ๋ ์ง์ญ ์
๋ ฅ
์ด๋ฉ์ผ ์ ๋ณด
FROM_EMAIL = "your_email@gmail.com"
PASSWORD = "your_email_password"
TO_EMAIL = "target_email@gmail.com"
๋ ์จ ์ฒดํฌ ํจ์
def check_weather_and_notify():
url = f"http://api.openweathermap.org/data/2.5/weather?q={CITY}&appid={API_KEY}&units=metric"
response = requests.get(url)
data = response.json()
temp = data['main']['temp']
weather_desc = data['weather'][0]['description']
alert_msg = ""
if 'rain' in weather_desc or temp < 0:
alert_msg = f"๐ง๏ธ ์ค๋ {CITY}์ ๋ ์จ๋ {weather_desc}์ด๋ฉฐ, ์จ๋๋ {temp}๋์
๋๋ค. ์ฐ์ฐ ์ฑ๊ธฐ์ธ์! โ"
elif temp > 30:
alert_msg = f"๐ฅ ์ค๋ {CITY}๋ ๋์ ์กฐ์ฌ! ๊ธฐ์จ์ด {temp}๋๊น์ง ์ฌ๋ผ๊ฐ์ด์. ์๋ถ ์ญ์ทจ ์์ง ๋ง์ธ์! ๐ง"
if alert_msg:
send_email("๋ ์จ ์๋ฆผ ๐ฅ๏ธ", alert_msg)
์ด๋ฉ์ผ ๋ฐ์ก ํจ์
def send_email(subject, body):
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(FROM_EMAIL, PASSWORD)
message = f"Subject:{subject}\n\n{body}"
server.sendmail(FROM_EMAIL, TO_EMAIL, message)
server.quit()
print("์ด๋ฉ์ผ ์ฑ๊ณต์ ๋ฐ์ก! ๐")
except Exception as e:
print("์ด๋ฉ์ผ ๋ฐ์ก ์คํจ ๐ข:", e)
์ค์ผ์ค ์ค์
schedule.every().day.at("07:00").do(check_weather_and_notify)
๋ฌดํ ๋ฃจํ๋ก ์คํ ์ ์ง
print("๋ ์จ ์๋ฆผ ์์คํ
์์! ๐")
while True:
schedule.run_pending()
time.sleep(60)
โจ ์ง๊ธ ๋ฐ๋ก ์ค์ ์ ์ฉ TIP!
- API Keys๋ ์ ๋ ๊ณต๊ฐํ์ง ๋ง๊ธฐ ๐
- Gmail SMTP ์ฌ์ฉ ์ ‘์ฑ ๋น๋ฐ๋ฒํธ’ ์์ฑ ์ถ์ฒ ๐
- ์กฐ๊ฑด๋ฌธ·์๋ฆผ ๋ฉ์์ง๋ ํ์ฉ ๋ชฉ์ ์ ๋ฐ๋ผ HTML ๋๋ ํธ์์๋ฆผ๋ ๊ฐ๋ฅ! ๐ฑ
- ์ฃผ๊ธฐ์ ํ ์คํธ๋ก ๋ฒ๊ทธ ๋ฐฉ์งํ๊ธฐ โ
๐ ์๋ฃ ํ, ํ ์ ์๋ ๋ค์ ๋จ๊ณ๋?
- ๐งณ ์ฌ๋ฌ ์ง์ญ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ์ฒดํฌํ๋ ๋ก์ง ์ถ๊ฐ!
- ๐ ๋ค์ํ ์๋ฆผ ์๋จ(์นด์นด์คํก, ํ ๋ ๊ทธ๋จ) ์ฐ๋!
- ๐ ์ฃผ๊ฐ/์๊ฐ ๋ ์จ ์์ฝ ๋ฆฌํฌํธ๋ ๋ง๋ค์ด๋ณด๊ธฐ!
- ๐ป ์ด ํ๋ก์ ํธ๋ฅผ ํฌํธํด๋ฆฌ์ค์ ๋จ๊ฒจ๋๊ธฐ!
๐ ๋ง๋ฌด๋ฆฌ ์ ์์ฌํญ
- ์ธํฐ๋ท ์ฐ๊ฒฐ ๋๊ธฐ ์๋๋ก! ๐
- API ํธ์ถ ํ์ ์ ํ ์ฃผ์! (๋ฌด๋ฃ ํ๋์ ํ๋ฃจ2,000ํ ์ ๋) ๐ง
- ํน์ ์ค๋ฅ ๋๋ ๋ถ๋ถ ์์ผ๋ฉด, ๊ตฌ๊ธ๋ง๊ณผ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ ํ์!
๐ ๊ฒฐ๋ก
๋จ 10๋ถ์ด๋ฉด ๋๋ง์ ๋ ์จ ์๋ฆผ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ด์! ๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผ ํด ๋ณด๋ฉด์, ์์ ์ ๋ ์จ ์ ๋ณด๋ฅผ ๋ ์ค๋งํธํ๊ฒ ๊ด๋ฆฌํ๋ ์ต๊ด, ๊ผญ ๊ธธ๋ฌ๋ณด์๊ธธ ๋ฐ๋๋๋ค. ๐ ์ธ์ ์ด๋์๋ ๋ ์จ ์ ๋ณด, ์ด์ ๋ฌด์กฐ๊ฑด ๋ด ์์์! โ๏ธ๐ง๏ธ
๐ ์ง๊ธ ๋ฐ๋ก ์์ํด๋ณด์ธ์! ๊ถ๊ธํ ์ ์ ๋๊ธ ๋๋ ๋ฉ์์ง ์ฃผ์ธ์! ๐ฌ ๊ทธ๋ผ ๋ค์ ํฌ์คํธ์์ ๋ง๋์! ๐
์ด์ ๊ธ ๋ณด๊ธฐ!!