رفتن به محتوای اصلی
🛍️ سطح: متوسط · رایگان

سورس ربات ثبت سفارش بله

مرحله‌به‌مرحله از مشتری نام، محصول و شماره تماس می‌گیرد، سفارش را در فایل اکسل ذخیره می‌کند و خلاصه‌اش را برای مشتری می‌فرستد.

طراحی و کدنویسی: به‌روزرسانی: زبان: Python 3حجم کد: حدود ۱۵۰ خطمجوز: آزاد (CC0)

پاسخ کوتاه

ربات ثبت سفارش بله یک گفتگوی سه‌مرحله‌ای (نام → محصول → تلفن) را با یک ماشین حالت ساده در پایتون پیاده می‌کند: وضعیت هر کاربر در یک دیکشنری نگه داشته می‌شود و در پایان، سفارش با تاریخ در فایل orders.csv ذخیره می‌شود که مستقیماً با اکسل باز می‌شود.

ربات ثبت سفارش بله چطور کار می‌کند؟

این ربات یک گفتگوی مرحله‌ای با مشتری انجام می‌دهد: اول نام، بعد محصول یا خدمت، و در آخر شماره تماس را می‌پرسد و سفارش را داخل فایل orders.csv ذخیره می‌کند تا بتوانید با اکسل بازش کنید. الگوی «گفتگوی مرحله‌ای» که اینجا یاد می‌گیری، پایهٔ ربات‌های رزرو نوبت، فرم ثبت‌نام و پشتیبانی هم هست.

زبان: پایتون ۳
وابستگی: فقط requests
اجرا: long polling (بدون دامنه و SSL)
هزینه: رایگان

آموزش راه‌اندازی ربات ثبت سفارش بله در ۵ قدم

این مراحل را به‌ترتیب انجام بده تا ربات روی سیستم خودت یا سرور بالا بیاید. زمان تقریبی: ۱۵ دقیقه.

از BotFather در بله توکن ربات را بگیر.
پایتون را نصب کن و pip install requests را اجرا کن.
فایل bot.py را باز کن و مقدار TOKEN را جایگزین کن.
python bot.py را اجرا کن و در بله /start را بزن تا گفتگوی ثبت سفارش شروع شود.
فایل orders.csv که کنار برنامه ساخته می‌شود را با اکسل باز کن و سفارش‌ها را ببین.

کل سورس ربات ثبت سفارش بله (کپی یا دانلود کن)

این همان کدی است که داخل فایل ZIP هم هست. می‌توانی مستقیم از اینجا کپی کنی. فقط یادت باشد مقدار TOKEN را با توکن رباتت عوض کنی.

bot.py
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
#  ربات ثبت سفارش بله
#  طراحی و کدنویسی: سروش مقدمی — فیلتور (filtori.com)
# ------------------------------------------------------------
#  این ربات یک گفتگوی مرحله‌ای با مشتری انجام می‌ده و سفارش رو
#  می‌گیره و داخل فایل orders.csv ذخیره می‌کنه:
#     ۱) اسم مشتری
#     ۲) محصول یا خدمتی که می‌خواد
#     ۳) شمارهٔ تماس
#  در پایان یک خلاصهٔ سفارش برای مشتری می‌فرسته.
#
#  آموزش کامل:
#     https://filtori.com/bale-bot-source/order-bot/
#  نسخهٔ اختصاصی + اتصال به پنل و پرداخت؟  09122874862
#  تلگرام ما: https://t.me/filtori
# ------------------------------------------------------------

import csv
import time
from datetime import datetime

import requests

TOKEN = "توکن_ربات_خودت_را_اینجا_بگذار"
BASE = f"https://tapi.bale.ai/bot{TOKEN}"

# فایلی که سفارش‌ها توش ذخیره می‌شن (کنار همین فایل ساخته می‌شه)
ORDERS_FILE = "orders.csv"

# ------------------------------------------------------------
#  حافظهٔ موقت گفتگو:
#  برای هر کاربر نگه می‌داریم که در کدوم مرحله از ثبت سفارشه.
#  کلید = chat_id  |  مقدار = {"step": ..., "data": {...}}
#  توجه: این حافظه در رم هست؛ اگر ربات ری‌استارت بشه پاک می‌شه.
#  برای پروژهٔ واقعی بهتره از دیتابیس استفاده بشه (تیم فیلتور کمکت می‌کنه).
# ------------------------------------------------------------
sessions = {}


def send_message(chat_id, text):
    url = f"{BASE}/sendMessage"
    try:
        requests.post(url, json={"chat_id": chat_id, "text": text}, timeout=15)
    except requests.RequestException as error:
        print("خطا در ارسال پیام:", error)


def get_updates(offset):
    url = f"{BASE}/getUpdates"
    params = {"offset": offset, "timeout": 30}
    try:
        return requests.get(url, params=params, timeout=40).json()
    except requests.RequestException as error:
        print("خطا در دریافت پیام‌ها:", error)
        return {"ok": False, "result": []}


def save_order(data):
    """ذخیرهٔ یک سفارش کامل در فایل CSV."""
    # اگر فایل هنوز ساخته نشده، اول سطر عنوان‌ها رو می‌نویسیم.
    is_new_file = False
    try:
        with open(ORDERS_FILE, "r", encoding="utf-8"):
            pass
    except FileNotFoundError:
        is_new_file = True

    with open(ORDERS_FILE, "a", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        if is_new_file:
            writer.writerow(["تاریخ", "نام", "محصول", "تلفن"])
        writer.writerow(
            [
                datetime.now().strftime("%Y-%m-%d %H:%M"),
                data["name"],
                data["product"],
                data["phone"],
            ]
        )


def handle(chat_id, text):
    """منطق گفتگوی مرحله‌ای ثبت سفارش."""
    # شروع دوباره در هر لحظه با /start
    if text == "/start":
        sessions[chat_id] = {"step": "name", "data": {}}
        send_message(chat_id, "سلام 👋 برای ثبت سفارش، لطفاً «نام و نام خانوادگی» خود را بنویسید:")
        return

    # اگر کاربر وسط گفتگو نبوده، راهنماییش کن
    if chat_id not in sessions:
        send_message(chat_id, "برای شروع ثبت سفارش، دستور /start را بفرستید.")
        return

    session = sessions[chat_id]
    step = session["step"]

    if step == "name":
        session["data"]["name"] = text
        session["step"] = "product"
        send_message(chat_id, "ممنون ✅ حالا بنویس چه محصول یا خدمتی می‌خوای؟")

    elif step == "product":
        session["data"]["product"] = text
        session["step"] = "phone"
        send_message(chat_id, "عالیه 👌 در آخر شمارهٔ تماست رو بنویس تا باهات هماهنگ کنیم:")

    elif step == "phone":
        session["data"]["phone"] = text
        data = session["data"]
        save_order(data)  # ذخیره در فایل

        send_message(
            chat_id,
            "سفارشت با موفقیت ثبت شد ✅\n\n"
            f"👤 نام: {data['name']}\n"
            f"🛍️ محصول: {data['product']}\n"
            f"📞 تلفن: {data['phone']}\n\n"
            "به‌زودی باهات تماس می‌گیریم. ممنون که فیلتور رو انتخاب کردی 🙏",
        )
        # گفتگو تموم شد؛ حافظهٔ این کاربر رو پاک می‌کنیم
        del sessions[chat_id]


def main():
    print("ربات ثبت سفارش فیلتور روشن شد... (Ctrl+C برای خاموش‌کردن)")
    offset = 0
    while True:
        updates = get_updates(offset)
        if not updates.get("ok"):
            time.sleep(2)
            continue

        for update in updates.get("result", []):
            offset = update["update_id"] + 1
            message = update.get("message")
            if not message:
                continue
            chat_id = message["chat"]["id"]
            text = message.get("text", "")
            if text:
                handle(chat_id, text)

        time.sleep(0.5)


if __name__ == "__main__":
    main()
کل سورس این ربات ↑ — همین حالا کپی یا دانلود کن

کد را خط‌به‌خط بفهم

کپی‌کردن کافی نیست؛ اگر بدانی هر بخش چرا آن‌جاست، می‌توانی ربات را برای کسب‌وکار خودت تغییر بدهی. مهم‌ترین قطعه‌های ربات ثبت سفارش بله:

۱حافظهٔ گفتگو: یک دیکشنری ساده

sessions = {}
# chat_id -> {"step": "name", "data": {}}

برای هر کاربر نگه می‌داریم «الان در کدام مرحله است» و «تا حالا چه گفته». این ساده‌ترین شکل یک ماشین حالت (state machine) است. چون در رم است، با ری‌استارت پاک می‌شود؛ در نسخهٔ واقعی جایش را SQLite یا Redis می‌گیرد.

۲/start همیشه گفتگو را از نو شروع می‌کند

if text == "/start":
    sessions[chat_id] = {"step": "name", "data": {}}

کاربر ممکن است وسط گفتگو پشیمان شود یا اشتباه بنویسد. با این‌که /start در هر لحظه وضعیت را ریست می‌کند، هیچ‌وقت در حالت گیرکرده نمی‌ماند.

۳زنجیرهٔ مراحل

if step == "name": ... session["step"] = "product"
elif step == "product": ... session["step"] = "phone"

هر شاخه یک کار می‌کند: جواب فعلی را ذخیره می‌کند، مرحلهٔ بعد را تنظیم می‌کند و سوال بعدی را می‌پرسد. اضافه‌کردن مرحلهٔ جدید (مثلاً «آدرس») یعنی فقط یک elif دیگر.

۴ذخیره در CSV که اکسل بفهمد

with open(ORDERS_FILE, "a", newline="", encoding="utf-8") as file:
    csv.writer(file).writerow([...])

حالت a (append) یعنی سفارش‌های قبلی پاک نمی‌شوند. newline="" از سطرهای خالی اضافه در ویندوز جلوگیری می‌کند. اگر اکسل فارسی را به‌هم‌ریخته نشان داد، encoding را به utf-8-sig تغییر بده تا BOM اضافه شود.

۵خلاصهٔ سفارش برای مشتری

f"👤 نام: {data['name']}\n🛍️ محصول: {data['product']}..."

بازخورد فوری اعتماد می‌سازد؛ مشتری مطمئن می‌شود سفارشش رسیده. همین‌جا می‌توانی یک پیام هم به chat_id خودت بفرستی تا از هر سفارش جدید باخبر شوی (در ربات منوی کافه این کار انجام شده).

۶پاک‌کردن حافظه بعد از پایان

del sessions[chat_id]

وقتی سفارش ذخیره شد، وضعیت کاربر را حذف می‌کنیم تا پیام بعدی‌اش به‌عنوان ادامهٔ گفتگوی قبلی تعبیر نشود و رم ربات هم با هزاران کاربر پر نشود.

🔁 همین کد روی تلگرام هم اجرا می‌شود: فقط BASE را به https://api.telegram.org/bot{TOKEN} تغییر بده. جدول تفاوت API بله و تلگرام را ببین.

سوال‌های پرتکرار دربارهٔ ربات ثبت سفارش بله

سفارش‌ها کجا ذخیره می‌شوند؟

در فایلی به نام orders.csv کنار برنامه ذخیره می‌شوند که با اکسل و گوگل‌شیت باز می‌شود. هر سطر: تاریخ، نام، محصول، تلفن.

اگر ربات ری‌استارت شود اطلاعات نیمه‌کاره می‌پرد؟

بله، گفتگوی نیمه‌تمام در حافظهٔ موقت است؛ سفارش‌های کامل‌شده در CSV می‌مانند. برای نسخهٔ واقعی بهتر است وضعیت گفتگو هم در دیتابیس ذخیره شود که فیلتور می‌تواند برایتان پیاده‌سازی کند.

چطور شمارهٔ تلفن را اعتبارسنجی کنم؟

در شاخهٔ step == "phone" قبل از ذخیره چک کنید متن با ۰۹ شروع شود و ۱۱ رقم باشد؛ اگر نبود، دوباره بپرسید و مرحله را تغییر ندهید.

می‌شود درگاه پرداخت به آن وصل کرد؟

بله، در نسخهٔ اختصاصی می‌توان پرداخت آنلاین، پنل مدیریت سفارش‌ها و پیامک تأیید را اضافه کرد. جزئیات در صفحهٔ سفارش ربات بله.

طراح و برنامه‌نویس این سورس‌ها · بنیان‌گذار فیلتور

مدیر بخش دیتابیس همراه اول و فعال در توسعهٔ نرم‌افزار از سال ۱۳۹۱؛ با سابقهٔ کار روی سامانه‌های بانکی و پرتراکنش. این سورس‌ها را طوری نوشته که ساده، خوانا و قابل توسعه باشند و مستقیم در کسب‌وکار واقعی استفاده شوند.

راه‌اندازی این ربات برایت سخت شد؟

لازم نیست خودت درگیر شوی. تیم فیلتور این ربات را نصب، شخصی‌سازی و به کسب‌وکارت وصل می‌کند.