BLOG · برنامه‌نویسی

ساخت ربات بله با پایتون از صفر تا دیپلوی

2026/09/20

ساخت ربات بله با پایتون یکی از سریع‌ترین راه‌ها برای اتوماسیون ارتباط با مشتری، پردازش سفارش و ارائه خدمات در بستری است که میلیون‌ها کاربر ایرانی روزانه از آن استفاده می‌کنند. برخلاف تصور رایج، پیاده‌سازی یک ربات بله با پایتون از نظر معماری تفاوت چندانی با ربات‌های تلگرام ندارد، چون بله نیز از پروتکل مشابه Bot API پیروی می‌کند؛ اما جزئیات دریافت توکن، محدودیت‌های نرخ درخواست و روش دیپلوی روی سرور، تفاوت‌های مهمی دارند که در ادامه به‌طور کامل بررسی می‌شوند.

این راهنما برای تیم‌های فنی و صاحبان کسب‌وکارهایی نوشته شده که قصد دارند یک ربات واقعی، پایدار و قابل نگهداری بسازند؛ نه یک اسکریپت آزمایشی که فقط روی لپ‌تاپ توسعه‌دهنده کار می‌کند. به همین دلیل، علاوه بر منطق برنامه‌نویسی، به موضوعاتی مثل ذخیره‌سازی داده در دیتابیس، اجرای مستمر روی VPS و امنیت توکن نیز پرداخته می‌شود؛ موضوعاتی که معمولاً در آموزش‌های سطحی نادیده گرفته می‌شوند.

اگر مسیر پیاده‌سازی برایتان زمان‌بر است یا نیاز به یک راه‌حل تولیدی (Production-Ready) دارید، تیم توسعه ساخت ربات بله می‌تواند این فرآیند را از صفر تا استقرار نهایی برایتان انجام دهد.

کتابخانه‌های پایتون برای توسعه ربات بله

پلتفرم بله یک API مبتنی بر HTTP و JSON در اختیار توسعه‌دهندگان قرار می‌دهد که ساختار آن بسیار شبیه به Bot API تلگرام است. به همین دلیل، بسیاری از کتابخانه‌های محبوب پایتون برای تلگرام، با کمی تنظیم آداپتور (تغییر آدرس پایه یا base URL) روی بله هم قابل استفاده هستند. رایج‌ترین رویکردها به این شرح‌اند:

  • استفاده از کتابخانه‌های سبک HTTP مانند requests یا httpx برای فراخوانی مستقیم متدهای API بله؛ مناسب پروژه‌های کوچک یا زمانی که می‌خواهید کنترل کامل روی رفتار درخواست‌ها داشته باشید.
  • استفاده از کتابخانه‌های framework-محور مبتنی بر ساختار تلگرام (مانند python-telegram-bot یا aiogram) که با override کردن آدرس API قابل اتصال به بله هستند و مزیت آن‌ها مدیریت آماده هندلرها، وضعیت مکالمه و صف پیام‌ها است.
  • کتابخانه‌های اختصاصی و کامیونیتی‌محور فارسی که به‌طور خاص برای بله نوشته شده‌اند و برخی تفاوت‌های جزئی API بله را از قبل پوشش داده‌اند.

انتخاب بین این گزینه‌ها به مقیاس پروژه بستگی دارد. برای ربات‌هایی که قرار است چند دستور ساده پاسخ دهند، یک کلاینت HTTP سبک کافی است؛ اما اگر ربات شما قرار است چندین مرحله گفتگو، حالت‌های مختلف کاربر و صف پیام‌های همزمان را مدیریت کند، استفاده از یک framework غیرهمزمان (async) مبتنی بر asyncio توصیه می‌شود، چون مقیاس‌پذیری و مدیریت خطا را ساده‌تر می‌کند.

معماری پیشنهادی پروژه

در ساخت ربات بله با پایتون، جدا کردن لایه‌ها از ابتدا اهمیت زیادی دارد: لایه دریافت پیام (webhook یا polling)، لایه منطق کسب‌وکار (پردازش دستورات و تصمیم‌گیری)، و لایه داده (ارتباط با دیتابیس). این جداسازی باعث می‌شود بعداً بتوانید بدون تغییر در منطق اصلی، روش دریافت پیام یا نوع دیتابیس را عوض کنید.

دریافت توکن ربات از پلتفرم بله

پیش از هر خط کد، باید یک ربات در پلتفرم بله (bale.ai) ثبت کنید. این کار معمولاً از طریق گفتگو با یک ربات مدیریتی رسمی درون خود بله انجام می‌شود؛ مشابه فرآیندی که در تلگرام با BotFather وجود دارد. مراحل کلی به این ترتیب است:

  • ورود به اپلیکیشن بله با حساب کاربری معتبر و مراجعه به ربات مدیریت ربات‌ها.
  • ثبت نام و شناسه (username) یکتا برای ربات جدید، با رعایت قوانین نام‌گذاری پلتفرم.
  • دریافت توکن دسترسی (Access Token) که به‌صورت یک رشته منحصربه‌فرد در اختیار شما قرار می‌گیرد.
  • در صورت نیاز، تنظیم توضیحات، تصویر پروفایل و دستورات پیش‌فرض ربات از همان محیط مدیریتی.

این توکن، کلید کامل دسترسی به ربات شماست؛ هر کسی که آن را در اختیار داشته باشد می‌تواند به‌جای شما پیام ارسال کند، اطلاعات کاربران را بخواند و حتی وبهوک ربات را تغییر دهد. به همین دلیل، در بخش نکات امنیتی این مقاله، به‌طور مجزا به نحوه محافظت از آن می‌پردازیم.

نکته کلیدیتوکن ربات را هرگز مستقیماً در کد قرار ندهید و آن را وارد ریپازیتوری گیت نکنید. همیشه آن را از طریق متغیرهای محیطی (Environment Variables) یا یک سرویس مدیریت راز (Secret Manager) به برنامه تزریق کنید تا در صورت انتشار عمومی کد، توکن فاش نشود.
balebotpythonsteps

Webhook در برابر Polling؛ کدام روش را انتخاب کنیم؟

دو مدل اصلی برای دریافت پیام‌های ورودی از پلتفرم بله وجود دارد. در مدل polling، برنامه شما به‌صورت مداوم و در بازه‌های زمانی کوتاه، یک درخواست به سرور بله می‌فرستد و می‌پرسد «پیام جدیدی وجود دارد؟». در مدل webhook، برعکس این اتفاق می‌افتد: شما یک آدرس HTTPS عمومی به بله معرفی می‌کنید و هر بار که پیامی برای ربات ارسال شود، سرور بله خودش یک درخواست به آن آدرس می‌فرستد.

Polling؛ ساده برای شروع، محدود برای تولید

مزیت polling این است که هیچ نیازی به دامنه، گواهی SSL یا سرور عمومی ندارد؛ می‌توانید حتی روی کامپیوتر شخصی خود ربات را تست کنید. اما در محیط تولید، polling چند مشکل ایجاد می‌کند: مصرف مداوم منابع سرور برای درخواست‌های تکراری، تأخیر در دریافت پیام‌ها به‌اندازه فاصله بین هر بار polling، و دشواری در مقیاس‌پذیری وقتی چند نمونه (instance) از برنامه به‌صورت هم‌زمان اجرا می‌شوند.

Webhook؛ انتخاب استاندارد برای پروژه‌های واقعی

در webhook، پیام‌ها بلادرنگ به سرور شما می‌رسند و منابع فقط زمانی مصرف می‌شوند که واقعاً پیامی وجود داشته باشد. برای راه‌اندازی webhook باید یک endpoint در برنامه پایتون خود (معمولاً با فریم‌ورک‌هایی مثل FastAPI یا Flask) تعریف کنید، آن را پشت یک دامنه دارای گواهی SSL معتبر قرار دهید و آدرس آن را از طریق متد مربوطه در API بله به ربات معرفی کنید. از آن پس، هر پیام کاربر به‌صورت یک درخواست POST به همان آدرس ارسال می‌شود و برنامه شما آن را پردازش می‌کند.

برای اکثر ربات‌های تولیدی، به‌ویژه آن‌هایی که قرار است سفارش، پرداخت یا مکالمه پشتیبانی را مدیریت کنند، webhook گزینه درست‌تری است. اگر پروژه شما هنوز در مرحله اثبات ایده (MVP) قرار دارد و می‌خواهید سریع تست کنید، شروع با polling و مهاجرت بعدی به webhook منطقی است.

ساخت هندلرهای دستورات و پیام‌های متنی

هسته اصلی هر ربات، لایه‌ی هندلرها (Handlers) است؛ یعنی بخشی از کد که تصمیم می‌گیرد در برابر هر پیام ورودی چه واکنشی نشان دهد. در طراحی این لایه، بهتر است پیام‌های ورودی را به سه دسته اصلی تقسیم کنید:

  • دستورات (Commands): پیام‌هایی که با یک الگوی مشخص شروع می‌شوند، مثل دستور شروع مکالمه، دستور نمایش راهنما یا دستور مشاهده وضعیت سفارش. برای هر دستور، یک تابع مجزا تعریف می‌شود تا منطق برنامه خوانا و قابل تست بماند.
  • پیام‌های متنی آزاد: زمانی که کاربر بدون استفاده از دستور خاصی چیزی تایپ می‌کند. در این حالت معمولاً باید وضعیت فعلی مکالمه کاربر (State) را بررسی کنید تا بدانید آیا کاربر در میانه یک فرآیند چندمرحله‌ای (مثل ثبت سفارش) است یا نه.
  • دکمه‌ها و کیبوردهای درون‌خطی: پاسخ به کلیک روی دکمه‌های شیشه‌ای (Inline Keyboard) که برای منوها و تأییدها بسیار کاربردی‌تر از تایپ متن آزاد هستند.

مدیریت وضعیت مکالمه (Conversation State)

بسیاری از ربات‌های واقعی نیاز دارند چند مرحله متوالی از کاربر اطلاعات بگیرند؛ مثلاً ابتدا نام محصول، سپس آدرس، و در پایان روش پرداخت را بپرسند. برای این کار باید یک مکانیزم نگهداری وضعیت هر کاربر طراحی کنید که مرحله فعلی گفتگو و داده‌های جمع‌آوری‌شده تا آن لحظه را ذخیره کند. این وضعیت می‌تواند در حافظه موقت (برای پروژه‌های ساده و تک‌نمونه‌ای) یا در دیتابیس (برای پروژه‌های مقیاس‌پذیر و چند-نمونه‌ای) نگهداری شود.

نکته مهم در طراحی هندلرها، مدیریت خطا و ورودی نامعتبر است. کاربر ممکن است متنی وارد کند که فرمت مورد انتظار را ندارد (مثلاً حروف به‌جای عدد). هندلرهای شما باید در چنین شرایطی پیام خطای واضح و راهنمایی برای اصلاح ورودی نمایش دهند، نه اینکه ربات بدون پاسخ بماند یا با خطای فنی متوقف شود.

اتصال ربات به دیتابیس برای ذخیره کاربران و سفارش‌ها

هر ربات جدی که قصد دارد کاربران، سفارش‌ها یا تاریخچه مکالمات را دنبال کند، به یک دیتابیس نیاز دارد. برای اکثر پروژه‌ها، یک دیتابیس رابطه‌ای مانند PostgreSQL یا MySQL انتخاب مناسبی است، چون رابطه بین کاربران، سفارش‌ها و تراکنش‌ها را به‌خوبی مدل می‌کند؛ برای پروژه‌های ساده‌تر یا نمونه‌های اولیه، SQLite هم گزینه قابل‌قبولی است.

  • جدول کاربران: معمولاً شامل شناسه کاربر در بله، نام نمایشی، تاریخ اولین تعامل و وضعیت مسدودسازی یا فعال بودن.
  • جدول سفارش‌ها یا تراکنش‌ها: شامل شناسه کاربر مرتبط، جزئیات سفارش، وضعیت (در انتظار، پرداخت‌شده، لغو‌شده) و زمان ثبت.
  • جدول یا فیلد وضعیت مکالمه: برای نگهداری مرحله فعلی گفتگوی چندمرحله‌ای هر کاربر، در صورتی که این وضعیت را در دیتابیس نگه دارید نه در حافظه.

برای ارتباط پایتون با دیتابیس، استفاده از یک ORM مانند SQLAlchemy توصیه می‌شود، چون مدیریت اتصال، تراکنش‌ها و مهاجرت‌های ساختار جدول (با ابزارهایی مانند Alembic) را ساده‌تر می‌کند و کد را از دستورات SQL خام مستقل نگه می‌دارد. اگر ربات شما به‌صورت async نوشته شده، استفاده از درایورهای async دیتابیس نیز اهمیت دارد تا لایه دیتابیس، حلقه رویداد (Event Loop) برنامه را مسدود نکند.

دیپلوی ربات روی سرور

پس از تکمیل توسعه، مرحله حیاتی بعدی استقرار (Deploy) ربات روی یک سرور است که به‌صورت ۲۴ ساعته و بدون وقفه در دسترس باشد؛ چیزی که در کامپیوتر شخصی قابل تضمین نیست. برای این کار معمولاً یک VPS (سرور مجازی خصوصی) با سیستم‌عامل لینوکس کافی است.

اجرای مستمر با systemd

روش استاندارد و پیشنهادی برای اجرای مستمر ربات، تعریف یک سرویس systemd است. با این روش، برنامه شما به‌عنوان یک سرویس سیستمی شناخته می‌شود که به‌صورت خودکار پس از هر ری‌استارت سرور اجرا می‌شود، در صورت کرش کردن به‌طور خودکار دوباره راه‌اندازی می‌شود، و لاگ‌های آن از طریق ابزارهای مدیریت لاگ سیستم قابل بررسی است. این ویژگی‌ها برای یک ربات تولیدی که باید همیشه پاسخگو باشد، ضروری‌اند.

استفاده از screen یا tmux برای تست سریع

ابزارهایی مانند screen یا tmux امکان اجرای برنامه در یک نشست ترمینال مجازی را می‌دهند که حتی بعد از قطع اتصال SSH نیز به کار خود ادامه می‌دهد. این روش برای تست سریع روی سرور یا محیط‌های موقتی مناسب است، اما جایگزین مناسبی برای systemd در محیط تولید نیست، چون مدیریت خطا، ری‌استارت خودکار و یکپارچگی با سیستم لاگ را در اختیار شما قرار نمی‌دهد.

کانتینر و مدیریت پیکربندی

در پروژه‌های بزرگ‌تر، بسته‌بندی ربات در یک کانتینر Docker مزایای زیادی دارد: یکسان‌سازی محیط اجرا بین توسعه و تولید، سهولت به‌روزرسانی با یک دستور ساده، و امکان اجرای هم‌زمان چند سرویس (ربات، دیتابیس، سرویس صف پیام) با ابزارهایی مانند Docker Compose. در این حالت نیز متغیرهای محیطی همچنان بهترین روش تزریق توکن و رشته اتصال دیتابیس هستند.

نکات امنیتی در ساخت ربات بله با پایتون

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

  • محافظت از توکن: توکن را همیشه در متغیر محیطی نگه دارید، دسترسی به فایل پیکربندی سرور را محدود کنید و در صورت هرگونه شک به افشای توکن، بلافاصله آن را از طریق پنل مدیریتی بله بازنشانی (Regenerate) کنید.
  • اعتبارسنجی منبع درخواست webhook: بررسی کنید که درخواست‌های رسیده به endpoint شما واقعاً از سرورهای بله می‌آیند و نه از منبع مخرب که آدرس webhook شما را حدس زده است.
  • محدودسازی نرخ درخواست (Rate Limiting): برای جلوگیری از سوءاستفاده یک کاربر یا اسکریپت مخرب که با حجم بالا پیام ارسال می‌کند، باید محدودیت تعداد درخواست در بازه زمانی برای هر کاربر یا هر IP اعمال شود. این کار هم از منابع سرور محافظت می‌کند و هم مانع رسیدن به محدودیت‌های نرخ ارسال پیام خود پلتفرم بله می‌شود.
  • اعتبارسنجی و پاک‌سازی ورودی کاربر: پیش از ذخیره هر داده‌ای که از کاربر دریافت می‌شود در دیتابیس، آن را اعتبارسنجی کنید تا از تزریق داده نامعتبر یا حملات مرتبط با ورودی جلوگیری شود.
  • مدیریت جداگانه محیط توسعه و تولید: از دو ربات و دو توکن مجزا برای محیط تست و محیط واقعی استفاده کنید تا آزمایش‌های شما با داده‌های واقعی کاربران تداخل نکند.
نکته کلیدیپیاده‌سازی محدودسازی نرخ درخواست باید هم در سطح برنامه (شمارش پیام‌های هر کاربر در بازه زمانی) و هم در سطح زیرساخت (مانند تنظیمات فایروال یا reverse proxy) انجام شود تا در برابر حملات حجمی، تنها یک لایه دفاعی نداشته باشید.

جمع‌بندی

ساخت ربات بله با پایتون از نظر مفهومی ساده به نظر می‌رسد، اما تفاوت میان یک ربات آزمایشی و یک ربات تولیدی پایدار، در جزئیاتی نهفته است که در این راهنما بررسی شد: انتخاب درست بین webhook و polling، طراحی هندلرهایی که وضعیت مکالمه را به‌درستی مدیریت می‌کنند، اتصال به دیتابیس با معماری تمیز، دیپلوی مطمئن روی VPS با systemd، و رعایت اصول امنیتی از محافظت توکن تا محدودسازی نرخ درخواست.

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

LET'S TALK

سوالی درباره پروژه‌تان دارید؟

در یک جلسه مشاوره رایگان صحبت می‌کنیم.