Fast Rub

سریع‌ترین، هوشمندترین و کامل‌ترین فریم‌ورک ربات روبیکا برای پایتون

💎 معرفی

Fast Rub یک فریم‌ورک مدرن، سریع و سبک برای ساخت ربات‌های روبیکا است. با پشتیبانی کامل از sync/async، HTTP/2، و معماری async-native.

🪶 تست شده روی ۲۵۶ مگابایت رم DDR1 با Alpine Linux — عملکرد فوق‌العاده حتی روی سخت‌افزار ضعیف.
⚡

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 بدون مخدوش‌کردن امضا

📦 نصب

bash
pip install fastrub

میرورهای جایگزین

در صورت قطع شدن میرور اصلی PyPI:

bash · runflare
pip install -i https://mirror-pypi.runflare.com/simple fastrub
bash · abrha
pip install -i https://mirror.abrha.net/repository/pypi/simple fastrub
bash · liara
pip install -i https://package-mirror.liara.ir/repository/pypi/simple fastrub

🚀 شروع سریع

با @BotFather یک بات بسازید و توکن را کپی کنید.

python
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())
python
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 بدهید — بقیه خودکار انجام می‌شود.

python
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 و ...) جریان فرم را کنترل می‌کند.

python
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های شرطی (پیشرفته)

python
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)

python
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)

🔍 فیلترها

بیش از ۲۰۰ فیلتر آماده برای محدود کردن هندلرها. ترکیب با &، | و ~.

python
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** یا لینک، فرمت پیامت رو عوض کنه.

python
await msg.reply("سلام **{{ name }}**", context={"name": msg.new_message.text})
کاربر می‌فرستهخروجی
ممدسلام ممد (پررنگ، چون ** مال خودته)
**ممد**سلام **ممد** (پررنگ ** مال تو، ستاره‌های کاربر متن میان)
<b>ممد</b>سلام <b>ممد</b>
💡 بدون این قابلیت، کاربر می‌تونه با **bold** یا [لینک](url) ظاهر پیامت رو خراب کنه.

⌨️ ساختن کیبورد

python
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

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

python
await bot.run(reload=True)

# یا از CLI:
# $ fastrub run --reload

⏰ Scheduler

python
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

python
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:

python
async def setup(client):
    @client.on_message(filters.commands(["admin"]))
    async def panel(msg):
        await msg.reply("🔧 پنل ادمین")

# لود خودکار
await bot.load_plugins("plugins")

🗄️ ORM داخلی

python
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.

python
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.

python
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.

python
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

bash
fastrub new my_bot      # پروژه جدید
fastrub run             # اجرا
fastrub run --reload    # اجرا با Hot Reload
fastrub version         # نسخه
fastrub docs            # مستندات

🧩 نصب اختیاری (Extras)

کتابخانه به‌صورت پیش‌فرض سبک نصب می‌شه. برای قابلیت‌های خاص، از extras زیر استفاده کن:

Extraنصبکاربرد
fastapipip install fastrub[fastapi]داشبورد آمار و وب سرور با FastAPI (پیشنهادی)
flaskpip install fastrub[flask]داشبورد آمار و وب سرور با Flask
hotreloadpip install fastrub[hotreload]Hot Reload هنگام توسعه
jalalipip install fastrub[jalali]تبدیل تاریخ شمسی Scheduler
progresspip install fastrub[progress]نوار پیشرفت آپلود/دانلود (tqdm)
pillowpip install fastrub[pillow]پردازش تصویر در یوزربات
moviepypip install fastrub[moviepy]پردازش ویدیو در یوزربات
aiortcpip install fastrub[aiortc]تماس صوتی/تصویری در یوزربات
userbotpip install fastrub[userbot]یوزربات (پایروبی + WebSocket + Crypto)
userbot-fullpip install fastrub[userbot-full]یوزربات با تمام قابلیت‌ها
fullpip install fastrub[full]همه چیز یک‌جا نصب می‌شه
💡 همه extras دارای alias هستند — مثلاً pyrubi، pyrubi-rtc، rtc همه معادل aiortc هستن. برای دیدن لیست کامل: pip show fastrub یا فایل pyproject.toml.

📁 ساختار پروژه

tree
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.jsonmethods.min.json
مدل‌هاmodels.jsonmodels.min.json
قابلیت‌هاfeatures.jsonfeatures.min.json
یوزربات (پایروبی)pyrubi.jsonpyrubi.min.json
نکات قبل از شروعprerequisites.jsonprerequisites.min.json

📄 لایسنس

این پروژه تحت لایسنس MIT منتشر شده است.

❤️ ساخته‌شده با ❤️ توسط سید محمد حسین موسوی رجا — OandONE