Fast Rub
سریعترین، هوشمندترین و کاملترین فریمورک ربات روبیکا برای پایتون
💎 معرفی
Fast Rub یک فریمورک مدرن، سریع و سبک برای ساخت رباتهای
روبیکا است. با پشتیبانی کامل از sync/async،
HTTP/2، و معماری async-native.
HTTP/2 + Async-First
سریعترین فریمورک روبیکا با httpx & h2
WaitManager
مدیریت هوشمند Rate Limit — فقط بدهید، بقیه خودکار
DataForm
فرمهای هوشمند با اعتبارسنجی و callback شرطی
Conversation
مکالمات چندمرحلهای با State Machine داخلی
۲۰۰+ فیلتر
AND/OR/NOT + Inline Filters + Async Filters
Hot Reload
توسعه سریع بدون توقف ربات
Scheduler
زمانبندی کارها (interval + daily at)
Signals
سیستم Event-driven برای ارتباط ماژولها
Plugins
سیستم پلاگین با لود خودکار از پوشه
ORM داخلی
دیتابیس SQLite با API ساده و SQL پارامتری
Snapshots
Version Control برای تنظیمات ربات
Webhook Server
سرور داخلی (FastAPI / Flask)
AntiSpam
سیستم ضد اسپم پیشرفته + امنیت XSS
Dry Run
تست ربات بدون توکن و بدون اینترنت
Dashboard
پنل وب آماده آمار پیامها با خروجی JSON
پنل ادمین
پنل وب با احراز هویت، لاگ و تنظیمات زنده
یوزربات
پشتیبانی از یوزربات با فورک pyrubi
تایپهینت کامل
Autocomplete کامل در IDE بدون مخدوشکردن امضا
📦 نصب
pip install fastrub
میرورهای جایگزین
در صورت قطع شدن میرور اصلی PyPI:
pip install -i https://mirror-pypi.runflare.com/simple fastrub
pip install -i https://mirror.abrha.net/repository/pypi/simple fastrub
pip install -i https://package-mirror.liara.ir/repository/pypi/simple fastrub
🚀 شروع سریع
با @BotFather یک بات بسازید و توکن را کپی کنید.
import asyncio
from fast_rub import Client, filters
from fast_rub.types import Update
async def main():
bot = Client("my_bot")
@bot.on_message(filters.text("سلام"))
async def say_hello(msg: Update):
await msg.reply("**سلام** از طرف فست روب ⚡")
await bot.run()
asyncio.run(main())
import asyncio
from fast_rub import Client
from fast_rub.types import UpdateButton
async def main():
bot = Client("my_bot")
@bot.on_button()
async def button_click(msg: UpdateButton):
await msg.send_text(f"دکمهٔ {msg.new_message.aux_data.button_id} فشرده شد")
await bot.run()
asyncio.run(main())
🧠 WaitManager
مدیریت هوشمند ترافیک — قویترین سیستم مدیریت Rate Limit در بین تمام فریمورکهای روبیکا. کافی است به Client بدهید — بقیه خودکار انجام میشود.
from fast_rub import Client, WaitManager
bot = Client(
"my_bot",
wait_manager=WaitManager(
low_traffic=60,
medium_traffic=100,
low_wait=0.0,
medium_wait=1.0,
high_wait=3.0,
time_window=60.0,
auto_track=True, # همه چیز خودکار
)
)
@bot.on_message()
async def handler(msg: Message):
await msg.reply("سلام!") # WaitManager خودکار تأخیر را مدیریت میکند
await bot.run()
کانالهای قابل ردیابی
| کانال | کاربرد |
|---|---|
sending | ارسال پیام |
banning | اخراج (بن) |
forwarding | بازنشر (فوروارد) |
uploading | آپلود فایل |
editing | ویرایش پیام |
deleting | حذف پیام |
📋 DataForm
فرمهای هوشمند — فقط بگویید «چی میخواهید» — اعتبارسنجی، کیبورد، و حرکت بین فیلدها خودکار است.
DataForm یک سیستم فرمساز قدرتمند است که به شما امکان میدهد فرمهای چندمرحلهای را بهسادگی تعریف کنید. با استفاده از کلاسهای Text، Number و Choice میتوانید هر نوع ورودی را مدیریت کنید. این سیستم بهصورت خودکار کیبوردهای مناسب را ساخته، اعتبارسنجی را انجام میدهد و با استفاده از callback های شرطی (skip_if، cancel_if، back_if و ...) جریان فرم را کنترل میکند.
from fast_rub import Client, Conversation
from fast_rub.core.forms import Text, Number, DataForm
class UserInfo(DataForm):
name: Text = Text("👤 نام خود را وارد کنید", min_len=3, max_len=30)
age: Number = Number("🎂 چند سالته؟", min=18, max=60, keypad=True)
register = Conversation(name="register")
@register.entry_form(UserInfo, commands=["/register"])
async def done(msg, data):
await msg.reply(f"ثبت شد:\n👤 {data['name']}\n🎂 {data['age']}")
bot.add_conversation(register)
callbackهای شرطی (پیشرفته)
class AdvancedForm(DataForm):
name: Text = Text("نام؟", min_len=3, repeat_if=lambda v: "admin" in v.lower()) # دوباره بپرس
age: Number = Number("سن؟", min=18, max=60)
job: Text = Text("شغل؟", skip_if=lambda data: data.get("age", 0) < 18) # زیر ۱۸ سال نپرس
city: Text = Text("شهر؟", cancel_if=lambda v: v == "هیچی") # فرم را کنسل کن
🔧 فیلدهای DataForm
سه نوع فیلد اصلی: Text، Number و Choice. هر کدام پارامترهای متنوعی برای کنترل رفتار فرم دارند مثل transform_if، repeat_if، default_if، hide_if، back_if، cancel_if، skip_if، hide_input، default، timeout، retry، validator، transform، pre_func، dict_args_func، list_args_func، func، invalid_answer و ...
💬 Conversation
مکالمات چندمرحلهای — روش کلاسیک (Entry + State)
register = Conversation(name="register")
@register.entry(commands=["/register"])
async def ask_name(msg, data):
await msg.reply("اسمت چیه؟")
return "waiting_name"
@register.state("waiting_name")
async def get_name(msg, data):
data["name"] = msg.new_message.text
await msg.reply(f"سلام {msg.new_message.text}!")
return Conversation.END
bot.add_conversation(register)
🔍 فیلترها
بیش از ۲۰۰ فیلتر آماده برای محدود کردن هندلرها. ترکیب با &، | و ~.
from fast_rub import filters
# فیلتر ساده
@bot.on_message(filters.text("/start"))
# ترکیب (AND)
@bot.on_message(filters.text("/admin") & filters.is_user)
# ترکیب (OR)
@bot.on_message(filters.text("/help") | filters.text("راهنما"))
# NOT
@bot.on_message(~filters.is_group) # فقط PV
# Async — چک دیتابیس
@bot.on_message(filters.db_exists("users", lambda u: {"chat_id": u.chat_id}, db=my_db))
# Inline Filters (دکمههای شیشهای)
@bot.on_button(filters.button_id("home") & filters.sender_ids(["admin_id"]))
🛡️ محافظت از متن (Injection Protection)
با context میتونی متغیر توی متن بذاری. مارکدانِ خودت فعال میمونه، ولی هرچی از context میاد خنثی میشه. یعنی کاربر نمیتونه با فرستادن **bold** یا لینک، فرمت پیامت رو عوض کنه.
await msg.reply("سلام **{{ name }}**", context={"name": msg.new_message.text})
| کاربر میفرسته | خروجی |
|---|---|
ممد | سلام ممد (پررنگ، چون ** مال خودته) |
**ممد** | سلام **ممد** (پررنگ ** مال تو، ستارههای کاربر متن میان) |
<b>ممد</b> | سلام <b>ممد</b> |
**bold** یا [لینک](url) ظاهر پیامت رو خراب کنه.
⌨️ ساختن کیبورد
from fast_rub.button import KeyPad
keypad = KeyPad()
keypad.append(keypad.simple("btn_1", "دکمه یک"))
keypad.append(keypad.simple("btn_2", "دکمه دو"), keypad.simple("btn_3", "دکمه سه"))
# کیبورد معمولی
await msg.reply("انتخاب کنید:", keypad=keypad.build())
# کیبورد شیشهای
await msg.reply("انتخاب کنید:", inline_keypad=keypad.build())
🔄 Hot Reload
هر بار فایلی را ذخیره کنید، ربات خودکار ریاستارت میشود.
await bot.run(reload=True)
# یا از CLI:
# $ fastrub run --reload
⏰ Scheduler
from fast_rub import Scheduler
scheduler = Scheduler()
@scheduler.every(minutes=30)
async def cleanup():
print("🧹 پاکسازی خودکار")
@scheduler.every(at="08:00")
async def report():
print("📊 گزارش صبحگاهی")
📡 Signals
from fast_rub import SignalManager
signals = SignalManager()
@signals.on("user_registered")
async def welcome(user_id, chat_id):
print(f"👋 کاربر {user_id} ثبتنام کرد!")
await signals.emit("user_registered", user_id="123", chat_id="456")
🔌 Plugins
فایل plugins/admin.py:
async def setup(client):
@client.on_message(filters.commands(["admin"]))
async def panel(msg):
await msg.reply("🔧 پنل ادمین")
# لود خودکار
await bot.load_plugins("plugins")
🗄️ ORM داخلی
from fast_rub.db import DataBase
db = DataBase("my_bot.db")
await db.start({"users": {"chat_id": "TEXT", "name": "TEXT"}})
await db.write("users", {"chat_id": "123", "name": "علی"})
user = await db.find("users", "*", {"chat_id": "123"})
📊 داشبورد آمار HTML
پنل وب آماده با نمایش لحظهای آمار پیامها — تعداد پیامهای هر گروه/کانال/کاربر، رتبهبندی، جستجو و ریست. خروجی HTML زیبا + API JSON.
import asyncio
from fast_rub import Client
from fast_rub.types import Update
async def main():
bot = Client(
"my_bot",
enable_stats=True, # ✅ فعالسازی آمار
stats_db_path="messages_state-fastrub-my_bot.db", # اختیاری
)
@bot.on_message()
async def handler(msg: Update):
await msg.reply("دریافت شد ✅")
@bot.on_run()
async def on_run():
url = await bot.start_dashboard(
host="127.0.0.1",
port=8080,
backend="fastapi", # یا "flask"
)
bot.logger.info(f"داشبورد: {url}")
await bot.run()
asyncio.run(main())
سپس در مرورگر: http://127.0.0.1:8080/dashboard
ویژگیهای داشبورد
| ویژگی | توضیح |
|---|---|
| 📈 آمار لحظهای | کل پیامها، پیامهای امروز، چتهای فعال، زمان فعالیت |
| 🏆 رتبهبندی | مرتبسازی بر اساس تعداد کل / امروز / نام |
| 🔍 جستجو | جستجوی زنده در نام و آیدی چتها |
| 🗑️ ریست | پاکسازی کامل آمار |
| 🌐 خروجی JSON | /dashboard/api/stats و /dashboard/api/reset |
| 🎨 Dark/Light | طراحی مدرن و واکنشگرا (responsive) |
- پیشفرض روی
127.0.0.1گوش میده (فقط لوکال). - برای باز کردن روی شبکه،
host="0.0.0.0"بده و حتماً از Basic Auth یا ریورسپروکسی (Nginx + auth) استفاده کن. - پورتهای زیر ۱۰۲۴ نیاز به
sudoدارن.
🧪 شبیهسازی ربات (Dry Run)
ربات را بدون توکن واقعی و بدون اینترنت اجرا و تست کنید. یک MockNetwork جای شبکهٔ واقعی مینشیند؛ آپدیتها را شما شبیهسازی میکنید، همهچیز (فیلترها، کانورسیشن، middleware، آمار) از خط لولهٔ واقعی رد میشود و ارسالهای ربات ثبت میگردد — عالی برای تست و CI.
import asyncio
from fast_rub import Client, filters
from fast_rub.utils import FakeGenerator
async def main():
bot = Client("my_bot", dry_run=True) # ✅ بدون توکن و بدون اینترنت
@bot.on_message(filters.text("سلام"))
async def hello(msg):
await msg.reply("سلام! ⚡")
await bot.start()
fake_chat_id = FakeGenerator.chat_id("b")
# شبیهسازی پیام کاربر
await bot.mock.receive_text(chat_id=fake_chat_id, text="سلام")
# بررسی ارسالهای ربات
assert bot.mock.last_sent["data"]["text"] == "سلام! ⚡"
print(len(bot.mock.requests), "درخواست شبیهسازی شد")
await bot.close()
asyncio.run(main())
ابزارهای bot.mock
| ابزار | کاربرد |
|---|---|
receive_text(...) | شبیهسازی پیام متنی (اجرا فوری در خط لوله) |
receive_button(...) | شبیهسازی کلیک دکمهٔ شیشهای |
receive_edit(...) | شبیهسازی ویرایش پیام |
receive_deleted(...) | شبیهسازی حذف پیام |
receive_raw(update_dict) | تزریق آپدیت خام Bot API |
enqueue_text/... | افزودن به صف — با bot.run() و get_updates دریافت میشود |
bot.mock.sent | لیست پیامهای ارسالشدهٔ ربات |
bot.mock.requests | لیست همهٔ درخواستهای Bot API |
bot.mock.last_sent | آخرین ارسال |
bot.mock.responses | پاسخ دستی برای هر متود |
bot.mock.fail_methods | متودهایی که باید عمداً خطا بدهند |
bot.mock.chats / add_chat | چتهای شبیهسازیشده برای get_chat |
bot.mock.clear() | پاکسازی ثبتها بین تستها |
receive_* بهصورت همزمان (await) اجرا میشوند؛ پس بلافاصله بعد از فراخوانی میتوانید روی bot.mock.sent assert بگیرید.
🛡️ پنل ادمین
پنل وب مدیریت ربات با احراز هویت داخلی (بدون کتابخانهٔ جداگانه) — لاگ لحظهای، تغییر زندهٔ تنظیمات، آمار و ابزارهای مدیریتی. مثل داشبورد، با هر دو بکاند FastAPI/Flask.
import asyncio
from fast_rub import Client
async def main():
bot = Client("my_bot")
@bot.on_run()
async def on_run():
# اگر password ندهید، یک رمز قوی تصادفی ساخته و در کنسول چاپ میشود
url = await bot.start_admin(
host="127.0.0.1",
port=8081,
password="my_secret",
backend="fastapi", # یا "flask"
)
bot.logger.info(f"پنل ادمین: {url}")
await bot.run()
asyncio.run(main())
سپس در مرورگر: http://127.0.0.1:8081/admin
بخشهای پنل
| بخش | امکانات |
|---|---|
| 📊 نمای کلی | وضعیت ربات، uptime، هندلرها، مکالمات فعال، پلاگینها |
| 📜 لاگها | لاگ لحظهای با فیلتر سطح و اسکرول خودکار (۱۳۰۰ لاگ آخر در حافظه) |
| ⚙️ تنظیمات | تغییر زندهٔ parse mode، poll_interval، time_out، BotConfig، WaitManager و Cache |
| 📈 آمار | آمار پیامها با جستجو و مرتبسازی (نیازمند enable_stats=True) |
| 💻 سیستم | پایتون، uptime، threadها و تسکهای asyncio — رم/CPU با pip install psutil |
| 🧰 ابزارها | ارسال پیام، جستجوی اطلاعات چت، پاکسازی کش |
- مقایسهٔ رمز با
hmac.compare_digest(مقاوم به timing attack) - نشست با کوکی امضاشدهٔ HMAC-SHA256 (پیشفرض ۱۲ ساعت — با
session_hoursقابل تغییر) - قفل خودکار IP بعد از ۵ تلاش ناموفق (۶۰ ثانیه)
- توکن CSRF روی همهٔ درخواستهای POST
- توکن ربات هرگز در پنل نمایش داده نمیشود
- پیشفرض روی
127.0.0.1— برای باز کردن روی شبکه حتماً از HTTPS/ریورسپروکسی استفاده کنید
💻 CLI
fastrub new my_bot # پروژه جدید
fastrub run # اجرا
fastrub run --reload # اجرا با Hot Reload
fastrub version # نسخه
fastrub docs # مستندات
🧩 نصب اختیاری (Extras)
کتابخانه بهصورت پیشفرض سبک نصب میشه. برای قابلیتهای خاص، از extras زیر استفاده کن:
| Extra | نصب | کاربرد |
|---|---|---|
fastapi | pip install fastrub[fastapi] | داشبورد آمار و وب سرور با FastAPI (پیشنهادی) |
flask | pip install fastrub[flask] | داشبورد آمار و وب سرور با Flask |
hotreload | pip install fastrub[hotreload] | Hot Reload هنگام توسعه |
jalali | pip install fastrub[jalali] | تبدیل تاریخ شمسی Scheduler |
progress | pip install fastrub[progress] | نوار پیشرفت آپلود/دانلود (tqdm) |
pillow | pip install fastrub[pillow] | پردازش تصویر در یوزربات |
moviepy | pip install fastrub[moviepy] | پردازش ویدیو در یوزربات |
aiortc | pip install fastrub[aiortc] | تماس صوتی/تصویری در یوزربات |
userbot | pip install fastrub[userbot] | یوزربات (پایروبی + WebSocket + Crypto) |
userbot-full | pip install fastrub[userbot-full] | یوزربات با تمام قابلیتها |
full | pip install fastrub[full] | همه چیز یکجا نصب میشه |
pyrubi، pyrubi-rtc، rtc همه معادل aiortc هستن. برای دیدن لیست کامل: pip show fastrub یا فایل pyproject.toml.
📁 ساختار پروژه
fast_rub
├── button # KeyPad
│ ├── __init__.py
│ └── key_pad.py # KeyPad | InlineKeyPad
├── cli.py # CLI - fastrub cmd
├── core # core fastrub
│ ├── async_sync.py # Converter async to sync funcs
│ ├── background.py # BackGround tasks
│ ├── client.py # Client core fastrub
│ ├── config.py # Config client
│ ├── conversation.py # Conversation classic and DataForm
│ ├── forms # Forms for DataForm conversation
│ │ ├── config.py # Config the DataForm
│ │ ├── data_form.py # Config the DataForm
│ │ ├── fields.py # Fields - Number, Text, Choice
│ │ ├── __init__.py
│ │ └── manager.py # Manager DataForm in conversation.py
│ ├── helpers.py # Helpers for client
│ ├── hotreload.py # Hot reload client
│ ├── __init__.py
│ ├── middleware.py # Middleware client
│ ├── mock.py # Mock Network - Dry Run
│ ├── plugins.py # Plugins client
│ ├── scheduler.py # Scheduler for scheduling tasks
│ ├── signals.py # Signals (like Django Framework)
│ ├── stats.py # Stats Messages
│ ├── dashboard.py # Dashboard for stats Messages
│ └── webhook_server.py # Web Server client for webhook local
├── db # DataBases
│ ├── database.py # DataBase ORM fastrub
│ ├── __init__.py
│ ├── message_keeper.py # DB Message Keeper
│ └── session.py # DB Sessions fastrub({name}.faru)
├── __init__.py
├── network # Network fastrub
│ ├── __init__.py
│ └── network.py # Network fastrub - Httpx HTTP/2
├── pyrightconfig.json
├── pyrubi # UserBot - Pyrubi(Forked)
│ └── ...
├── type # Conect to types folder
│ └── __init__.py
├── types # Types fastrub
│ ├── errors.py # Exception fastrub
│ ├── exceptions.py # Alias errors.py
│ ├── forms.py # Alias fast_rub/core/forms
│ ├── get_type.py # Utils for Update Class
│ ├── __init__.py
│ ├── metadata.py # Utils for Update Class - MetaData Message
│ ├── models # Models client
│ ├── props.py
│ ├── prop_update.py
│ ├── update_button.py # Inline Message/Update Type fastrub
│ ├── update.py # Message/Update Type fastrub
│ └── webhook.py # WebHook config
└── utils # Utils fastrub
├── antispam.py # Anti Spam client
├── cache.py # Cache client
├── colors.py # Utils for color print client
├── encryption.py # Crypter token bot
├── filters.py # Filters for Messages
├── __init__.py
├── inline_filters.py # InlineFilters for Inline Messages
├── logger.py # Logger client
├── metadata.py # Creator text for format Markdown/HTML
├── snapshot.py # SnapShot JSON client
├── template.py # Anti-XSS in message text
├── text_parser.py # Text Parser MetaData
├── utils.py # More utils
├── version.py # Version fastrub
└── wait_manager.py # Manager Waiting for sending request
⚠️ نکته درباره pyrubi
pyrubi فورکی از AliGanji1/pyrubi است که برای قسمت یوزر بات استفاده شده و دارای لایسنس MIT میباشد.
⚡ کارایی
بنچمارک: ۱۰ پیام متوالی، در شرایط شبکه ضعیف.
| کتابخانه | میانگین | کندترین | سریعترین | انحراف |
|---|---|---|---|---|
| fast_rub | ~۰.۱۵s | ۰.۲۵s | ۰.۰۸s | ۰.۱۳s |
| کتابخانه A | ~۰.۵۱s | ۰.۵۹s | ۰.۴۲s | ۰.۱۷s |
| کتابخانه B | ~۰.۱۸s | ۰.۳۶s | ۰.۱۲s | ۰.۲۴s |
| کتابخانه C | ~۰.۷۰s | ۳.۰۷s | ۰.۲۳s | ۲.۸۴s |
چرا سریع؟
- httpx با مالتیپلکسینگ HTTP/2
- استخر اتصال پایدار
- async-native (بدون سربار sync/async wrapper)
🗺️ رودمپ (تکمیلنشده)
| قابلیت / باگ |
|---|
| پشتیبانی از logger در یوزربات (پایروبی) |
| config در یوزربات (پایروبی) |
| DataForm & Classic Conversation در یوزربات |
| پشتیبانی از middleware در یوزربات |
| دکوراتورهای before_send / after_send / before_run / after_run در یوزربات |
| add_handler در یوزربات |
| add_background_task در یوزربات |
| hotreload در یوزربات |
| antispam در یوزربات |
| فیلترهای بیشتر در یوزربات |
| ادغام client.py و methods.py یوزربات |
| Auto Failover گرفتن پیامها |
| Plunging Hub |
| پل با تلگرام - FastTel |
| افزودن دستورات CLI بیشتر |
📚 مستندات خام JSON (مناسب AI)
برای استفاده در ابزارهای هوش مصنوعی و IDEها:
| نام | لینک | مینیفای |
|---|---|---|
| متدها | methods.json | methods.min.json |
| مدلها | models.json | models.min.json |
| قابلیتها | features.json | features.min.json |
| یوزربات (پایروبی) | pyrubi.json | pyrubi.min.json |
| نکات قبل از شروع | prerequisites.json | prerequisites.min.json |
📄 لایسنس
این پروژه تحت لایسنس MIT منتشر شده است.