[Python] 현재 날씨에 따른 추천 음식 리스트 텔레그램으로 전송하기

Kylie·2022년 10월 19일
1
post-thumbnail

들어가기 전

오늘의 점심 메뉴를 선정하는 것은 대다수 직장인들의 고민 중 하나일 것이다. 내가 있는 위치만 검색하면 자동으로 가게 리스트를 추천해주면 좋을려만...
그래서 점심 리스트를 추천 받을 프로그램을 하나 만들어 보고자 한다.

사전 준비


목표

  1. {도시명}을 입력하여 현재 날씨 정보를 가져온다.
  2. 날씨 정보를 바탕으로 메뉴 리스트를 랜덤으로 가져온다.
  3. {지역명}을 입력하여 '{지역명} + 맛집'으로 네이버에 검색하여 결과를 가져온다.
  4. 결과를 텔레그램 봇에 전송한다.

코드 작성

1. 파일구조

.env환경 변수 관리
.gitignoregit 저장소에 업로드 되면 안되는 파일 및 폴더 관리
main.py실행 파일
munu.py랜덤으로 메뉴 생성
naver.pyNaver와 관련되 작업 수행
telegram_class.pyTelegram과 관련되 작업 수행
weather.py날씨와 관련된 작업 수행

2. 환경변수 설정

.env

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

3. 날씨 API 만들기

  • 도시명을 입력하여 현재 도시의 날씨 상태를 반환
  • openWether에서 섭씨 온도로 변환하기 위해서 &units=metric 추가
  • 결과 값 중에서 사용할 데이터만 반환하기
    "weather": [{ "id": 501, "main": "Rain", "description": "moderate rain", "icon": "10d" }]
    "main": { "temp": 298.48}

weather.py

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

4. 메뉴 리스트 API 만들기

  • 현제 날씨 값을 받아 날씨 상황에 맞게 메뉴 리스트 랜덤으로 반환
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

5. 텔레그램으로 메뉴 전송하는 API 만들기

  • 가게 추천 리스트를 받아 텔레그램으로 전송하기
  • 텍스트로 보낼 때 markdown 형식으로 보내려면 parse_mode="Markdown" 추가하기'

telegram_class.py

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")

6. 프로그램 실행

  • 외부 파일과 모듈 improt 하기
  • 현재 부산 날씨를 검색하여 랜덤으로 메뉴 선정하기
  • 서면 + 음식 + 맛집으로 검색하기
  • 추천 리스트 결과 텔레그램으로 전송하기

main.py

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:티스토리]

7. 결과



해당 포스팅은 아래의 포스터를 기반으로 작성했습니다.
https://ai-creator.tistory.com/31?category=759438

profile
올해보단 낫겠지....

0개의 댓글