고든램지 봇 만들기

2023년 4월 12일

이 글은 2023년 4월 12일 퍼블 팀 블로그에 먼저 게시되었습니다. 원문 보기

태초에 슬랙봇이 있었다

귀차니즘의 극복은 모든 개발자의 숙명입니다. 수많은 소프트웨어들은 귀찮음의 극복 과정을 구현한 것이라고 봐도 무리가 없을 정도입니다. USB를 가져다니기 귀찮아서 세상에 나온 Dropbox, 콜택시를 부르기 귀찮아서 세상에 나온 Uber를 보세요!

직장인은 20대부터 60대까지 9,125끼의 점심을 먹습니다. 다시 말하자면 점심을 먹기 위해 9125번의 선택을 해야 하는 것입니다. 누군가에게는 너무나 귀찮은 일일 수 있고, 누군가에게는 너무나 기다려지는 시간일 수 있습니다. 그러나 어찌 되었건 귀찮은 건 사실입니다.

퍼블의 주변에는 밥플러스라는 훌륭한 식당이 존재합니다. 매일마다 바뀌는 5가지의 반찬, 7000원이라는 2023년 치고 저렴한 가격으로 놀라운 만족감을 제공해주는 곳이죠. 그러나 이런 것도 문제가 있으니 매일 메뉴를 확인하기 어렵다는 것입니다. 제한된 점심 시간 동안 애자일하게 빠르게 메뉴를 선택할 수 있어야 하는데, 매일마다 네이버를 들어가서 메뉴를 쳐야 하니 귀찮음에 통탄을 금치 못할 일입니다.

그래서 매일 네이버로 들어가서 밥플러스라고 검색창에 친 다음 메뉴를 확인한 후 동료들에게 전파-라는 귀차니즘을 피하기 위해, 혹은 개발자의 숙명에 저항하기 위해 고든 램지 봇이 세상에 나오게 되었습니다. 고든 램지 봇이라고 해서 놀라지 마세요. 이름처럼 혼내거나 욕하는 봇은 아닙니다.

What Gordon Ramsay do?

고든 램지 봇의 역할은 간단합니다. 매일 올리는 밥플러스의 메뉴 이미지를 웹에서 찾은 후, 오전 10시 40분에 해당 사진을 가져와 슬랙에 올리는 것입니다. 바로 이렇게요.

짜잔. 이렇게 해서 퍼블의 개발자들은 귀찮은 검색과 웹 서핑을 하지 않고도 슬랙을 통해서 오늘 밥플러스로 밥을 먹으러 가야 말지 빠르게 판단할 수 있게 되었습니다. 생산성이 향상된 것은 물론입니다.

How Gordan Ramsey Works

고든 램지 봇은 어떻게 동작하고 있을까요? 비밀의 코드 레시피는 다음과 같습니다. 밥플러스는 매일 주어진 시간마다 자신들의 네이버 블로그에 메뉴 사진을 올립니다. 포스트의 형태는 그대로이고, 메뉴 이미지만 바꿔서 기존 포스트를 수정하고 있습니다.

밥플러스 5호점(서울숲M타워점) 오늘의 메뉴

따라서 고든 램지 봇이 가장 먼저 하는 일은 밥플러스 블로그의 아티클에서 메뉴 이미지를 가져오는 것입니다.

def get_bob_plus_menu_img():
    res = requests.get(BOB_PLUS_URL)
    res.raise_for_status() 
    soup = BeautifulSoup(res.text, "lxml") 

    images = soup.select('img.se-image-resource')

    for img in images:
        height = int(img.get('data-height', 0))
        if height > BOB_PLUS_MENU_IMAGE_STANDARD:
            img_url = img.get('data-lazy-src', '')
            return img_url

HTTP 요청을 하기 위해 requests 를, 스크래핑을 통해 이미지를 가져오기 위해 Beautiful Soup 라이브러리를 사용했습니다. 해당 포스트에는 이미지가 여러 장 존재하는데, 그 중에 가장 큰 이미지가 메뉴였으므로 height가 BOB_PLUS_MENU_IMAGE_STANDARD , 즉 1000 이상인 이미지의 주소를 받아오고 있습니다.

하드코딩에 가까운 코드지만, 가장 간단한 것이 진리라는 오컴의 면도날처럼 현재 단계에서는 잘 작동하므로 여기까지만 구현하였습니다. 차후에 다른 제약 사항이 생긴다면 scikit-image 과 같은 라이브러리를 사용해서 이미지를 비교한더던지, 혹은 Ai를 사용할 수 도 있을 것입니다.

image를 받아온 후 바로 슬랙 웹훅을 날리고 싶지만 그 전에 체크해야 할 것이 있습니다. 바로 국경일 체크죠. 공휴일에 슬랙이 울리게 하고 싶지 않으니 해당 조건을 체크해주도록 하여야 합니다.

def is_today_national_holiday():
    year, month = str(datetime.today().year), datetime.today().strftime("%m")

    url = f'{OPEN_API_URL}'
    params = {
        'serviceKey': SERVICE_KEY,
        'solYear': year,
        'solMonth': month,
        '_type': 'json'
    }
    response = requests.get(url, params=params)
    result = json.loads(response.text)

    national_holiday_count = result['response']['body']['totalCount']

    if national_holiday_count < 1 :
        return False
    
    national_holidays = result['response']['body']['items']['item']

    for national_holiday in national_holidays:
        if national_holiday['isHoliday'] == 'Y' and str(national_holiday['locdate']) == datetime.today().strftime('%Y%m%d'):
            return True

공휴일의 체크를 위해서는 정부에서 제공해주는 open api를 사용하였습니다.

한국천문연구원_특일 정보 해당 Api는 해당 년도와 달을 체크해서 공휴일이 있으면 해당 공휴일을 반환해 줍니다. 만약 오늘 날짜가 공휴일의 날짜와 같다면 웹 훅을 보내지 않습니다.

def send_slack_webhook(webhook_url):
    headers = {
        "Content-type": "application/json"
    }
    data = {
        "type": "mrkdwn",
        "text": "밥플러스 급식 메뉴!",
        "attachments": [{
            "image_url": get_bob_plus_menu_img(),
            "text": ""
        }],
    }

    return requests.post(webhook_url, headers=headers, data=json.dumps(data))

def main():
    if not is_today_national_holiday():
        send_slack_webhook(SLACK_WEB_HOOK_URL)

그렇게 해서 슬랙 웹훅을 보내면 이제 밥플러스의 메뉴 사진이 슬랙에 도착하게 됩니다. 해당 파이썬 코드는 퍼블의 로컬 서버에서 코드를 스케쥴링해서 실행할 수 있게 하는 Cron tab을 통해 정해진 시간, 월요일부터 금요일 오전 10시 40분에 실행되게 됩니다.

이렇게 해서 퍼블의 개발자들은 귀찮게 밥플러스 블로그에서 메뉴늘 확인하지 않고 슬랙으로 오늘의 메뉴를 볼 수 있게 되었습니다. 빠르게 오늘 무엇을 먹어야 할지 판단할 수 있게 되었으므로 생산성의 향상도 기대할 수 있을 것입니다. 박수 짝짝.

고든 램지 봇은 빨간불에도 멈추지 않아

요리사 고든 램지는 불우한 어린 시절을 보냈다고 합니다. 하지만 지금은 힘든 시절을 거쳐서 세계적인 셰프이자 사업가로 성장하게 되었습니다. 고든 램지 봇은 불우한 시절을 보내지는 않았지만, 지금은 밥플러스의 메뉴를 가져오는 단순한 역할만 수행하고 있습니다. 그러나 고든 램지 봇 그 이름을 가진 요리사만큼 무궁무진한 가능성을 가지고 있다고 생각합니다.

밥플러스 메뉴판을 OCR을 통해 문자열을 읽어서 오늘 식사의 칼로리를 계산해주는 기능은 어떨까요? 혹은 퍼블이 가지고 있는 성수 근방의 깊고 넓은 맛집 데이터 베이스를 사용해서 Chat GPT로 직원이 먹고 싶은 음식을 파는 맛집을 바로 추천해 줄 수 도 있을 것입니다. 이쯤 되면 슬랙 봇이 아니라 스탠드얼론 프로그램이 되겠군요.

그러면 앞으로 더 발전할 고든 램지 봇과 여타 다른 슬랙 봇으로 나아질 퍼블의 생산성을 기대하며 이만 글을 줄이도록 하겠습니다. 읽어주셔서 감사합니다.

퍼블은 기술 없이 나만의 플랫폼으로 수익을 창출할 수 있는 노코드 플랫폼 빌더입니다. 또한 퍼블은 나만의 브랜디드 앱을 만드는 멋진 서비스도 제공하고 있답니다. 퍼블에 대해서 궁금하거나, 함께 놀라운 제품을 만들어가고 싶으신 분이라면 아래 링크를 참조해 주세요!

퍼블이 궁금하다면? → 퍼블에 대해서 알아보기 🔍

퍼블과 함께 하고 싶다면? → 퍼블의 채용 공고 확인하기! 🧑 💻


고든램지 봇 in 퍼블 (점심 메뉴 크롤링해서 슬랙에 보내기) was originally published in 퍼블 팀 블로그 on Medium, where people are continuing the conversation by highlighting and responding to this story.