재입고 알림 봇 만들기(python + telegram bot)

발단

일시품절!!

사고 싶은 물건이 있는데 게다가 돈도 있는데! 재고가 없는 경우가 있습니다. 하루에도 몇 번씩 사이트에 들러 확인을 하곤 하죠. 그런 물건이 10개쯤 되면 매번 체크하기 번거롭겠죠. 사이트에서 재입고 알림 서비스를 해주면 좋겠지만 없는 경우가 많습니다.
간단하게 스크래핑을 하고 챗봇을 만들어 구매가 가능해지면 메시지를 주도록 만들어 보았습니다.

스크래핑

스크래핑은 사이트마다 달라질 수 밖에 없습니다. 이번에 노린 물건은 레고 아이디어 프렌즈 입니다. 레고 사이트를 분석해 봅시다.

브라우저에서 개발자 도구를 켜고 “일시품절” 이라고 써진걸 선택합니다. 다음으로 “구매가능”한 아이템을 선택하고 DOM 탐색기에서 선택을 해줍니다.

  • 품절인 경우
  • 구매 가능한 경우

대략 보니 p 태그에 data-test 속성이 product-overview-availability 인 것을 찾으면 될것 같습니다. p 엘리먼트에 “품절” 이라는 단어가 있으면 계속 품절인 것으로, 없으면 구매가능한 것으로 판단할 수 있을 것 같습니다. 다른 사이트에 대해서도 쉽게 추가할 수 있도록 체크하는 로직 부분은 분리해서 클래스에 전달하는 방식으로 만들어 봅시다. 뚜닥뚜닥 이런 코드를 만들어 봤습니다.

  • 1라인 :일단 파이썬 스크래핑의 기본인 requests 를 모듈을 가져옵니다.
  • StockCheck 클래스는 재고 확인의 전반적인 로직을 담당합니다. 체크할 URL과 품절 확인 메서드를 전달받아 실행한 뒤 이전에 확인된 품절 상태와 비교합니다.
  • 43라인 : main 부분은 테스트를 위한 코드 입니다. 파이썬이나 루비에서 많이 사용하는 방식이죠.
  • 44 라인의 legoshopCheck 함수는 레고 사이트의 품절을 체크합니다. BeautifulSoup 라이브러리로 HTML을 파싱하고 p 엘리먼트 중 특정 요소를 가지고 있는 것을 찾아냅니다. 그 안에 ‘품절’ 이라는 단어가 있으면 품절 상태로 판단합니다.

챗봇

메신저는 텔레그램으로 선택했습니다. 무료이고 API 지원이 잘 되는 편이라.. 다른 메신저는 어떤지 모르겠네요.

우선 텔레그램 봇을 만들어줘야 합니다. 검색하면 상당히 많이 나오는데 저는 이분 포스팅을 참조했습니다.

봇이 만들어졌으니 간단히 API 를 만들어 봅니다. python-telegram-bot 이라는 모듈을 사용했습니다.

보시다시피 엄청 간단합니다. 그냥 API 래핑한거죠. 사실 챗봇이 아닙니다. 그냥 메시지를 보내주는 역할만 하니까요.

구동하기

코드를 깔끔하게 만들기 위해 설정 부분(토큰, 스크래핑 주기)을 밖으로 빼줍니다.

마지막으로 메인 코드 부분입니다.

  • 15라인 : legoshopCheck는 위에 나왔던 코드와 동일합니다.
  • 44라인 : check 함수는 여러 개의 아이템을 한 번에 체크할 수 있도록 만들었습니다.
  • 49, 53~56라인 : 각 아이템별로 체크를 하고 입고 상태가 바뀐 것들에 대해 텔레그램으로 메시지를 보내줍니다.

이 프로그램은 계속 돌아가야 의미가 있으므로 집에 있던 시놀로지 Docker에 miniconda 이미지를 받아 프로그램을 설치하고 실행했습니다. (시놀로지 NAS에서 Docker 사용하기 참조)

내가 찾던 물건이 입고가 되면 이런 메시지가 옵니다.

Received message when restocked

발전시킬 부분

일단 기본적인 기능은 작동하지만 발전시킬 부분이 많아 보입니다. 재입고를 체크하는 부분은 크게 손볼게 없어 보입니다. 챗봇과 스케줄링 하는 부분을 발전시켜볼 수 있을 것 같습니다.

  • 서비스 시작과 종료, 상태 질의
  • 등록/삭제/임의 실행/리스팅
  • 스케줄 조정 – 체크 주기 바꾸기 등.
  • 여러 사람에게 메시지를 보낸다. 동일한 아이템을 구독하는 방식으로 바꾸기.
  • 여러 사람이 운영한다(배포)

댓글 남기기

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