티스토리 뷰

728x90

회사 슬랙에 점심메뉴+점심팟 구하는 채널이 있습니다.

늘 뭘 먹을지가 희대의 고민거리였는데, 최근 슬랙 메세지 송신 관련 api를 개발하면서 이참에 점심메뉴 추천봇을 만들어보는게 어떨까 하여 설연휴에 빈둥거리다 후루룩 개발해버렸습니다.


기획

개요

  • 사내 구글시트에 맛집정보를 저장. 직원이라면 누구나 쉽게 데이터 CRUD 가능
  • 컬럼정보 : 가게 | 메뉴 | 가격
  • 구글시트를 연동하여 랜덤으로 메뉴 3가지를 선택
  • 평일 오전 11시 슬랙 점심메뉴 채널에 메세지 송신
🗒️ 처음엔 RDBMS를 사용할까도 생각했지만 사사로운 프로젝트로 회사 DB를 점유하는 것도 부담스럽고, 데이터 관리도 귀찮아질 것 같아서 구글시트를 적용하기로 하였습니다.

 

알림봇 컨셉

  • 직원들이 먹을 점심을 미리 예언해주는 예언가

사용 기술

  • Python
    • gspread
    • oauth2 client
  • 슬랙 웹훅 API
  • Jenkins
🗒️ 파이썬을 사용한 이유는 현재 회사의 배치프로그램이 자바스크립트와 파이썬으로 이루어져있고, 신규 배치는 파이썬으로만 작업하고 있기 때문에 최대한 기존 개발환경을 따르고자 했습니다.

슬랙 점심봇 구조


개발

구글 스프레드시트 연동

# 파이썬 구글시트 연동 라이브러리 설치
pip3 install gspread

# Oauth2 인증 라이브러리 설치
pip3 install --upgrade oauth2client

구글시트 연동을 위해 gspread라이브러리와 oauth2client 라이브러리를 사용했습니다.

사용법은 아래 블로그를 참고했습니다.

저는 운좋게 마침 이미 다른 분이 구글시트 연동 작업을 해두신 게 있어서 그 json파일만 가져다 썼습니다.

 

참고 블로그

https://hleecaster.com/python-google-drive-spreadsheet-api/?amp 

 

파이썬으로 구글드라이브/스프레드시트 API 활용하기 (예제) - 아무튼 워라밸

파이썬으로 구글 드라이브, 특히 구글 스프레드시트 다루는 방법에 대해 정리했다. API를 활용해보자.

hleecaster.com

 

gspread 공식문서

https://docs.gspread.org/en/latest/index.html

 

gspread — gspread 5.1.1 documentation

© Copyright 2021, Anton Burnashev Revision 6ba0cde0.

docs.gspread.org

 

import os
import sys

file_path = os.path.realpath(__file__)
directory_path = os.path.dirname(file_path)
sys.path.append(os.path.join(directory_path, '../../src/lib'))

import gspread
from oauth2client.service_account import ServiceAccountCredentials
from slack_notify import send_slack_message_by_message_body

scope = [
'<https://spreadsheets.google.com/feeds>',
'<https://www.googleapis.com/auth/drive>',
]
json_file_name = f'''{directory_path}/구글API_키_생성하면서_받은_JSON파일.json'''
credentials = ServiceAccountCredentials.from_json_keyfile_name(json_file_name, scope)
gc = gspread.authorize(credentials)
spreadsheet_url = '구글시트_공유_URL_삽입'
doc = gc.open_by_url(spreadsheet_url)
worksheet = doc.worksheet('시트1') # 시트명 삽입

웹훅 생성

요기 생성 방법이 잘 나와있어서 링크 공유로 대체합니다

https://jojoldu.tistory.com/552

 

Slack Webhook API 생성하기

요즘 대부분의 개발도구들은 Slack과의 통합 (Integration)을 지원하지만, 여전히 미지원 하는 도구들도 많습니다. 이런 미지원 도구들을 Slack에 연동할때 Slack Webhook을 사용합니다. 저도 종종 사용하

jojoldu.tistory.com

메세지바디 만들기

Block Kit Builder사이트를 이용하면 손쉽게 슬랙 메세지를 원하는 형태로 꾸밀 수 있습니다.

https://app.slack.com/block-kit-builder/TVBAZBQJJ

 

Slack

nav.top { position: relative; } #page_contents > h1 { width: 920px; margin-right: auto; margin-left: auto; } h2, .align_margin { padding-left: 50px; } .card { width: 920px; margin: 0 auto; .card { width: 880px; } } .linux_col { display: none; } .platform_i

app.slack.com

 

from random import sample

# 엑셀 모든 데이터 가져오기
list_of_lists = worksheet.get_all_values()

# 그냥 랜덤으로 3개 가져오기
idx1, idx2, idx3 = sample(range(1, len(list_of_lists)-1), 3)

menu_list = []
menu_list.append(list_of_lists[idx1])
menu_list.append(list_of_lists[idx2])
menu_list.append(list_of_lists[idx3])

text_list = []
for menu in menu_list:
    # 컬럼 : 가게이름 / 메뉴 / 가격 / 추천인
    restaurant = menu[0]
    menu_name = menu[1]
    price = menu[2]
    user = menu[3]
    text = f'- {restaurant} / {menu_name} / {price}원 by {user}' # 테스트 후 추천인 컬럼을 추가해달라는 의견을 받아서 추가
    text_list.append(text)
text_list_str = '\\n'.join(text_list) # 이부분을 메세지바디의 텍스트 영역에 추가

slack_body = json.dumps({
 # block kit builder로 만든 값 삽입
})

메세지 송신

import urllib3

http = urllib3.PoolManager()
http.request(
            'POST',
            url=url, # 웹훅 주소
            headers={'Content-Type': 'application/json'},
            body=slack_body,
            timeout=10.0,
        )

젠킨스 스케쥴 추가

기존에 만들어진 스케쥴을 참고하여 젠킨스 프로젝트를 생성했습니다.

H 11 * * 1-5 : 평일(1-5) 오전 11시

 

crontab 문법 참고

https://dodonam.tistory.com/312

 

Load balancing을 위한 crontab - 젠킨스 스케쥴러 (h * * * * )

젠킨스는 빌드 스케쥴을 설정할 때 crontab 문법에 기반하여 스케쥴 가능하다. 젠킨스 내에서 여러개의 잡을 돌린다면 스케쥴을 자동으로 조절해 로드 밸런싱을 할 수 있는 방법이 있다. 주기적으

dodonam.tistory.com

크론 스케쥴 만들어주는 사이트

http://www.cronmaker.com/;jsessionid=node01nxc663yknyrs14pkfyclujcy5178032.node0?0 

 

CronMaker

 

www.cronmaker.com

 

젠킨스 빌드 중 만났던 오류들

  • 파일 권한 오류
    • /tmp/jenkins13508578941171011700.sh: line 6: ./src/lunchbot/lunchbot.py: Permission denied
    • 젠킨스에서 빌드했을 때 발생한 에러
    • 파일의 권한을 755로 변경하여 다시 서버로 PR+빌드하여 해결
    • chmod 755 lunchbot.py
  • No module 오류
    • File "./src/lunchbot/lunchbot.py", line 14, in <module>
          import gspread
      ModuleNotFoundError: No module named 'gspread'
    • requirements.txt에 모듈을 추가해야했음 (nodejs의 package.json에 모듈 작성하는 역할과 비슷한 것 같음. 노드는 새 모듈을 받으면 자동으로 추가되는데 pip3는 그렇지가 않은건가?)
    • gspread==5.1.1
      oauth2client==4.1.3

결과

전체 코드

https://github.com/kym9129/LunchBot/blob/master/src/lunchbot/lunchbot.py

 

GitHub - kym9129/LunchBot: 점심메뉴 추천 슬랙알림봇 노스트라다묵스

점심메뉴 추천 슬랙알림봇 노스트라다묵스. Contribute to kym9129/LunchBot development by creating an account on GitHub.

github.com

 

정리

로직 자체는 단순했지만 파이썬 가상환경, 셔뱅, 젠킨스 등 잘 몰랐던 내용을 학습하게 되어 생각보다 얻은게 더 많은 것 같습니다.

해야지 해야지 하고 마음만 먹었는데, 실제로 실행에 옮기게 되어 뿌듯합니다 😀

공개 후에 다른 분들이 맛집 정보도 많이 추가해주시고 새로운 아이디어도 주셔서 더 좋았습니다!

사람들의 뜨거운 반응...!

 

728x90
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함