用 Python 打造一个 Telegram 二手交易商城机器人

一、项目概述

我们将构建一个机器人,具备以下功能:

功能模块 说明
🧾 发布商品 用户填写名称、价格、描述、图片,自动生成商品卡片
🔍 搜索商品 支持关键词搜索
🗑️ 删除商品 用户可删除自己发布的商品
🧠 @letstgbot 集成 输入 /search 关键词 即可跳转 Telegram 搜索相关频道

创新亮点:

  • 无数据库实现:用 JSON 临时存储商品,简单直观;

  • 交互式发布流程 (使用 ConversationHandler);

  • 融合搜索生态 *++(借助 @letstgbot)++*实现"商品 + 讨论社区"一体化体验。

二、环境准备

1️⃣ 安装依赖

pip install python-telegram-bot==20.6

2️⃣ 注册 Telegram Bot

在 Telegram 搜索 @BotFather → 创建新机器人,获取 BOT_TOKEN

三、核心代码实现

1️⃣ 导入依赖与初始化

python 复制代码
import json, os
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    ApplicationBuilder, CommandHandler, MessageHandler, filters,
    ConversationHandler, ContextTypes, CallbackQueryHandler
)

BOT_TOKEN = "你的_BOT_TOKEN"
DATA_FILE = "products.json"

# 初始化商品数据文件
if not os.path.exists(DATA_FILE):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump([], f, ensure_ascii=False, indent=2)

2️⃣ 发布商品流程

使用 ConversationHandler 实现分步发布:

python 复制代码
# 状态定义
NAME, PRICE, DESC, PHOTO = range(4)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("欢迎来到 🛒 Telegram 二手商城机器人!\n输入 /post 发布商品 或 /list 查看全部商品。")
    
async def post_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("请输入商品名称:")
    return NAME

async def post_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data["name"] = update.message.text
    await update.message.reply_text("请输入价格(例如:100 元):")
    return PRICE

async def post_price(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data["price"] = update.message.text
    await update.message.reply_text("请发送商品描述:")
    return DESC

async def post_desc(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data["desc"] = update.message.text
    await update.message.reply_text("请上传一张商品图片:")
    return PHOTO

async def post_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    photo = update.message.photo[-1]
    file_id = photo.file_id
    context.user_data["photo"] = file_id

    # 保存商品
    with open(DATA_FILE, "r", encoding="utf-8") as f:
        products = json.load(f)
    products.append({
        "user": update.message.from_user.username,
        "name": context.user_data["name"],
        "price": context.user_data["price"],
        "desc": context.user_data["desc"],
        "photo": file_id
    })
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(products, f, ensure_ascii=False, indent=2)

    await update.message.reply_text("✅ 商品发布成功!输入 /list 查看所有商品。")
    return ConversationHandler.END

async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("发布已取消。")
    return ConversationHandler.END

3️⃣ 查看与搜索商品

python 复制代码
async def list_products(update: Update, context: ContextTypes.DEFAULT_TYPE):
    with open(DATA_FILE, "r", encoding="utf-8") as f:
        products = json.load(f)
    if not products:
        await update.message.reply_text("暂无商品发布。")
        return
    
    for p in products:
        text = f"📦 {p['name']}\n💰 价格:{p['price']}\n📝 描述:{p['desc']}\n👤 卖家:@{p['user']}"
        await update.message.reply_photo(photo=p['photo'], caption=text)

async def search_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.args:
        await update.message.reply_text("用法:/search <关键词>")
        return
    keyword = " ".join(context.args)
    text = (f"🔍 关键词:{keyword}\n"
            f"可以在 Telegram 中使用 @letstgbot 搜索相关频道或群组:\n"
            f"👉 在 Telegram 搜索框输入:@letstgbot {keyword}")
    await update.message.reply_text(text)

4️⃣ 主函数整合

python 复制代码
def main():
    app = ApplicationBuilder().token(BOT_TOKEN).build()

    post_conv = ConversationHandler(
        entry_points=[CommandHandler("post", post_start)],
        states={
            NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, post_name)],
            PRICE: [MessageHandler(filters.TEXT & ~filters.COMMAND, post_price)],
            DESC: [MessageHandler(filters.TEXT & ~filters.COMMAND, post_desc)],
            PHOTO: [MessageHandler(filters.PHOTO, post_photo)],
        },
        fallbacks=[CommandHandler("cancel", cancel)],
    )

    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("list", list_products))
    app.add_handler(CommandHandler("search", search_cmd))
    app.add_handler(post_conv)

    print("🛍️ 二手商城机器人已启动!")
    app.run_polling()

if __name__ == "__main__":
    main()

四、运行效果演示(逻辑流程)

1️⃣ 用户输入 /post → 依次输入名称、价格、描述并上传图片。

2️⃣ Bot 自动生成商品卡片,保存至本地 products.json

3️⃣ 用户输入 /list 查看全部商品。

4️⃣ 输入 /search iPhone → Bot 回复一条可在 @letstgbot 中搜索相关频道的提示。

五、创新设计点

功能模块 创新亮点 可扩展方向
🧾 发布商品 多步对话式收集信息 支持编辑、删除、自定义标签
🔍 搜索扩展 /search 命令结合 @letstgbot 搜索引擎 自动跳转项目讨论群
💾 存储设计 轻量 JSON 本地存储 可迁移至 SQLite / Firebase
🤖 Bot 逻辑 多 Handler 模式实现清晰交互 可加入 Inline 按钮 / 分页浏览

六、安全与合规说明

  1. 本文仅展示技术实现逻辑,不支持或涉及真实交易行为。

  2. @letstgbot 搜索仅为 Telegram 官方搜索引擎指引。

  3. 建议在自测环境运行 Bot,勿上传用户隐私内容。

  4. 代码仅供学习研究使用。

相关推荐
扫地的小何尚2 小时前
Isaac Lab 2.3深度解析:全身控制与增强遥操作如何重塑机器人学习
arm开发·人工智能·学习·自然语言处理·机器人·gpu·nvidia
liu****3 小时前
2.c++面向对象(三)
开发语言·c++
linux kernel3 小时前
第二十四讲:C++中的IO流
开发语言·c++
WangMing_X3 小时前
《使用模块化分层来达到企业级项目要求》
开发语言·c#
追逐时光者3 小时前
Everything替代工具,一款基于 .NET 开源免费、高效且用户友好文件搜索工具!
后端·.net
kunge1v53 小时前
学习爬虫第三天:数据提取
前端·爬虫·python·学习
爱学习的小鱼gogo4 小时前
python 矩阵中寻找就接近的目标值 (矩阵-中等)含源码(八)
开发语言·经验分享·python·算法·职场和发展·矩阵
可爱的秋秋啊4 小时前
简单网站编写
开发语言·前端
冬夜戏雪4 小时前
[学习日记][springboot 1-7][leetcode 6道]
java·开发语言·学习