200% |
01_내가 너를 불러주기 전에는 다만 글자의 모음에 지나지 않았지만 |
1_(속닥속닥) 텔레그램은 사실 '메신저' 였던 겁니다.
우리가 카카오X 과 같은 메신저 프로그램을 사용하는 것은
정보를 전달받기 위해서 뿐만 아니라, 누군가에게 말을 걸 수 있다는 이유도 있었죠.
지난 시간에는 텔레그램을 통해 파이썬이 우리에게 말을 걸게끔 했습니다.
이번에는 텔레그램을 통해 우리가 파이썬에게 말을 걸어 볼 겁니다?!?!
말을 걸었을 때 파이썬이 대답을 하게끔 만들어 볼게요.
우리가 대화를 하면서 누군가에게 대답을 하는 경우를 생각해 본다면
1. 질문의 내용을 인지한다.
2. 내용에 맞는 대답을 준비한다.
3. 상대방에게 대답을 한다.
이렇게 세 단계로 이루어져 있습니다.
만약 파이썬에게 '오늘의 날씨' 를 물어본다면?
1. (어떻게든) 질문의 내용을 인지한다 ?!
2. weather 함수로 오늘의 날씨를 알아낸다.
3. msg 함수에 정보를 넣고 실행시켜 대답한다.
$$ 우리가 텔레그램으로 말을 건 내용을 어떻게든 가져올 수만 있다면
$$ 문제가 금방 해결될 것입니다.
이 기능 구현을 위한 코드를 소개합니다.
def check_msg():
import telegram as tg
api = '957261829:AAH4VROxizkW_quC_sSQMaEgvHbofPeVPa8'
haruharu = tg.Bot(token=api)
status = haruharu.getUpdates()
newdata = status[-1]
newdata_dict = newdata.to_dict()
text_msg = newdata_dict['message']['text']
return text_msg
[코드 해설]
기존의 chat_id 를 가져왔던 코드와 거의 같은데, 딕셔너리의 키로 가져오는 내부의 정보만 다른 것을 가져옵니다.
.getUpdates() 실행시 해당 봇이 받은 메시지에 대한 정보가 리스트 형태로 나올 것이죠.
리스트는? 순서를 갖고 있고, 이 순서를 이용해 내용물을 조회하는 것은 '인덱싱' 이라고 했죠?
인덱싱은 0 번째부터 순서를 세는 것이었는데, 맨 마지막 것을 선택하는 것은 -1 인덱스가 있었습니다.
리스트 인덱스 -1 번째로 인덱싱하면 맨 마지막에 추가된 메시지를 선택할 수 있고,
선택한 한 메시지를 to_dict() 하여 딕셔너리로 바꿔줍니다.
봇이 인지한 메시지인 text 는 message -> text 순서로 타고 접근할 수 있습니다.
이렇게 얻은 사용자가 봇에게 보낸 메시지를 text_msg 변수에 집어넣습니다.
사용자가 보낸 메시지를 함수 안에서 밖으로 빼서 사용하기 위해 return 으로 꺼내줍니다.
[말을 거는 그림]
[함수 실행시 내가 말을 건 내용이 결과로 보이는 그림]
[내가 건 말을 인식했어요, 그 다음은?]
check_msg 함수가 실행되면 함수가 실행되었을 때를 기준으로
가장 최근에 봇에게 말을 건 문장(또는 문자열)이 나올 겁니다.
여기서 우리는!
1. 내가 건 말에 '날씨' 라는 단어가 포함되어 있다면 weather 함수를 실행해서 날씨 정보를 얻고
2. 이 날씨 정보를 msg 함수를 실행할 때 입력값으로 넣어서 나에게 정보를 보냅니다.
이렇게 두 함수만 실행시키는 것 만으로 봇이 나에게 '대답' 을 할 수 있게 됩니다.
다시 한 번 정리하면?
1. check_msg 함수를 실행하여 내가 말을 건 내용을 인식합니다.
2. 말을 건 내용을 문자열로 받아서, weather 함수의 입력값으로 넣어 실행합니다.
3. weather 함수의 결과를 변수에 넣어서, msg 함수의 입력값으로 넣어 실행합니다.
def message(msg):
import telegram as tg
api = '957261829:AAH4VROxizkW_quC_sSQMaEgvHbofPeVPa8'
haruharu = tg.Bot(token=api)
haruharu.send_message(chat_id = 412971146, text=msg)
def weather(day):
import requests
import xmltodict
url = 'http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1117052000'
req = requests.get(url).text
diction = xmltodict.parse(req)
day_picker = '0'
weather_appender = ''
if '내일' in day:
day_picker = '1'
for weather in diction['rss']['channel']['item']['description']['body']['data']:
if weather['day'] == day_picker:
weather_appender = weather_appender + weather['wfKor'] + '\n'
return weather_appender
200% |
02_코드가 너무 길고 복잡한(?)것 같아요! |
한 눈에는 절대 들어오지 않는 정도의 긴(?) 코드량을 보고 어떤 기분이 드셨나요?
'이 걸 어떻게 관리할지에 대한 착잡함' 은 어떤가요?
잠시 긴 길이에 대한 관심을 내려놓고...
컴퓨터를 예로 들어, 우리가 크고 복잡한 것을 어떻게 다루는지에 대해 생각해볼게요
1. 각기 다른 기능을 수행하는 부품들로 이루어져 있습니다.
2. 새로운 기능을 추가하고 싶을 때, 새로운 부품을 추가합니다.
3. 특정 기능을 개선하고 싶을 때, 해당하는 부품을 개선 / 교체 합니다.
예) 컴퓨터에 와이파이 기능을 추가하고 싶다면, 와이파이 리시버를 사서 끼워줍니다.
예) 컴퓨터의 속도를 높이고 싶을 때, 중앙처리장치(CPU) 를 업그레이드하여 교체합니다.
여기서 잠깐, 우리가 무엇을 갖고 있는지 정리하면:
1. check_msg - 사용자의 말을 인식하는 기능
2. weather - 날씨 정보를 가져오는 기능
3. message - 사용자에게 메시지를 보내는 기능
기능이 3 개 있고, 각 기능을 수행하기 위해 함수가 3 개 있습니다.
우리가 갖고있는 재료들을 컴퓨터의 예시처럼 표현하면:
1. 말을 인식하고, 정보를 가져오고, 메시지를 보내는 함수들로 이루어져 있습니다.
2. 날씨가 아닌 다른 정보도 다루고 싶다면? 새로운 정보를 가져오는 새로운 함수를 추가합니다.
3. 날씨정보를 보기 좋게 정리해서 나에게 보내주고 싶다면? 함수를 개선합니다.
일단, 이 모든 부품들을 따로따로 구분해서 저장하는 것으로 시작해 볼게요
[check_msg 함수 파이썬 파일로 저장하기 그림]
[weather 함수 파이썬 파일로 저장하기 그림]
[message 함수 파이썬 파일로 저장하기 그림]
[저장한 파일을 주피터노트북 작업 폴더로 옮겨오는 그림]
[새로운 ipynb 파일을 만들어서, 세 파일 모두를 import 하는 그림]
파이썬 파일로 저장 후 import 를 하면 내가 만든 함수를 다른 곳에서 불러와 사용할 수 있습니다.
def 함수이름... 등등을 통해 함수를 만드는 작업을 미리 해 두었고, 이를 불러와 사용하기만 하면 되는 것이죠!
그래서 이를 전부 관리하는 코드는 아래와 같습니다.
from check_msg import check_msg
from weather import weather
from message import message
while True:
message_input = check_msg()
if '날씨' in message_input:
weather_data = weather(message_input)
message(weather_data)
break
이 10 줄도 안되는 코드가 어떻게 동작하는지에 대해 설명드릴게요
맨 위 세 줄은 미리 만들어 둔 함수를 여기에서 그냥 불러와 사용할 수 있게 만들어주는 코드입니다.
while True: -> while 조건문의 반복조건이 True 이므로, 항상 24시간 내내 반복될 것임을 알 수 있습니다.
messgae_input = check_msg() -> 내가 말을 건 내용을 message_input 변수에 넣어줍니다.
weather_data = weather(message_input) -> 내가 말을 건 내용을 weather 함수에 입력값으로 넣고,
결과를 weather_data 변수에 넣어줍니다.
message(weather_data) -> weather_data 변수에 담겨있는 값을 message 함수에 입력값으로 넣어서
나에게 메시지를 보내게 합니다.
break -> 나에게 한 번 메시지를 보내면 반복이 종료되게 만들어 줍니다.
$$ 계속 대기하게 만들고 싶은데 반복이 종료되게 되는 이 코드를 왜 넣냐구요?
$$ break 를 지우고 코드를 실행시켜 보면, 대답을 반복문으로 여러 번 중복해서 하게 되겠죠...
$$$ 대답을 한 번만 하고, 중복된 대답을 하지 않게 개선하는 것은 차후에 이어서 알아보겠습니다.
이렇게 기능들을 제어하는 코드를 함수로 만들고, controller 라는 이름으로 저장해서
더 간단하게 만들어주면?
from check_msg import check_msg
from weather import weather
from message import message
def haruharu():
while True:
message_input = check_msg()
if '날씨' in message_input:
weather_data = weather(message_input)
message(weather_data)
break
이렇게 함수로 묶어서 저장한 후
from controller import haruharu
haruharu()
단 두 줄 만으로 모든 기능을 동작하게 만들 수 있어요!
'[일상봇 만들기] 나의 하루하루를 도와줄 친구!' 카테고리의 다른 글
[서버] 컴퓨터를 계속 켜 두어야 하나요? [to-do 있음] (1) | 2019.08.01 |
---|---|
200%_part_02 (0) | 2019.08.01 |
level_04_part_3 (0) | 2019.07.23 |
level_04_part_2 (0) | 2019.07.09 |
level_04_part_1 (0) | 2019.07.05 |