지난 글에서 슬랙의 채팅창에 글이 올라왔을 때, 해당 내용을 콘솔에 띄우는데까지 진행하였다. 이제 이 글의 내용을 구분하여 날씨 요청에 관련한 글인지 확인하고, 그에 맞는 데이터를 채팅창으로 전송해줄 예정입니다.

메세지 내용 추리기

일단 가장 첫번째로 할 것은 메세지 중 필요 없는 것들을 걸러내는 것입니다.

슬랙api를 통해 봇이 메세지를 보내더라도, 슬랙 api의 구독 서비스는 그 메세지마저 서버로 보내줍니다. 메세지를 보낸 사람의 id를 구분하여 봇이 보낸 내용이라면 처리를 하지 않도록 해주겠습니다. 그러기 위해 봇의 id를 확인해보겠습니다.

워크스페이스에서 왼쪽 메뉴의 앱을 우클릭하고 상세정보를 보면 봇의 id가 무엇인지 확인할 수 있고, 메세지를 받았을 때 유저id가 봇과 일치한다면 아무런 처리도 하지 않고 넘어가도록 하겠습니다.

두번째로는 #weather 채팅창에 올라오는 명령만 처리하도록 채널에 관련한 제한도 넣어줄 예정입니다. 원하는 채팅창에 임의의 메세지를 보내고, 전송되는 데이터에서 채널id를 쉽게 얻을 수 있습니다.

마지막으로 명령에 대해서는 문장형의 명령도 받았으면 좋겠지만 일단은 "지역" + "날씨" 라는 명령어로 한정하여 명령을 받도록 하겠습니다.

지역 이름이 적절하게 입력되지 않았을 경우를 대비하여 geocoding 코드도 적절히 수정하여 Django 서버로 가져와주고, views 파일도 아래와 같이 수정해주었습니다.

그동안 만들었던 파일들을 아래와 같이 불러와서 이용해주었습니다.

chatbot
├ chatbot #기본 폴더
│ ├ settings.py
│ ├ urls.py
│ └...
├ slackbot # 슬랙api가 보낸 데이터를 처리해주는 앱
│ ├ models.py
│ ├ views.py
│ └...
├ python_weather_api # 날씨 데이터를 가져오는 모듈
│ ├ python_weather_api.py
│ ├ python_geocoding.py
│ └ secrets.json
├ slack # 슬랙 메세지 전송 모듈
│ ├ slack.py
│ └ secrets.json
├ secrets.json
└ manage.py

# slackbot/views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from python_weather_api.python_geocoding import xy_geocoding
from python_weather_api.python_weather_api import make_weather_text
from slack.slack import to_slack


class Attend(APIView):
    def post(self, request):
        """
        슬랙에서 채팅 이벤트가 있을 때 호출하는 API
        """

        # 신호 출력
        # print(request.body)

        user = request.data.get("event").get("user")
        channel = request.data.get("event").get("channel")
        text = request.data.get("event").get("text")

        # user 가 봇이 아니고 채널이 날씨 채널인 경우에
        if user != "U029FAZ2AP9" and channel == "C029T1KMBMK":
            # 내용을 띄어쓰기 기준으로 분리
            contents = text.split(" ")
            if contents[-1] == "날씨":
                # 마지막 단어가 "날씨"라면 앞에 주어진 단어로 날씨 데이터 탐색
                place = " ".join(contents[:-1])
                x, y, addr = xy_geocoding(place)
                if addr == None:
                    text = "지역명을 확인해주세요."
                else:
                    text = addr + "\n" + make_weather_text(x, y)
                # to_slack 함수는 text를 정해진 채널에 보내준 후, 전송 결과를 리턴한다.
                print(to_slack(text, "#weather"))

        # challenge 데이터 추출하여 Response에 추가
        challenge = request.data.get("challenge")
        return Response(status=200, data=dict(challenge=challenge))

weather 채팅창에 "수원 날씨"를 입력했더니 현재 시각 기준으로 6시간동안의 초단기예보를 정상적으로 알려줍니다.

정리

이렇게 기본적으로 제가 원하는 정보를 빠르게 알려주는 챗봇을 만드는데 성공하였습니다. 하지만 현재로는 컴퓨터에서Django 서버를 켜둔 상태에서만 챗봇이 작동하게 됩니다. 애초에 Django는 웹서버용이 아닌데다가, 이대로 사용한다고 해도 컴퓨터를 켜고 서버를 작동시키는 번거로운 조작이 있어야합니다. 이를 상시로 이용하기 위해서는 aws를 이용하는 등 여러가지가 있겠지만, 저는 애초에 테스트겸 혼자 사용하기 위해 만들었고 데이터 사용량이 많은 것도 아니기 때문에 집에서 24시간 돌고 있는 우분투 나스에게 이 임무를 맡길 예정입니다.

내용 관련하여 도움이나 조언 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기