我构建了一个 Telegram 机器人,能够搜索、监控价格并让你买卖。以下是实现方法
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: