200% |
03_조금 더 스마트하게 만들기 |
지금 아쉬운 점은 두 가지 정도가 있을 겁니다.
첫 번째는, 나의 말에 대답을 하면 코드가 종료된다는 것
두 번째는, 다른 정보들은 없고 날씨만 알려준다는 것
이 두 가지 아쉬운 점을 하나씩 개선해 보려고 합니다.
check_msg 함수는 지금 내가 말한 가장 최근의 메시지를 가져오는 친구입니다.
내가 새롭게 말을 걸었을 때에는 가장 최근의 메시지가 업데이트 되기 때문에 문제 될 것이 없지만,
대답을 하고 나서도 내가 말을 건 내용이 가장 최근의 메시지로 남아있어요.
check_msg 함수를 중간중간에 계속 실행시킨다면, 결과가 바뀌는 시점에
사용자가 새롭게 말을 걸었다고 생각해 볼 수 있습니다.
controller 만 개선해서 이 기능을 구현해 보겠습니다.
from check_msg import check_msg
from weather import weather
from message import message
def haruharu():
messge_prev = check_msg()
while True:
message_input = check_msg()
if message_prev == message_input:
time.sleep(3)
else:
messge_prev = message_input
if '날씨' in message_input:
weather_data = weather(message_input)
message(weather_data)
message_prev 와 message_input 변수 두 개를 이용해 사용자의 새로운 말을 인지하게 만들어 보겠습니다.
1. 함수가 처음 실행되면 가장 최근의 말을 가져와 message_prev 변수에 넣습니다.
여기부터는 while True 반복문이 시작됩니다.
2. 가장 최근의 말을 가져와 message_input 변수에 넣습니다.
<message_prev 와 messge_input 이 같은지 다른지 여부에 따라 분기가 나뉘어집니다.>
3-1. 같다면
-> 3초를 대기하고 2 번으로 돌아갑니다.
3-2. 다르다면
4. message_prev 를 message_input 으로 업데이트 해 줍니다.
<messge_input 에 어떤 글자가 들어있는지에 따라 분기가 나뉘어집니다.>
5. '날씨' 라는 글자가 message_input 에 들어있다면 weather 함수를 message_input 을 넣고 실행해,
날씨 정보를 weather_data 변수에 넣고, weather_data 변수를 message 함수에 넣어서 나에게 메시지를 보내줍니다.
아직은 다른 기능들이 들어있지 않기 때문에, '날씨' 라는 글자에만 대답하게 되어있습니다.
여기에서 다른 기능을 추가하게 된다면?
새로운 정보를 가져와주는 함수를 파이썬 파일로 따로 저장한 후
컨트롤러에서는 import 와 message_input 분기의 코드만 추가해주면 되는 것이죠!
우리가 다루었던 부분 중 미세먼지 정보를 다루는 부분이 있었죠?
import requests
from bs4 import BeautifulSoup
def dust_hunter(r_name = "서초구"):
base = 'http://openapi.airkorea.or.kr/openapi/services/rest'
service = '/ArpltnInforInqireSvc/getCtprvnMesureSidoLIst'
key = '?serviceKey=%2FvNQLW62FZQHdzvFTGDTGRNSyckmTODOYb98%2B0jVNVHk0iimUZV%2B5Gik%2FA7QkgsCKFs6l%2BBjWh2IfQyiQLp4TA%3D%3D'
rows = '&numOfRows=25'
page = '&pageNo=1'
sido = '&sidoName=서울'
freq = '&searchCondition=DAILY'
xml = base + service + key + rows + page + sido + freq
req = requests.get(xml).text
bs1 = BeautifulSoup(req, "html.parser")
cities = bs1.find_all("cityname")
pm10s = bs1.find_all("pm10value")
pm25s = bs1.find_all("pm25value")
dust_data = {}
city_length = len(cities)
for i in range(city_length):
city = cities[i].text
pm10 = pm10s[i].text
pm25 = pm25s[i].text
if city in r_name:
dust_data[city] = "%s 의 pm10 : %s, pm25 : %s" % (city, pm10, pm25)
return_text = dust_data[r_name]
else:
return_text = '서울의 자치구 이름이 필요합니다.'
return return_text
이 다음 단계는
1. 이 코드를 dust_hunter 이름의 파이썬 파일로 저장
2. controller 에서 불러와 함수로 사용할수 있게 만든다.
3. 사용자의 말을 판별하는 분기에 경우의 수를 추가해준다.
코드를 기능별로 나눠 놓았으니 controller 에서만 if 문에 몇 줄 추가하면 됩니다.
from check_msg import check_msg
from weather import weather
from message import message
from dust_hunter import dust_hunter
def haruharu():
messge_prev = check_msg()
while True:
message_input = check_msg()
if message_prev == message_input:
time.sleep(3)
else:
messge_prev = message_input
if '날씨' in message_input:
return_msg = weather(message_input)
elif '먼지' in message_input:
return_msg = dust_hunter(message_input)
message(return_msg)
방금 한 내용을 정리하면?
1. 새 기능을 수행하는 함수를 만들고
2. controller 부에서 어떤 경우에 실행시킬지 결정
두 단계만 거치면 얼마든지 새로운 대답을 추가해볼 수 있어요!
만약 내가 물어보지 않더라도 날씨 정보를 매일 아침 7시에 받아보고 싶다면 어떻게 하면 될까요?
1. 새 기능을 수행하는 함수는 필요 없습니다. 기존에 있는 기능과 동일하니까요
2. controller 에서 시간을 인지할 수 있게 만들어서, 조건에 따라 True / False 판별이 되게 만들면 되겠군요!
import datetime
now = datetime.datetime.now().time()
print(now.hour)
print(now.minute)
파이썬에서는, 위와 같이 간단한 코드만으로도 현재 시간과 분을 가져올 수 있습니다.
이 코드를 controller 에 이식(?) 해서 시간을 인지하게 만들고, 7시쯤 True 로 만들어주면 되겠죠?
from check_msg import check_msg
from weather import weather
from message import message
from dust_hunter import dust_hunter
import datetime
def haruharu():
messge_prev = check_msg()
while True:
message_input = check_msg()
now = datetime.datetime.now().time()
if (now.hour == 7 ) and (now.minute == 0) and (now.second < 20):
return_msg = weather(message_input)
message(return_msg)
time.sleep(20)
if message_prev == message_input:
time.sleep(3)
else:
messge_prev = message_input
if '날씨' in message_input:
return_msg = weather(message_input)
elif '먼지' in message_input:
return_msg = dust_hunter(message_input)
message(return_msg)
아래 4 줄이 추가되었습니다.
각 줄이 하는 역할을 한번 볼까요?
now = datetime.datetime.now().time()
if (now.hour == 7 ) and (now.minute == 0) and (now.second < 20):
return_msg = weather(message_input)
message(return_msg)
time.sleep(20)
datetime.datetime.now().time() 을 통해 현재의 시간을 가져와 now 라는 변수에 집어넣습니다.
now.hour , now.minute , now.second 는 각각 현재의 시/분/초 를 가져옵니다.
시/분/초 를 True / False 조건으로 바꾼 후 불리언 and 연산으로 묶어주었습니다.
and 는 모두 True 일 경우에 True 가 나오는 것이죠.
시 와 분은 7 시 00 분일 경우 True 가 되고, 초는 20초 미만일 경우 True 입니다.
초를 0 이 아닌 값으로 한 이유는, 정확히 0 초가 아니더라도 코드가 실행될 수 있게 하기 위함입니다.
날씨정보를 사용자에게 보내는 부분은 기존에 구현한 부분과 정확히 동일합니다.
time.sleep(20) 을 넣은 이유는 이 부분이 한 번만 실행됨을 보장받기 위함입니다.
7 시 00 분 00 초에 한 번 코드가 실행되어도, 20초를 쉬어주게 되면
20 초가 되므로 맨 마지막 불리언 조건인 '20 미만' 에서 False 가 됩니다.
따라서, 한 번만 True 가 되게 만들어줄 수 있는 것이죠.
'[일상봇 만들기] 나의 하루하루를 도와줄 친구!' 카테고리의 다른 글
level_01_part_1 (0) | 2019.08.02 |
---|---|
[서버] 컴퓨터를 계속 켜 두어야 하나요? [to-do 있음] (1) | 2019.08.01 |
200%_part_01 (0) | 2019.08.01 |
level_04_part_3 (0) | 2019.07.23 |
level_04_part_2 (0) | 2019.07.09 |