티스토리 뷰
회사 슬랙에 점심메뉴+점심팟 구하는 채널이 있습니다.
늘 뭘 먹을지가 희대의 고민거리였는데, 최근 슬랙 메세지 송신 관련 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
정리
로직 자체는 단순했지만 파이썬 가상환경, 셔뱅, 젠킨스 등 잘 몰랐던 내용을 학습하게 되어 생각보다 얻은게 더 많은 것 같습니다.
해야지 해야지 하고 마음만 먹었는데, 실제로 실행에 옮기게 되어 뿌듯합니다 😀
공개 후에 다른 분들이 맛집 정보도 많이 추가해주시고 새로운 아이디어도 주셔서 더 좋았습니다!
'사부작사부작' 카테고리의 다른 글
사내 백오피스 거래내역조회 페이지 응답속도 개선 후기 (0) | 2023.07.14 |
---|---|
홈화면 캐러셀 API 응답속도 개선 후기 (0) | 2023.07.10 |
[회고] 숫자로 돌아보는 2022년 (0) | 2022.12.31 |
[Github Action] push할 때 자동으로 슬랙메세지 보내기 (0) | 2022.07.19 |
2021년 회고 : 자바의정석에서 신규플젝런칭까지 (4) | 2022.01.03 |
- Total
- Today
- Yesterday
- 몽고디비
- java
- devops
- 라라벨
- 분산처리
- 쿠버네티스
- phpUnit
- NoSQL
- index
- 백엔드
- laravel
- database
- kubernetes
- 리눅스 컨테이너
- pods
- Container
- 대규모 데이터 처리
- MySQL
- 주니어개발자
- k8s
- Infra
- docker
- mongoDB
- laravel 테스트코드
- 샤딩
- mockery
- laravel 테스트
- springboot
- php
- sre
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |