我构建了一个 Telegram 机器人,能够搜索、监控价格并让你买卖。以下是实现方法

发布: (2026年5月2日 GMT+8 22:24)
4 分钟阅读
原文: Dev.to

Source: Dev.to

大多数人每天手动在 Jiji 或 Amazon 上查看,等待价格下降。我构建了一个 Telegram 机器人,能够自动为你完成这件事,并且还能直接在 Telegram 中发布和出售商品。

无需网站。无需 App。只需 Telegram。

GitHub:

功能说明

该机器人分为两个角色。

**买家:**搜索任意商品,设定目标价,当价格下降时立即收到 Telegram 提醒。它会抓取 Jiji Kenya 和 Google Shopping 的真实商品列表。

**卖家:**发布带有照片和描述的商品。买家可以找到该商品并直接在 Telegram 上联系你。

架构概览

项目被划分为若干专注的模块:

  • scraper.py — 使用 BeautifulSoup 从任意商品 URL 中提取价格
  • jiji.py — 直接从 Jiji Kenya 的 Nuxt 数据层抓取商品列表
  • search.py — 通过 SerpAPI 查询任意国家的 Google Shopping 商品
  • telegram.py — 发送价格提醒消息
  • bot_handler.py — 处理所有 Telegram 命令和对话流程
  • scheduler.py — 每 6 小时自动执行价格检查
  • listings.py — 存储和读取本地市场商品列表

Jiji 抓取器

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 商品列表,而无需使用无头浏览器。

对话流程

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)],
)

每个状态都会等待用户输入后才进入下一步。用户无需手动输入带参数的命令——机器人会自然地引导他们完成操作。

卖家照片支持

卖家发布商品时可以发送照片。Telegram 会将照片存储在其服务器上并返回一个 file_id。该 ID 被保存到 JSON 配置中,随后用于向买家发送照片:

if l.get("photo_id"):
    await update.message.reply_photo(photo=l["photo_id"], caption=caption)

无需自行搭建图片托管,Telegram 全部处理。

自动价格监控

调度器使用 APScheduler 每 6 小时运行一次。它会检查所有被监控的 URL,将当前价格与目标价比较,并在价格下降时触发 Telegram 提醒:

scheduler.add_job(check_all, "interval", hours=interval_hours)

启动一次后即可忘记它。

我的收获

  • Nuxt.js 应用会把数据嵌入到 script 标签中。只要知道查找位置,抓取就可以在不使用 Selenium 或 Playwright 的情况下轻松完成。
  • Telegram 的 ConversationHandler 功能强大但有状态性。多用户同时处于不同状态时,需要谨慎管理会话数据。
  • 长结果必须拆分为单独的消息发送。Telegram 对每条消息的字符数上限为 4096,单条超长消息会导致处理器静默崩溃。

下一步计划

  • WhatsApp 集成
  • 除 Jiji 之外的更多市场来源
  • 价格历史图表
  • 用于管理商品的 Web 仪表盘

试用

GitHub:

0 浏览
Back to Blog

相关文章

阅读更多 »