오늘의 점심 메뉴를 선정하는 것은 대다수 직장인들의 고민 중 하나일 것이다. 내가 있는 위치만 검색하면 자동으로 가게 리스트를 추천해주면 좋을려만...
그래서 점심 리스트를 추천 받을 프로그램을 하나 만들어 보고자 한다.
- {도시명}을 입력하여 현재 날씨 정보를 가져온다.
- 날씨 정보를 바탕으로 메뉴 리스트를 랜덤으로 가져온다.
- {지역명}을 입력하여 '{지역명} + 맛집'으로 네이버에 검색하여 결과를 가져온다.
- 결과를 텔레그램 봇에 전송한다.
.env | 환경 변수 관리 |
---|---|
.gitignore | git 저장소에 업로드 되면 안되는 파일 및 폴더 관리 |
main.py | 실행 파일 |
munu.py | 랜덤으로 메뉴 생성 |
naver.py | Naver와 관련되 작업 수행 |
telegram_class.py | Telegram과 관련되 작업 수행 |
weather.py | 날씨와 관련된 작업 수행 |
NAVER_CLIENT_ID=YOUR NAVER CLIENT ID
NAVER_CLIENT_SECRET=YOUR NAVER CLINET SECRET CODE
TELEGRAM_API_KEY=YOUR TELEGRAM API KEY
TELECRAM_CHAT_ID=BOT CHANNEL ID
OPEN_WEATHER_API_KEY=YOUR OPEN WEATHER API KEY
- 도시명을 입력하여 현재 도시의 날씨 상태를 반환
- openWether에서 섭씨 온도로 변환하기 위해서 &units=metric 추가
- 결과 값 중에서 사용할 데이터만 반환하기
"weather": [{ "id": 501, "main": "Rain", "description": "moderate rain", "icon": "10d" }]
"main": { "temp": 298.48}
import requests
import os
from dotenv import load_dotenv
load_dotenv()
## 섭씨 온도 &units=metric <-추가하기
def get_current_weather(city_name):
appid = os.environ.get('OPEN_WEATHER_API_KEY')
url = f"https://api.openweathermap.org/data/2.5/weather?q={city_name}&units=metric&appid={appid}"
res = requests.get(url)
if res.status_code != 200:
print(f"ERROR OF GET CURRENT WEATHER, {res.status_code}")
else:
weather = res.json().get("weather")
current_weather = weather[0]
main = res.json().get("main")
current_weather['temp'] = round(main['temp'])
return current_weather
- 현제 날씨 값을 받아 날씨 상황에 맞게 메뉴 리스트 랜덤으로 반환
import random
def get_food_list(current_weather):
rain = "파전,부대찌개,칼국수,수제비,우동,잔치국수,해물탕,아구찜".split(',')
sunny = "스테이크,피자,햄버거,스파게티,샌드위치,반미,덮밥,스시".split(',')
if current_weather['main'] == 'Rain':
food_list = random.sample(rain, k=len(rain))
else:
food_list = random.sample(sunny, k=len(sunny))
return food_list
- 검색하고자 하는 지역명과 메뉴 리스트를 받아서
- 지역 + 음식 + 맛집 으로 검색
- 추천 리스트 3개 반환
import os
import requests
from dotenv import load_dotenv
import urllib
load_dotenv()
class Naver():
def __init__(self):
self._naver_client = os.environ.get('NAVER_CLIENT_ID')
self._naver_client_secret = os.environ.get('NAVER_CLIENT_SECRET')
self.header = {
"X-Naver-Client-ID": self._naver_client,
"X-Naver-Client-Secret": self._naver_client_secret
}
def search_naver(self, location, food_list):
naver_local_url = "https://openapi.naver.com/v1/search/local.json?"
recommends = []
result = []
## 댓글이 많은 지역 맛집 5개 가져오기
for food in food_list:
query = f"{location}{food} 맛집"
params = f"sort=comment&query={query}&display=5"
res = requests.get(f"{naver_local_url}{params}", headers=self.header)
if res.status_code != 200:
print(f"ERROR SEARCH_NAVER {res.status_code}")
result_list = res.json().get('items')
if result_list:
recommends.append(result_list[0])
if len(recommends) >= 3:
break
## 필요한 데이터만 가져오기
for place in recommends:
title = place.get('title')
title = title.replace('<b>', '').replace('</b>', '')
category = place.get('category')
roadAddress = place.get('roadAddress')
## Connect to naver search when click the place
enc_address = urllib.parse.quote(f"{roadAddress} {title}")
query = f"query={enc_address}"
url = f"https://search.naver.com/search.naver?{query}"
content = {
"title": title,
"category": category,
"url": url
}
result.append(content)
return result
- 가게 추천 리스트를 받아 텔레그램으로 전송하기
- 텍스트로 보낼 때 markdown 형식으로 보내려면 parse_mode="Markdown" 추가하기'
import json
import telegram
import os
from dotenv import load_dotenv
load_dotenv()
class Telegram():
def __init__(self):
self._api = os.environ.get('TELEGRAM_API_KEY')
self._chat_id = os.environ.get('TELECRAM_CHAT_ID')
self.bot = telegram.Bot(token=self._api)
def send_telegram_message(self, search_result):
for item in search_result:
category = item['category']
title = item['title']
url = item['url']
text = f"[{title}]({url})"
self.bot.sendMessage(self._chat_id, text=text, parse_mode="Markdown")
- 외부 파일과 모듈 improt 하기
- 현재 부산 날씨를 검색하여 랜덤으로 메뉴 선정하기
- 서면 + 음식 + 맛집으로 검색하기
- 추천 리스트 결과 텔레그램으로 전송하기
from weather import get_current_weather
from menu import get_food_list
from naver import Naver
from telegram_class import Telegram
naver = Naver()
telegram = Telegram()
current_weather = get_current_weather("Busan")
food_list = get_food_list(current_weather)
search_result = naver.search_naver("서면", food_list)
telegram.send_telegram_message(search_result)
출처: https://summer-kylie.tistory.com/entry/Python-현재-날씨에-따른-추천-음식-리스트-텔레그램으로-전송하기 [Archive:티스토리]
해당 포스팅은 아래의 포스터를 기반으로 작성했습니다.
https://ai-creator.tistory.com/31?category=759438