본문 바로가기

Project

🤖 간단한 Slack Bot 만들어 배포해보기

반응형

📣 본문은 2019년 5월 4일 작성한 글입니다.

 

매일 점심, 저녁 시간에 메뉴를 고르는 것도 일이다. 게다가 나와 같은 선택 장애(?)를 앓고 계신 분들은 더더욱이다. 차라리 누군가가 “오늘은 이거 어때?” 하며 말해주는 게 더 편할 것 같다.. 그래서 지역 기반 메뉴를 추천해주는 프로그램을 만들어 보았다. (짱 쉬운 기능으로)

Concept

맛집 정보는 어디에서, 어떻게 가져올까?

나는 평소에 사람들이 “ㅇㅇ 맛집 찾아봐” 하면 가장 먼저 키는 게 네이버였다. (별다른 이유는 없음) 네이버에 선릉 맛집을 검색하면 다음과 같이 친절하게 알려준다.

 

 

물론 지역 기반 맛집 정보를 알려주는 수많은 웹과 앱이 있지만, 가장 귀찮을 때 쉽게 접근할 수 있었던 사이트가 네이버이기 때문에 이곳에서 맛집 정보를 긁어 오자고 생각했다. 또한 그저 (지역명) 맛집으로 검색해도 퀄리티 있는 정보들이 리스트로 보여지기 때문에 크롤링 하기에도 쉬울 것 같았다. 여러 기능을 추가하고 싶었지만, 복잡한 기능(추후에 추가 예정)들은 우선 모두 제쳐 두고 가장 간단한 기능(지역 기반 맛집 상위 50개의 리스트를 가져와서 랜덤하게 맛집을 추천해주는 기능)만 우선 구현하기로 했다.

Slack Bot의 이름

개발할 땐 네이밍이 가장 중요하지! ^ㅁ^ 맛집을 추천해주는 친구이기 때문에, 그에 걸맞는 이름을 지어 주고 싶었다. 고민 끝에, 평소에 좋아하던 미식가 이영자님❤️의 이름을 따기로 했다. (덕분에 봇의 신뢰감이 높아졌다.)

Process

Slack에서는 Bot을 개발할 수 있는 API를 제공 해주기 때문에 각자 입맛에 맞는 Bot을 직접 개발하여 유용하게 사용할 수 있다.

Bot 생성하기

문서를 읽다 보면 Creating a bot user 부분이 있다.

 

 

요기서 app’s settings page를 클릭한다.

 

 

Your Apps 페이지에서, Create New App을 클릭한다.

 

 

App Name에 앱 이름을 적고, Development Slack Workspace에는 App을 추가할 Slack Workspace를 선택 해준다. Create App을 누르면 App이 추가된 것을 확인할 수 있다! 좌측 메뉴에서 Install App을 선택 후, Bot User OAuth Access Token을 복사해서 환경변수에 추가하자. 이 토큰으로 Bot User ID를 가져올것이다.

 

 

User ID 얻기

가상 환경 생성에 대한 설명은 스킵 ~!

Slack Bot 개발을 위한 가상 환경을 구축했다면 다음과 같이 slackclient를 설치해주자.

(yeongja) $ pip install slackclient

앞서 생성한 Slack Bot과 통신을 하기 위해서는 User ID가 필요하다. 복사해 두었던 Bot 토큰을 이용해 얻어보자.

(yeongja) $ curl https://yeongja.slack.com/api/auth.test?token=Bot_User_OAuth_Access_Token

결과는 다음과 같이 json형식으로 나온다. user_id 또한 환경 변수로 설정해 주도록 하자.

{"ok":true,"url":"https://dev-tycoon.slack.com/","team":"DevTycoon","user":"yeongja","team_id":"TEKSU...","user_id":"UGS76..."}

자, 이제 Bot을 만들기 위한 기초적인 설정은 모두 끝났다! 필자는 Slack Bot 개발을 위한 스크립트를 참고하여 진행했다. 설명이 아주 잘 되어있어 쉽게 따라할 수 있었다.

Slack-starterbot

스크립트가 어떻게 구성 되어 있는지 간단하게 살펴보면 다음과 같다.

  1. 환경 변수로 저장해 둔 Slack Bot Token을 가져와 SlackClient 라이브러리를 통해 객체화한다.
  2. rtm_connect 함수로 Bot 연결을 시도한다.
  3. Web API 함수 auth.test로부터 봇의 user ID를 읽는다.
  4. Slack RTM API에서 오는 이벤트 목록을 분석하여 명령에 해당되는 구문이 있는지 확인한다.
  5. 명령을 찾으면 그에 해당되는 동작을 한다.

기능 구현하기

핵심 동작을 하는 부분인 handle_command 함수에 원하는 기능을 넣어 주면 된다.

Bot 실행하기

저장한 스크립트를 실행해보자!

python yeongja.py

영자님이 친절하게 맛집을 알려 주신다. 자, 그럼 이제 배포를 해서 언제나 사용할 수 있도록 해보자.

Heroku

heroku는 호스팅을 도와주는 클라우드 PaaS이다. 여러 프로그래밍 언어(Ruby, PHP, Python, Node.js…)를 지원해주고, CI/CD까지 도와주기 때문에 쉽게 배포하고 관리할 수 있다! 또한 (제약 조건이 있으나) 무료로 배포해 볼 수 있어서 토이 프로젝트나 연습용으로 사용하기에 제격이다.

Slack Bot 배포하기

필자는 python으로 구현하였기 때문에 이 문서를 보며 시작했다.

 

 

I’m ready to start 버튼을 누르면 OS를 선택하는 화면이 나온다.

 

각자 OS에 맞는 heroku를 다운받았다면 터미널에서 로그인한다.

heroku login

성공적으로 로그인되었다면 프로젝트의 루트 폴더에서 heroku를 생성한다.

heroku create

루트 폴더에는 Slack bot 관련 라이브러리 설정이 포함된 requirements.txt가 있어야 한다.

beautifulsoup4==4.7.1
slackclient==1.3.1

또한 Procfile에 어떤 스크립트를 실행할지 명시해주어야 한다.

worker: python yeongja.py

배포하기 전에, 한참 헤맸던 부분이 있었다면 바로 환경변수 설정이었다. 앞서 환경 변수로 저장했던 토큰을 heroku 서버에 저장해주어야 한다.

heroku config:set SLACK_BOT_TOKEN=xoxb-495912072293...

환경변수 설정까지 완료되었다면 배포해보자.

git push heroku master

정상적으로 배포되었는지 확인해보자.

heroku ps:scale worker=1

위 명령어를 치면 방금 배포한 worker 인스턴스 하나가 동작하고 있다는 것을 알 수 있다. 이제 어디서든 영자님께 맛집을 추천 받을 수 있게 되었다! Heroku의 공식 문서 중 Slack Bot을 배포하는 방법이 자세히 나와있다. (아래 링크 참고)

다음은 yeongja bot의 deploy pipeline이다.

 

 

GitHub 저장소와 연동을 해서, master 브랜치가 업데이트되면 자동으로 빌드하고 배포되도록 파이프라인을 구성해보았다. CI/CD를 통해 단 몇번의 클릭으로 빠르게 배포할 수 있어 정말 편리했다.

Reference

반응형