재입고 알림 봇 만들기-4 실행하기

시리즈의 마지막 글입니다. 지금까지 만든 것들을 엮어줄 메인 프로그램과 그것을 실행하는 방법을 알아보겠습니다.

메인 프로그램

지금까지 만든 프로그램들(스크래핑, 텔레그램 등)은 각각 작은 역할을 하는 부품이라고 볼 수 있습니다. 전체 프로그램의 목표는 주기적으로 스크래핑을 실행하고 구매가능 상태가 되었을 때 사용자에게 알림(텔레그램)을 보내는 것입니다. 스크래핑과 알림은 되었고 그 둘을 엮어줄 프로그램이 필요합니다. 메인 프로그램의 역할은

  • 설정(실행 주기, 텔레그램 ID 등등)을 읽어와 세팅한다.
  • 주기적 실행한다.
    • 스크래핑 프로그램 호출
    • 구매 가능상태 체크
    • 알림 프로그램 호출

입니다.

설정 파일

설정 파일은 프로그램을 심플하게 만들기 위해 사용합니다. 이메일 주소, 텔레그램 ID, 실행 주기(몇분) 등이 프로그램에 들어가 있으면 보기에도 좋지 않고 나중에 변경을 할 때에도 프로그램을 수정해야 하므로 불편함이 있습니다. 이러한 정보들은 설정 파일로 분리하는게 좋습니다.
여기서는 실행 주기와 API를 사용하기 위한 텔레그램 토큰, 알림 메시지를 수신할 텔레그램 ID를 설정으로 분리했습니다.
설정 파일들은 메인 프로그램에서 읽어와 각 부품 프로그램들에 전달됩니다.

메인 프로그램

  • 9~10 라인 : 위에서 만든 설정 파일을 읽어오는 부분입니다.
  • 15~29 라인 : 스크래핑 결과를 해석하는 함수입니다. 스크래핑 대상이 되는 샵마다 달라지는 부분입니다. 스크래핑 하는 코드는 동일하고 스크래핑 대상마다 다른 것은 그것을 해석하는 부분입니다. 이를 위해 해석하는 부분을 스크래핑 프로그램이 아닌 메인 프로그램에 위치시켰습니다. 만들어진 함수는 39라인에서 재고 확인 클래스(StockCheck)를 생성할 때 전달됩니다. 실제 실행은 재고 확인 클래스에서 이루어지게 됩니다. 여러 샵을 함께 체크할 경우 이런 함수를 여러 개 만들어서 각각 체크 대상 링크와 함께 재고 확인 클래스로 전달해주면 됩니다. 샵을 체크하기 확장을 편하게 하기 위해 들어간 설계요소 입니다. 이렇게 자주 변하는 부분(이 함수)과 자주 변하지 않는 부분(재고 확인 클래스)를 분리해 놓는것이 좋은 프로그래밍 방법으로 생각됩니다.
  • 33 라인 : 메인 프로그램 부분입니다.
  • 34 ~ 35 라인 : 텔레그램 알림 클래스(TelegramBot)를 만들어주고 테스트 메시지를 보냅니다.
  • 37 ~ 39 라인 : 전체 프로그램의 핵심인 재고 확인 클래스를 만들어줍니다. 쉽게 식별하기 위해 이름을 넣어주고 스크래핑 대상이 되는 링크와 해석 함수를 전달했습니다.
  • 41 라인 : 설정으로 읽어온 실행 주기를 세팅합니다.
  • 44 ~ 35 라인 : 이 함수는 여러 개의 아이템을 체크하기 위한 것입니다. 재고 확인 클래스의 배열을 입력받습니다. 각 아이템들을 체크하고 그 결과를 반환합니다. for 와 같은 반복문으로 해도 되지만 그냥 심심해서 함수형으로 만들었습니다. 예를 들어 체크하려는 아이템이 레고, 마스크, 손소독제 3가지 라면 그 3가지 아이템의 재고를 체크(statusChanged 함수의 실행 결과)하고 그 결과를 리스트로 반환하게 됩니다.
  • 48 라인 : 계속 실행되도록 하기 위해 while True 로 무한 루프를 돌게 만들었습니다.
  • 49 라인 : 각 아이템을 체크하고 결과를 받아옵니다. 예제에서는 하나의 아이템만 만들어서 배열에 하나의 요소만 있습니다. 2가지 이상의 아이템을 체크하려면 37~39 라인 처럼 StockCheck 클래스를 만들어주고 check 함수에 전달되는 배열에 추가해주면 됩니다.
  • 51 라인 : 현재 시간과 함께 체크 결과를 출력합니다. 프로그램이 정상적으로 돌아가는지 확인하기 위한 부분입니다.
  • 53 라인 : 사용자 알림을 위해 구매가능 상태가 바뀐 것만 필터링 합니다. 역시 for 반복으로 해도 되지만 심심해서 함수형 스타일로 filter를 써봤습니다.
  • 55 ~ 56 라인 : 53 라인에서 가져온 상태가 변경된 상품 목록에 대해서 알림 메시지를 보냅니다.
  • 58 라인 : 실행 주기를 만들기 위해 잠시 쉬도록 만듭니다. 기본 설정(INTERVAL_MINS)에 따르게 되면 5분 동안 대기하게 됩니다.

이제 준비가 완료되었습니다.

실행하기

메인 프로그램을 실행하면 됩니다.

> python main.py

Monitoring started. 라는 메시지가 텔레그램으로 오고 5분 마다 실행 결과가 출력되면 정상적으로 프로그램이 실행되는 것입니다.

실행 환경

어떤 컴퓨터에서 실행할지에 따라 실행 방법에 차이가 조금 있습니다. 기본적으로 파이썬과 스크래핑, 텔레그램 등의 패키지가 설치된 환경에서 main.py 프로그램을 실행하면 됩니다. 각 프로그램들(스크래핑, 텔레그램 등)과 설정 파일은 main.py 프로그램과 동일한 디렉토리에 위치시켜주면 됩니다.

아나콘다가 설치된 윈도우의 경우에는 Anaconda Prompt를 실행하고 커맨드 라인에서 python main.py 로 실행하면 됩니다.

시놀로지와 같은 NAS에서 docker를 기반으로 실행한다면 우선 도커 > 컨테이너 > (아나콘다 컨테이너 선택) > 터미널 에 들어갑니다.
터미널 입력창에 # python main.py 로 실행하면 됩니다. 창을 닫은 상태로도 계속 실행되게 하려면 nohup 을 사용하시면 됩니다.

정리

여기까지 인터넷 쇼핑몰에 품절 상품이 구매 가능해지면 알림을 보내도록 하는 프로그램을 만들어봤습니다. 처음 글을 쓰고 나서 쉽게 써달라는 요청이 많아서 최대한 자세하게 작성해봤습니다. 전에 작성했던 프로그램을 보자니 부족한 부분이 많이 보입니다. 프로그래밍을 잘 모르시는 분들도 따라하실 수 있게 만들었지만 쉽게 쓰는게 역시 쉽지 않네요..

이런 요구사항이 많다는 것도 알게 되어서 서비스화하면 어떨까 생각이 들기도 합니다. 사용자가 간단히 URL만 등록하면 알아서 체크하고 알림을 보내게 해주는거죠. 이건 나중에 만들어봐야겠습니다. 잘 안되시는 부분 있으면 댓글이나 메일, 텔레그램 ID tldrsam 으로 문의 주세요. 긴 글 봐주셔서 감사합니다.

재입고 알림 봇 만들기-4 실행하기”의 2개의 생각

  1. 하얀소망 답글

    대단한 정성이 담긴 글 잘 보았습니다. 저도 시놀로지 나스에서 뭔가 돌려보려고 하는데, 큰 도움이 될 것 같습니다.

    • samsee 글쓴이답글

      감사합니다 🙂 시놀로지 이런저런 용도로 활용하기 좋은 것 같아요. 제가 올린 것도 그 일부가 될 수 있을 것 같네요.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다