Telegram Bot을 만들어 검색하고, 가격을 모니터링하며, 구매와 판매를 할 수 있게 했습니다. 방법은 다음과 같습니다.

발행: (2026년 5월 2일 PM 11:24 GMT+9)
6 분 소요
원문: Dev.to

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:

0 조회
Back to Blog

관련 글

더 보기 »