Telegram Bot을 만들어 검색하고, 가격을 모니터링하며, 구매와 판매를 할 수 있게 했습니다. 방법은 다음과 같습니다.
Source: Dev.to
대부분의 사람들은 매일 수동으로 Jiji 또는 Amazon을 확인하며 가격이 내려가기를 기다립니다. 저는 이를 자동으로 수행하고 텔레그램에서 직접 아이템을 등록·판매할 수 있는 텔레그램 봇을 만들었습니다.
웹사이트도, 앱도 없습니다. 오직 텔레그램만 있으면 됩니다.
GitHub:
What It Does
봇은 두 가지 역할을 가집니다.
구매자를 위해: 원하는 제품을 검색하고 목표 가격을 설정하면, 가격이 내려가는 순간 텔레그램 알림을 받습니다. Jiji Kenya와 Google Shopping의 실제 목록을 가져옵니다.
판매자를 위해: 사진과 설명을 함께 제품을 등록합니다. 구매자는 이를 찾아보고 텔레그램을 통해 직접 연락할 수 있습니다.
The Architecture
프로젝트는 목적에 맞게 나뉜 모듈들로 구성됩니다:
scraper.py— BeautifulSoup을 사용해 모든 제품 URL에서 가격을 추출합니다jiji.py— Jiji Kenya 목록을 Nuxt 데이터 레이어에서 직접 스크래핑합니다search.py— SerpAPI를 통해 전 세계 어떤 제품이든 Google Shopping을 조회합니다telegram.py— 가격 알림 메시지를 전송합니다bot_handler.py— 모든 텔레그램 명령과 대화 흐름을 처리합니다scheduler.py— 6시간마다 자동 가격 검사를 실행합니다listings.py— 로컬 마켓플레이스 목록을 저장·조회합니다
The Jiji Scraper
Jiji는 JavaScript로 목록을 로드하기 때문에 일반 요청으로는 빈 내용만 반환됩니다. 핵심은 Jiji가 Nuxt.js를 사용해 페이지 데이터를 JSON 스크립트 태그에 삽입한다는 점입니다:
match = re.search(r'id="__NUXT_DATA__"[^>]*>(.*?)', res.text, re.DOTALL)
data = json.loads(match.group(1))
그 후 데이터 구조를 순회하면서 제목, 가격, 위치, URL 등을 추출하면 됩니다. 헤드리스 브라우저 없이도 실제 Jiji 목록을 얻을 수 있습니다.
The Conversation Flow
python-telegram-bot은 다단계 흐름을 관리하는 ConversationHandler를 제공합니다. 탐색 흐름은 다음과 같습니다:
browse_handler = ConversationHandler(
entry_points=[CommandHandler("browse", browse_start)],
states={
BROWSE_QUERY: [MessageHandler(filters.TEXT, browse_get_query)],
BROWSE_MIN_PRICE: [MessageHandler(filters.TEXT, browse_min_price)],
BROWSE_MAX_PRICE: [MessageHandler(filters.TEXT, browse_max_price)],
},
fallbacks=[CommandHandler("cancel", cancel)],
)
각 상태는 다음 단계로 넘어가기 전에 사용자의 입력을 기다립니다. 사용자는 인자를 포함한 명령을 직접 입력할 필요가 없으며, 봇이 자연스럽게 안내합니다.
Photo Support for Sellers
판매자가 제품을 등록할 때 사진을 보낼 수 있습니다. 텔레그램은 사진을 자체 서버에 저장하고 file_id를 반환합니다. 이 ID를 JSON 설정에 저장해 두었다가 구매자에게 사진을 보낼 때 사용합니다:
if l.get("photo_id"):
await update.message.reply_photo(photo=l["photo_id"], caption=caption)
이미지 호스팅이 필요 없으며, 모든 처리를 텔레그램이 담당합니다.
Automatic Price Monitoring
스케줄러는 APScheduler를 이용해 6시간마다 실행됩니다. 모든 모니터링 URL을 검사하고 현재 가격을 목표 가격과 비교해 가격이 내려가면 텔레그램 알림을 발송합니다:
scheduler.add_job(check_all, "interval", hours=interval_hours)
한 번 실행해 두면 자동으로 동작합니다.
What I Learned
- Nuxt.js 애플리케이션은 데이터를 스크립트 태그에 삽입합니다. 어디서 찾아야 할지 알면 Selenium이나 Playwright 없이도 쉽게 스크래핑할 수 있습니다.
- 텔레그램의
ConversationHandler는 강력하지만 상태를 유지합니다. 여러 사용자가 서로 다른 상태에 있을 때 세션 데이터를 신중히 관리해야 합니다. - 긴 결과는 개별 메시지로 나눠 보내야 합니다. 텔레그램은 메시지당 4096자 제한이 있어 한 번에 너무 긴 블록을 보내면 핸들러가 조용히 오류를 일으킵니다.
What Is Next
- WhatsApp 연동
- Jiji 외의 추가 마켓플레이스 소스
- 가격 변동 차트
- 목록 관리를 위한 웹 대시보드
Try It
GitHub: