파이썬 프로젝트 및 응용/매일 아침 출근전 나만의 날씨 정보를 받아보자!!

(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 4. 인공지능(?) 챗봇 만들기

파기차차 2022. 12. 20. 07:13
728x90
반응형
SMALL
728x90
반응형

ㅁ 개요

 

O 프로그램 소개

 

 

 - 이번 글은 이전글(2022.12.11 - [프로젝트 및 응용/매일 아침 출근전 나만의 날씨 정보를 받아보자!!] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 3. 프로그램을 스케줄러에 등록하기)에 이은 8번째 마지막 글로 날씨 관련 API 응답결과를 가공하여 텔레그램 봇이 가지고 있다가, 내가 날씨 정보를 물어보면 그와 관련된 대답해 줄 수 있도록 텔레그램 봇을 만드는 방법에 대하여 설명합니다.

 

 

 

 

O 완성된 프로그램 실행 화면

 

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

아래와 같이 내가 날씨 관련 궁금한 사항을 물어보면 텔레그램 봇이 아는 범위내에서 대답해 주고 있습니다.

 

 

 

 

O 시작전 준비 사항

 

**실습을 위해 아래 2가지 (API키 및 access token)가 미리 준비되어 있어야 합니다.

 

 - 이번글을 실습하기 위해서는 이전글(2022.12.11 - [분류 전체보기] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 1) API사용을 위한 회원가입)의 API 키

 

이전글(2022.12.11 - [분류 전체보기] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 2. 텔레그렘으로 데이터 전송하기 - 1) 텔레그램 봇 생성)의 access token이 있어야 합니다.

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

소스파일 : 1.py

 

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging

accessToken = "" # 텔레그램 봇 생성시 획득한 본인의 엑세스 토큰을 넣어주세요

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)

def echo(update: Update, context: CallbackContext) -> None:
    text = update.message.text
    if '안녕' in text:
        reply = "안녕하세요. 주인님!!"
    elif '고마워' in text:
        reply = "저도 고맙습니다.!!"
    else:
        reply = "무슨말인지 못알아 들었습니다. 주인님!!"
    update.message.reply_text(reply)

updater = Updater(accessToken)
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text, echo))
updater.start_polling()
updater.idle()

 

 

 

소스파일 : 2.py
from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging


################# 날씨 정보 얻어오기(API) 시작 ##############################
import requests

apikey = "" # 오픈웨어맵 사이트 가입시 받은 본인의 API 키를 넣어주세요
city = "Seoul"
lang = "kr"

full_Url = f"http://api.openweathermap.org/data/2.5/forecast?id=524901&q={city}&appid={apikey}&lang={lang}&units=metric" # 분당 60번만 가능, 하루 간격 16일치 날씨 정보 조회

response_org = requests.get(full_Url).json()
# print(response_org['list'])
print("###############################################################\n\n")
print(response_org['list'][0])
print("온도: ", response_org['list'][0]['main']['temp'])
print("최저 온도: ", response_org['list'][0]['main']['temp_min'])
print("최고 온도: ", response_org['list'][0]['main']['temp_max'])
print("습도", response_org['list'][0]['main']['humidity'])
print("날씨: ", response_org['list'][0]['weather'][0]['description'])
print("시간: ", response_org['list'][0]['dt_txt'])
print("###############################################################\n\n")

################# 날씨 정보 얻어오기(API) 끝 ##############################

accessToken = "" # 텔레그램 봇 생성시 획득한 본인의 엑세스 토큰을 넣어주세요

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)

def echo(update: Update, context: CallbackContext) -> None:

    text = update.message.text
    if '날씨' in text:
        reply = "오늘 날씨는 "+str(response_org['list'][0]['weather'][0]['description'])+" 입니다."
    elif '최고' in text:
        reply = "오늘 최고 온도는 "+str(response_org['list'][0]['main']['temp_max'])+" 도 입니다."
    elif '최저' in text:
        reply = "오늘 최저 온도는 "+str(response_org['list'][0]['main']['temp_min'])+" 도 입니다."
    elif '온도' in text:
        reply = "오늘 온도는 "+str(response_org['list'][0]['main']['temp'])+" 도 입니다."
    elif '습도' in text:
        reply = "오늘 습도는 "+str(response_org['list'][0]['main']['humidity'])+" 입니다."
    elif '안녕' in text:
        reply = "안녕하세요. 주인님!!"
    else:
        reply = "무슨말인지 못알아 들었습니다. 주인님!!"

    update.message.reply_text(reply)

updater = Updater(accessToken)
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text, echo))
updater.start_polling()
updater.idle()

 

 

 

 

 

O 소스 실행 방법

 
 
 - 첫번째 소스파일을 1.py로 저장 후 cmd, 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
 
 > python 1.py
 
 
 - 두번째 소스파일을 2.py로 저장 후 cmd, 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
 
 > python 2.py

 

 


 
 

O 주요 내용

 

1. 아래와 같이 프로그램을 실행하면 테레그램 봇 서비스가 시작됩니다.

 

 

 

 

 

2. 텔레그램 봇에게 아래와 같이 메시지를 보내면 답변을 해주고 있습니다.

 

 

 

3. 해당 소스는 아래와 같으며, 기본적으로 우리가 위 텔레그램 메신저에서 입력한 내용이 text변수에 할당(라인 11)되고, 여기에 미리 지정한 키워드(예: '안녕')가 text에 있다면, 관련 답변을 듣게 되는 방식입니다.

 

예를 들어 '안녕' 이라고 메신저에서 얘기하면 '안녕'이라는 내용이 text변수에 할당되고, 아래 코드 if문에서 text변수 내에 '안녕'이라는 문자열이 존재하면 봇이 '안녕하세요. 주인님!!' 으로 답변을 하도록 동작합니다.

 

 

 

 

 

4. 아래는 최종 소스의 내용입니다.

 

이전 글에서 설명한 날씨 정보를 API 요청으로 받아오고, 이를 보기 좋게 가공합니다. 

 

 

 

 5. 그런 다음 앞에서 설명 드린 텔레그램 봇 서비스에서 특정 키워드를 입력 받으면 대답할 수 있도록 if문으로 만들어 줍니다.

 

1) 파기차차 : '오늘 날씨 좀 알려줘'

2)봇 : '오늘 날씨는 맑음 입니다.'

 

예를 들어 위와 같이 1)번으로 물어보면 text = '오늘 날씨 좀 알려줘' <-- text변수에 이렇게 할당 되므로, 아래 if문에 의해 봇이

if '날씨' in text:
  reply = "오늘 날씨는 "+str(response_org['list'][0]['weather'][0]['description'])+" 입니다." <-- 이렇게 대답하게 됩니다.

 

 

 

 6. 프로그램을 실행하면 텔레그램 봇 서비스가 아래와 같이 실행됩니다.

 

 

7. 그리고 최종적으로 텔레그램 메신저에서는 아래와 같이 봇에게 물어보면 관련 답변을 해주고 있습니다.

 

 

 

 


 

 

O 소스 분석

 

- 위의 '주요 내용'을 참고하여 주시기 바랍니다.

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 날씨 관련 API 응답결과를 가공하여 텔레그램 봇이 가지고 있다가, 내가 날씨 정보를 물어보면 그와 관련된 대답해 줄 수 있도록 텔레그램 봇을 만드는 방법에 대하여 알아보았습니다.
 
 
 
 - 오늘 우리가 배운 내용을 요약 정리해 보면 아래와 같습니다.
 
 
 
 
1. 날씨 정보를 API 요청으로 받아와서 보기좋게 가공해 두었습니다.(이전 글과 동일)
 
 
2. 그리고 나서 텔레그램 봇에서 날씨 관련 내용을 물어보면 대답할 수 있도록 적절히 구문을 작성하였습니다.
 
 
 
 

 

오늘로서 출근전 날씨 정보를 메신저로 수신하기 프로젝트를 마칩니다. 처음 소개편에서 말씀드린 바와 같이 우리 프로그램은 완전하지 않습니다.

 

아래 추가로 프로그램을 개선해 보신다면 엄청난 실력향상을 경험하실 수 있을 것이라고 확신합니다.

 

1.다양한 API 기능 추가로 붙여보기

 - 현재는 날씨에 대한 API 정보만 받아오고 있습니다. 예를 들어 '미세먼지' 정보도 함께 받아와서 보여주고, 다른 정보가 추가된다면, 그것이 바로 '작은 인공지능'이 될 것입니다.

 

2.매일 아침 받아보는 정보에 이미지 or 영상으로 화려하게 꾸며보기

 - 현재 매일 아침 스케줄러를 통해 받은 정보는 텍스트 입니다. 예를 들어 '맑음' 이라고 표시된 텍스트 대신에 '해가 화창하게 떠있는 이미지' 등과 함께 정보를 받아 본다면 훨씬 더 알기 쉬울 것입니다.

 

3.미래 날씨에 대한 정보를 그래프로 받아 보기

 -현재는 날씨 정보를 현재 또는 오늘 날씨 위주로 받고 있습니다. 하지만 추가로 향후 1주일 또는 2주일치에 대한 데이터를 시각화하여 그래프로 보여준다면 훨씬 직관적인 날씨 정보를 알 수 있게 될 것입니다.

 

 

 

위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

 

 

 

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

 

728x90
반응형
LIST