점심메뉴 알리미
카카오 채널 메뉴를 크롤링해 Google Chat으로 자동 알림
계기
사내 점심 메뉴는 카카오톡 채널에 게시글 형태로 올라왔습니다. 별도 알림이 오지 않아 매번 채널 프로필에 들어가 확인해야 했고, 당일 음식 사진이 늦게 올라오는 날에는 주간 메뉴표를 다시 찾아봐야 했습니다.
자주 반복되는 작은 불편이었지만, 점심시간 전마다 여러 사람이 같은 과정을 거치고 있었습니다. 그래서 메뉴가 올라오는 채널을 자동으로 확인하고, 사내 메신저에서 바로 볼 수 있게 만드는 알림 서비스를 만들었습니다.
구현
Puppeteer로 카카오 채널의 포스트 목록을 크롤링하고, 고정 포스트인 주간 메뉴표와 일반 포스트인 일일 메뉴를 분리해서 수집했습니다. 제목, 내용, 이미지 URL을 저장해 이전에 확인한 포스트와 비교하고, 새 메뉴가 있을 때만 Google Chat 웹훅으로 전송하도록 했습니다.
평일 오전 10시부터 11시 30분까지 30분 간격으로 확인하고, 11시 55분에 한 번 더 실행되도록 스케줄을 구성했습니다. 공휴일에는 식당이 운영되지 않기 때문에 한국 공휴일 데이터를 기준으로 실행을 건너뛰게 했습니다.
이미지 처리 개선
처음에는 주간 메뉴표 이미지를 고정 좌표로 잘라 당일 메뉴만 전송했습니다. 하지만 메뉴표의 위치나 크기가 조금만 바뀌어도 영역이 어긋나 일부가 잘리거나 불필요한 영역이 포함됐습니다.
이를 보완하기 위해 Sharp로 이미지를 그레이스케일로 변환한 뒤, 행과 열의 평균 밝기를 분석해 표의 가로선과 세로선을 찾도록 바꿨습니다. 감지한 경계선을 기준으로 월요일부터 금요일까지의 영역을 자동으로 잘라 저장하고, imgBB에 업로드한 URL을 알림에 사용했습니다.
알림 흐름
서비스는 실행될 때마다 마지막으로 저장된 포스트 정보를 먼저 확인합니다.
- 주간 메뉴표가 바뀌면 이미지를 요일별로 자르고, 업로드한 URL과 함께 새 주간 메뉴 정보를 저장합니다.
- 일일 메뉴가 새로 올라오고 제목의 날짜가 오늘이면 바로 전송합니다.
- 오늘 요일에 해당하는 주간 메뉴 이미지는 하루에 한 번만 전송합니다.
- 이미 전송한 메뉴는 저장된 전송 이력을 기준으로 다시 보내지 않습니다.
운영
로컬에서만 실행하면 제가 출근하지 않는 날에는 알림도 멈추는 문제가 있었습니다. 그래서 Oracle Cloud 인스턴스에 Docker Compose로 배포하고, 데이터 디렉터리를 컨테이너 외부에 마운트해 마지막 포스트와 전송 이력이 유지되도록 구성했습니다.
결과
동료들은 카카오톡 채널을 직접 찾아가지 않고도 정해진 시간마다 Google Chat에서 메뉴를 확인할 수 있게 됐습니다. 단순히 정보를 가져오는 자동화에서 끝내지 않고, 메뉴표 형식 변경과 중복 전송, 휴무일, 배포 환경까지 고려하면서 일상적인 불편을 안정적으로 줄인 작업이었습니다.