مرحلهبهمرحله از مشتری نام، محصول و شماره تماس میگیرد و سفارش را در فایلی ذخیره میکند که با اکسل باز میشود.
سوال یا راهنمایی لازم داری؟ از صفحهٔ تماس با ما بپرس.
این ربات یک گفتگوی مرحلهای با مشتری انجام میدهد: اول نام، بعد محصول یا خدمت، و در آخر شماره تماس را میپرسد و سفارش را داخل فایل orders.csv ذخیره میکند تا بتوانید با اکسل بازش کنید.
این مراحل را بهترتیب انجام بده تا ربات روی سیستم خودت یا سرور بالا بیاید. داخل فایل ZIP یک راهنمای README هم هست.
این همان کدی است که داخل فایل ZIP هم هست. فقط یادت باشد مقدار TOKEN را با توکن رباتت عوض کنی.
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# ربات ثبت سفارش تلگرام
# طراحی و کدنویسی: سروش مقدمی — فیلتور (filtori.com)
# ------------------------------------------------------------
# این ربات یک گفتگوی مرحلهای با مشتری انجام میده و سفارش رو
# میگیره و داخل فایل orders.csv ذخیره میکنه:
# ۱) اسم مشتری
# ۲) محصول یا خدمتی که میخواد
# ۳) شمارهٔ تماس
# در پایان یک خلاصهٔ سفارش برای مشتری میفرسته.
#
# ⚠️ نکته: ربات تلگرام باید روی سروری اجرا بشه که به
# api.telegram.org دسترسی داره.
#
# آموزش کامل:
# https://filtori.com/telegram-bot-source/order-bot/
# نسخهٔ اختصاصی + اتصال به پنل و پرداخت؟ 09122874862
# تلگرام ما: https://t.me/filtori
# ------------------------------------------------------------
import csv
import time
from datetime import datetime
import requests
TOKEN = "توکن_ربات_خودت_را_اینجا_بگذار"
BASE = f"https://api.telegram.org/bot{TOKEN}"
# فایلی که سفارشها توش ذخیره میشن (کنار همین فایل ساخته میشه)
ORDERS_FILE = "orders.csv"
# ------------------------------------------------------------
# حافظهٔ موقت گفتگو:
# برای هر کاربر نگه میداریم که در کدوم مرحله از ثبت سفارشه.
# توجه: این حافظه در رم هست؛ اگر ربات ریاستارت بشه پاک میشه.
# برای پروژهٔ واقعی بهتره از دیتابیس استفاده بشه (تیم فیلتور کمکت میکنه).
# ------------------------------------------------------------
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):
"""منطق گفتگوی مرحلهای ثبت سفارش."""
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()
با چند تغییر کوچک، ربات را مخصوص کسبوکار خودت کن.
برای افزودن مرحلهٔ جدید (مثلاً آدرس)، در تابع handle یک elif step == "address" اضافه کن و ستونش را در save_order بنویس.
اگر میخواهی هر سفارش برای خودت هم ارسال شود، ایدهٔ ADMIN_CHAT_ID را از ربات تیکت بردار.
برای نمایش لیست محصولات با دکمهٔ شیشهای، ربات کاتالوگ محصولات را ببین.
اگر ربات اجرا نشد، اول پیام خطای ترمینال را با این جدول مقایسه کن. اگر خطایت اینجا نبود، از صفحهٔ تماس با ما بپرس.
| پیام خطا | علت | راهحل |
|---|---|---|
401 Unauthorized | توکن اشتباه است یا فاصلهٔ اضافه دارد. | توکن را دوباره از BotFather کپی کن و بین دو علامت نقلقول بگذار. |
409 Conflict | یک نسخهٔ دیگر از ربات در حال اجراست یا روی ربات وبهوک تنظیم شده. | نسخهٔ دیگر را خاموش کن. اگر قبلاً وبهوک گذاشتهای، آدرس api.telegram.org/bot<TOKEN>/deleteWebhook را یک بار باز کن. |
| Timeout یا ConnectionError | سرور به api.telegram.org دسترسی ندارد. | ربات را روی سروری اجرا کن که به تلگرام دسترسی دارد؛ روی بیشتر هاستهای داخل ایران این آدرس باز نیست. |
ModuleNotFoundError: requests | کتابخانهٔ requests نصب نشده. | دستور pip install -r requirements.txt یا pip install requests را اجرا کن. |
429 Too Many Requests | در زمان کوتاه پیام زیادی ارسال شده. | بین ارسالها مکث بگذار؛ تلگرام حدود ۳۰ پیام در ثانیه اجازه میدهد. |
| ربات در گروه جواب نمیدهد | Privacy Mode ربات روشن است. | در BotFather دستور /setprivacy را بزن و آن را Disable کن، یا ربات را ادمین گروه کن. |
با python bot.py ربات تا وقتی ترمینال باز است کار میکند. برای اجرای دائمی روی سرور لینوکس (Ubuntu/Debian)، فایلها را در پوشهٔ /opt/mybot بگذار و یک سرویس systemd بساز تا ربات بعد از خطا یا ریاستارت سرور خودش دوباره روشن شود.
[Unit]
Description=Filtori Telegram Bot
After=network-online.target
[Service]
WorkingDirectory=/opt/mybot
ExecStart=/usr/bin/python3 /opt/mybot/bot.py
Environment=PYTHONUNBUFFERED=1
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo nano /etc/systemd/system/mybot.service # متن بالا را اینجا بگذار
sudo systemctl daemon-reload
sudo systemctl enable --now mybot # روشنکردن + اجرای خودکار بعد از ریاستارت
journalctl -u mybot -f # دیدن لاگها
راهاندازی روی سرور برایت سخت است؟ نصب و راهاندازی را به ما بسپار.
درخواست راهاندازیاین سورس برای یادگیری و شروع کار عالی است. وقتی ربات قرار است هر روز با مشتری واقعی کار کند، معمولاً به دیتابیس، پنل مدیریت، امنیت بیشتر و پشتیبانی نیاز دارد. تیم فیلتور همین ربات ثبت سفارش تلگرام را اختصاصی و متناسب با فرآیند کسبوکارت میسازد.
| امکان | سورس رایگان | نسخهٔ اختصاصی |
|---|---|---|
| ذخیرهسازی | فایل CSV/TXT | دیتابیس |
| پنل مدیریت | — | ✓ |
| پرداخت آنلاین | — | ✓ |
| اتصال به سایت / CRM | — | ✓ |
| نصب و پشتیبانی | خودت | تیم فیلتور |
در فایلی به نام orders.csv کنار برنامه ذخیره میشوند که با اکسل هم باز میشود.
بله، گفتگوی نیمهتمام در حافظهٔ موقت است؛ برای نسخهٔ واقعی بهتر است از دیتابیس استفاده شود که فیلتور میتواند برایتان پیادهسازی کند.
بله، در نسخهٔ اختصاصی میتوان پرداخت آنلاین، پنل مدیریت و پیامک را اضافه کرد.
از صفحهٔ تماس با ما در filtori.com/contact پیام بدهید یا با شمارهٔ ۰۹۱۲۲۸۷۴۸۶۲ تماس بگیرید؛ اگر نسخهٔ اختصاصی همین ربات را برای کسبوکارتان بخواهید هم همین مسیر را استفاده کنید.
اگر در راهاندازی گیر کردی، یا میخواهی همین ربات برای کسبوکارت نصب و شخصیسازی شود، از صفحهٔ تماس با ما پیام بده.