ربات ساده و کامل فروش نمایندگی/پنل با پرداخت کارتبهکارت، تأیید دستی ادمین و تحویل خودکار به مشتری.
- نمایش پلنها و انتخاب توسط کاربر
- نمایش شماره کارت و دریافت رسید (عکس/فایل)
- ارسال سفارش جدید به ادمین همراه با دکمههای ✅ تأیید / ❌ رد
- بعد از تأیید، ادمین اطلاعات پنل رو میفرسته و ربات خودکار به مشتری تحویل میده
- بخش «سفارشهای من» برای کاربر (وضعیت + اطلاعات پنلهای تحویلشده)
- ذخیرهسازی با SQLite (بدون نیاز به دیتابیس جدا)
pip install -r requirements.txt
cp .env.example .env # و مقادیر رو پر کنید
python bot.py- یک بات جدید در تلگرام از @BotFather بسازید و توکن رو کپی کنید.
- آیدی عددی خودتون رو از @userinfobot بگیرید (این آیدی ادمین شماست).
- این پوشه رو در یک ریپازیتوری گیتهاب آپلود کنید (یا مستقیم zip رو در Railway آپلود کنید).
- در railway.app:
- New Project → Deploy from GitHub repo رو بزنید و ریپازیتوری رو انتخاب کنید.
- Railway بهطور خودکار
Dockerfileرو تشخیص میده و بیلد میکنه.
- در تب Variables پروژه، این متغیرها رو اضافه کنید:
Key Value BOT_TOKENتوکن گرفتهشده از BotFather ADMIN_IDSآیدی عددی ادمین(ها) - با کاما جدا کنید CARD_NUMBERشماره کارت برای پرداخت CARD_HOLDERنام صاحب کارت DB_PATH/data/bot.db(توضیح در مرحله بعد)BRAND_NAMEنام برند (مثلاً X4G) SUPPORT_USERNAMEآیدی تلگرام پشتیبانی بدون @ (مثلاً SuppX4G) REFERRAL_REQUIRED_COUNTتعداد دعوت موفق لازم برای هدیه (پیشفرض 3) REFERRAL_REWARD_VOLUMEحجم پنل هدیه به گیگ (پیشفرض 50) - مهم — ماندگاری دیتابیس: روی Railway فایلسیستم بین دیپلویها ریست میشه. برای اینکه سفارشها پاک نشن:
- در تب Volumes یک Volume جدید بسازید و آن رو در مسیر
/dataمانت (mount) کنید. - مطمئن شوید متغیر
DB_PATH=/data/bot.dbتنظیم شده باشه.
- در تب Volumes یک Volume جدید بسازید و آن رو در مسیر
- بعد از دیپلوی، لاگها رو چک کنید؛ اگر پیام خطا نبود، ربات آمادهست. به تلگرام برید و
/startبزنید.
منو بهصورت دوستونه چیده شده تا همه گزینهها همون اول دیده بشن:
- 🛍 خرید سرویس | 🖥 سرویسهای من
- 💰 کیف پول | 💬 پشتیبانی
- 🤝 دعوت دوستان | 📜 قوانین
- 🛠 مدیریت ربات (فقط برای ادمینها نمایش داده میشه)
🛍 خرید سرویس → انتخاب سرویس (گیمینگ / مولتی لوکیشن) → انتخاب تعرفه → نمایش خلاصه سفارش + شماره کارت با دکمههای «📤 ارسال رسید»، «💰 پرداخت با کیف پول» (در صورت کافی بودن موجودی) و «🔙 بازگشت».
همهجا دکمه «🔙 بازگشت» برای برگشت به مرحله قبل وجود داره.
با زدن «🖥 سرویسهای من» لیست سفارشها بهصورت دکمه (با آیکون وضعیت) نشون داده میشه. با کلیک روی هر سفارش، جزئیات کامل (پلن، قیمت، وضعیت و در صورت تحویل، اطلاعات/کانفیگ سرویس) نمایش داده میشه.
کاربر از بخش «💰 کیف پول» میتونه:
- موجودی فعلی خودش رو ببینه.
- با زدن «➕ شارژ کیف پول»، مبلغ دلخواه رو وارد کنه، رسید واریز رو ارسال کنه و بعد از تأیید ادمین، همون مبلغ به کیف پولش اضافه بشه.
- در خرید سرویس، اگه موجودی کیف پولش کافی باشه، بهجای ارسال رسید میتونه با دکمه «💰 پرداخت با کیف پول» مستقیم و آنی پرداخت کنه (بدون نیاز به تأیید رسید). اگه بعداً ادمین اون سفارش رو رد کنه، مبلغ بهصورت خودکار به کیف پول کاربر برمیگرده.
بخش «📜 قوانین» یک متن پیشفرض (قابل تغییر) درباره نحوه تحویل، بازگشت وجه، محدودیتهای استفاده و... نمایش میده. ادمین میتونه از داخل «🛠 مدیریت ربات → 📜 ویرایش قوانین» این متن رو کاملاً دلخواه عوض کنه.
دکمه «🛠 مدیریت ربات» فقط برای آیدیهای داخل ADMIN_IDS توی منوی اصلی نمایش داده میشه (با دستور /admin هم قابل دسترسیه). از این بخش میشه:
- تعرفههای گیمینگ و مولتی لوکیشن: تغییر قیمت هر تعرفه، فعال/غیرفعال کردن، افزودن تعرفه جدید (حجم/عنوان + قیمت دلخواه).
- ✉️ پیام خوشآمدگویی: متن پیام
/startرو کاملاً دلخواه تغییر بدید (تگهای ساده HTML مثل<b>پشتیبانی میشه). - 📜 ویرایش قوانین: متن بخش «قوانین» رو تغییر بدید.
- 🤝 تنظیمات رفرال: درصد پورسانتی نقدی که به کیف پول دعوتکننده بهازای هر خرید موفق زیرمجموعهاش تعلق میگیره رو تغییر بدید.
- 🎟 کدهای تخفیف: ساخت/فعالسازی/غیرفعالسازی/حذف کد تخفیف با درصد و ظرفیت دلخواه.
- 💳 تخفیف شارژ کیف پول: آستانه مبلغ و درصد هدیه پلکانی شارژ کیف پول رو تنظیم کنید.
همه این تنظیمات داخل دیتابیس ذخیره میشن، پس با هر بار ریاستارت شدن ربات از بین نمیرن (به شرطی که از Volume برای دیتابیس استفاده کرده باشید، طبق مرحله ۶ بالا).
وقتی کاربر درخواست شارژ کیف پول میده و رسید میفرسته، برای همه ادمینها پیامی با دکمههای «✅ تأیید و شارژ» / «❌ رد» ارسال میشه؛ این کاملاً مستقل از تأیید سفارشهای سرویسه (سفارشها همچنان از همون دکمههای «✅ تأیید» / «❌ رد» قبلی مدیریت میشن).
هر کاربر یک لینک اختصاصی میگیره (t.me/<bot>?start=ref_<user_id>). بهازای هر خرید موفقی که یکی از دعوتشدههاش انجام بده و ادمین تحویلش بده، یه درصد مشخص (پیشفرض ۱۰٪) از مبلغ همون خرید بلافاصله و نقداً به کیف پول دعوتکننده اضافه میشه - این کار محدودیت تعداد دفعات نداره و برای همیشه ادامه داره. درصد پورسانتی از «🛠 مدیریت ربات → 🤝 تنظیمات رفرال» قابل تغییره.
ادمین از «🛠 مدیریت ربات → 🎟 کدهای تخفیف» میتونه کد تخفیف بسازه (مثلاً SUMMER20 با ۲۰٪ تخفیف و ظرفیت استفاده دلخواه یا نامحدود). کاربر توی صفحه خلاصه سفارش، با دکمه «🎟 اعمال کد تخفیف» میتونه کدش رو وارد کنه تا قیمت نهایی بهصورت خودکار محاسبه بشه؛ امکان تغییر یا حذف کد هم هست.
از «🛠 مدیریت ربات → 💳 تخفیف شارژ کیف پول» میشه یه آستانه مبلغ (پیشفرض ۵۰۰٬۰۰۰ تومان) و درصد هدیه (پیشفرض ۵٪) تعیین کرد. وقتی کاربری شارژی برابر یا بیشتر از اون آستانه بزنه و ادمین تأییدش کنه، علاوه بر مبلغ اصلی، همون درصد هم بهعنوان هدیه به کیف پولش اضافه میشه.
یک میانافزار ساده روی کل ربات فعاله که جلوی کلیک/پیام پشتسرهمِ خیلی سریع از یک کاربر رو میگیره (پیامها حداقل هر ۰.۷ ثانیه، دکمهها حداقل هر ۰.۴ ثانیه)؛ این از اسپم دکمهها یا ثبت سفارش پشتسرهم جلوگیری میکنه.
آیدی پشتیبانی (SUPPORT_USERNAME) فقط داخل لینک دکمه قرار میگیره، نه در متن پیام - یعنی کاربر عادی آیدی رو در متن نمیبینه و فقط با زدن دکمه پیوی پشتیبانی باز میشه. توجه داشته باشید تلگرام بهطور کامل امکان مخفیکردن آدرس لینک از کاربر فنی/کنجکاو رو نمیده (مثلاً با نگهداشتن روی دکمه در بعضی کلاینتها لینک نمایش داده میشه)، اما در حالت عادی استفاده، آیدی در متن پیام دیده نمیشه.
تلگرام (از طریق Bot API) اجازه تنظیم رنگ سفارشی برای دکمههای Reply Keyboard یا Inline رو نمیده - رنگ دکمهها بر اساس تم (Theme) کلاینت تلگرام کاربر تعیین میشه، نه توسط ربات. برای تمایز بصری از ایموجی و چیدمان دکمهها استفاده شده.
همه داخل فایل config.py هستند:
COUNTRIES: لیست کشورها (کد + نام نمایشی)VOLUMES: لیست حجمها بر حسب گیگابایتBASE_PRICEوPRICE_STEP: قیمت ۵۰ گیگ اول و مقدار افزایش قیمت به ازای هر پله بعدی (الان: شروع از ۱۰۰ تومان با پلههای ۲۰۰۰ تومانی)BRAND_NAME: نام برند که در پیام خوشآمدگویی نمایش داده میشهSUPPORT_USERNAME: آیدی تلگرام پشتیبانی (بدون @)
- توکن ربات و آیدی ادمینها رو هیچوقت داخل کد قرار ندید؛ همیشه از Environment Variables استفاده کنید (همونطور که در بالا انجام شده).
- فایل
.envرو در گیتهاب آپلود نکنید (در.gitignoreقرار داده شده). - این ربات پرداخت رو بهصورت دستی (تأیید توسط ادمین) مدیریت میکنه، یعنی درگاه پرداخت آنلاین نداره. اگر بعداً خواستید درگاه آنلاین (زرینپال و ...) اضافه کنید، بگید تا اون بخش رو هم اضافه کنم.
├── bot.py # فایل اصلی و تمام هندلرها
├── config.py # تنظیمات و لیست پلنها
├── database.py # لایه دیتابیس SQLite
├── requirements.txt
├── Dockerfile
├── railway.json
├── .env.example
└── .gitignore