balepy
کتابخانهای قدرتمند و async برای ساخت رباتهای Bale Messenger — با رابطی الهامگرفته از Pyrogram
pip install -U balepy
کپی
نصب کتابخانه
با یک دستور ساده آخرین نسخه balepy را نصب کنید.
# نصب آخرین نسخه pip install -U balepy # نصب از GitHub pip install git+https://github.com/mamdmehrabi/balepy.git
colorama را هم نصب کنید: pip install coloramaاولین ربات
با چند خط کد یک ربات echo ساده بسازید.
from balepy import Client, filters bot = Client("MyBot", "TOKEN") @bot.on_message(filters.command("start")) async def start_handler(message): await message.reply("سلام! ربات شروع شد 🌿") @bot.on_message(filters.text) async def echo(message): await message.reply(message.text) bot.run()
ربات با Callback Query
from balepy import Client, filters from balepy.types import InlineKeyboardMarkup, InlineKeyboardButton bot = Client("ButtonBot", "TOKEN") @bot.on_message(filters.command("menu")) async def menu(message): keyboard = InlineKeyboardMarkup([ [InlineKeyboardButton("گزینه ۱", callback_data="opt1")], [InlineKeyboardButton("گزینه ۲", callback_data="opt2")], ]) await bot.send_message(message.chat_id, "انتخاب کن:", reply_markup=keyboard) @bot.on_callback_query(filters.callback_data("opt1")) async def on_opt1(callback): await bot.anwser_callback_query(callback.id, text="گزینه اول انتخاب شد!") bot.run()
کلاس Client
کلاس اصلی برای تمام عملیات ربات. تمام متدها از این کلاس در دسترس هستند.
| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| name | str | ✓ | نام ربات (فقط برای نمایش) |
| bot_token | str | ✓ | توکن ربات از BaleBot |
| wallet_token | Optional[str] | — | توکن wallet برای پرداخت |
| timeout | Optional[int] | 20 | timeout درخواستهای HTTP |
| max_retry | Optional[int] | 3 | تعداد تلاش مجدد در خطا |
| base_url | Optional[str] | — | آدرس سفارشی API |
| proxies | Optional[str] | — | آدرس پروکسی |
اجرا و چرخه حیات
# استفاده در داخل event loop import asyncio async def main(): await bot.start() asyncio.run(main())
Middleware
قبل از رسیدن آپدیت به هندلر، منطق اجرا کنید. با برگرداندن False میتوانید پردازش را متوقف کنید.
# middleware ساده برای لاگ async def logging_middleware(client, update): print(f"Update received: {update}") return True # ادامه پردازش # middleware برای فیلتر کاربر بلاک شده async def block_filter(client, update): blocked_users = [123456] if update.message and update.message.from_user.id in blocked_users: return False # توقف پردازش bot.use(logging_middleware) bot.use(block_filter)
send_message
ارسال پیام متنی به یک چت.
| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| chat_id | Union[int, str] | ✓ | آیدی چت یا username |
| text | str | ✓ | متن پیام |
| parse_mode | Optional[str] | — | HTML یا Markdown |
| reply_to_message_id | Optional[int] | — | آیدی پیام برای ریپلای |
| reply_markup | Optional[dict] | — | کیبورد / دکمهها |
await bot.send_message( chat_id=123456789, text="<b>سلام!</b> این یک پیام تستی است.", parse_mode="HTML" )
send_photo
| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| chat_id | Union[int, str] | ✓ | آیدی چت |
| photo | str | ✓ | file_id یا URL تصویر |
| caption | Optional[str] | — | توضیح زیر تصویر |
| parse_mode | Optional[str] | — | فرمت caption |
| reply_to_message_id | Optional[int] | — | ریپلای به پیام |
| reply_markup | Optional[dict] | — | کیبورد |
await bot.send_photo( chat_id=message.chat_id, photo="https://example.com/image.jpg", caption="عکس زیبا 🌿" )
send_audio
| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| chat_id | Union[int, str] | ✓ | آیدی چت |
| audio | str | ✓ | file_id یا URL فایل صوتی |
| caption | Optional[str] | — | توضیح |
| duration | Optional[int] | — | مدت زمان (ثانیه) |
| performer | Optional[str] | — | نام خواننده |
| title | Optional[str] | — | عنوان آهنگ |
| reply_to_message_id | Optional[int] | — | ریپلای |
| reply_markup | Optional[dict] | — | کیبورد |
send_video
send_audio هستند با اضافهشدن width، height و duration.await bot.send_video( chat_id=message.chat_id, video="file_id_here", caption="ویدیو", width=1280, height=720, duration=60 )
send_document
await bot.send_document( chat_id=message.chat_id, document="file_id_or_url", caption="فایل PDF", file_name="document.pdf" )
send_animation / send_voice / send_sticker
send_location / send_contact / send_dice / send_venue
send_media_group
ارسال چند رسانه به صورت آلبوم.
from balepy.types import InputMediaPhoto await bot.send_media_group( chat_id=message.chat_id, media=[ InputMediaPhoto("file_id_1", caption="تصویر اول"), InputMediaPhoto("file_id_2"), ] )
forward_message / copy_message / delete_message
ویرایش پیام
پین کردن پیام
Callback Query
| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| callback_query_id | str | ✓ | آیدی callback |
| text | Optional[str] | — | متن نوتیفیکیشن |
| show_alert | bool | False | نمایش به صورت alert |
| url | Optional[str] | — | URL برای باز کردن |
| cache_time | Optional[int] | — | مدت cache به ثانیه |
@bot.on_callback_query() async def handle_callback(callback): await bot.anwser_callback_query( callback_query_id=callback.id, text="✅ دریافت شد", show_alert=True )
دریافت و دانلود فایل
# دریافت اطلاعات فایل file_obj = await bot.get_file(message.document.file_id) url = bot.get_file_url(file_obj.file_path) # دانلود مستقیم file_path, download_url = await bot.download_file(file_id)
اطلاعات ربات و کاربر
get_chat / get_user
مدیریت اعضای چت
تنظیمات چت
لینکهای دعوت
دستورات ربات
from balepy.types import BotCommand await bot.set_my_commands([ BotCommand("start", "شروع ربات"), BotCommand("help", "راهنما"), BotCommand("menu", "منوی اصلی"), ])
سیستم پرداخت
با تنظیم wallet_token در Client میتوانید فاکتور بفرستید و پرداختها را مدیریت کنید.
WALLET-TEST-1111111111111111 — در production از توکن واقعی استفاده کنید. برای pre_checkout_query باید در ۱۰ ثانیه پاسخ دهید.| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| chat_id | Union[int, str] | ✓ | آیدی چت |
| title | str | ✓ | عنوان فاکتور |
| description | str | ✓ | توضیح فاکتور |
| payload | str | ✓ | داده داخلی (برای شناسایی سفارش) |
| prices | list[LabeledPrice] | ✓ | لیست قیمتها |
| photo_url | Optional[str] | — | URL تصویر محصول |
| need_name | Optional[bool] | — | درخواست نام |
| need_phone_number | Optional[bool] | — | درخواست شماره |
| is_flexible | Optional[bool] | — | قیمت قابل تغییر |
from balepy import Client from balepy.types import LabeledPrice bot = Client("PayBot", "TOKEN", wallet_token="WALLET_TOKEN") @bot.on_message(filters.command("buy")) async def buy(message): await bot.send_invoice( chat_id=message.chat_id, title="اشتراک ماهانه", description="۳۰ روز دسترسی کامل", payload="subscription_monthly", prices=[LabeledPrice("اشتراک", 50000)], need_phone_number=True ) @bot.on_pre_checkout_query async def checkout(query): await bot.answer_pre_checkout_query(query.id, ok=True) @bot.on_successful_payment async def payment_done(message): await message.reply("✅ پرداخت موفق!")
answer_pre_checkout_query
| پارامتر | تایپ | اجباری | توضیح |
|---|---|---|---|
| pre_checkout_query_id | str | ✓ | آیدی query |
| ok | bool | True | تأیید یا رد پرداخت |
| error_message | Optional[str] | — | پیام خطا در صورت رد |
مدیریت استیکر
دریافت آپدیتها
فیلترهای آماده
فیلترهای singleton که نیاز به instantiate ندارند.
فیلترهای نوع محتوا
فیلترهای چت
فیلترهای رویداد
فیلترهای تابعی
ترکیب فیلترها
با عملگرهای &، | و ~ فیلترها را ترکیب کنید.
# AND — پیام متنی در چت خصوصی @bot.on_message(filters.text & filters.private) async def private_text(message): ... # OR — عکس یا ویدیو @bot.on_message(filters.photo | filters.video) async def media_handler(message): ... # NOT — هر پیامی که از ربات نباشد @bot.on_message(~filters.bot) async def human_only(message): ... # ترکیب پیچیده @bot.on_message( (filters.text | filters.caption) & filters.group & ~filters.bot ) async def group_text(message): ...
فیلتر سفارشی
با filters.create() فیلتر کاملاً سفارشی بسازید — sync یا async.
# فیلتر sync admin_filter = filters.create(lambda msg: msg.from_user.id in [123, 456]) # فیلتر async (با دسترسی به دیتابیس) async def is_premium(message): return await db.is_premium_user(message.from_user.id) premium_filter = filters.create(is_premium) @bot.on_message(premium_filter & filters.text) async def premium_only(message): await message.reply("✨ محتوای ویژه کاربران Premium")
Handler Classes
علاوه بر decorator، میتوانید با bot.add_handler() هندلر اضافه کنید.
data_match wildcardfrom balepy.handlers import CommandHandler, CallbackQueryHandler async def start_cb(message): await message.reply("شروع شد!") async def btn_cb(callback): await bot.anwser_callback_query(callback.id, text="OK") bot.add_handler(CommandHandler("start", start_cb)) bot.add_handler(CallbackQueryHandler(btn_cb, data_match="btn_*"))
Types Reference
تمام تایپهای قابل import از balepy.types:
from balepy.types import ( User, Chat, Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton, LabeledPrice, BotCommand, ChatPermissions, InputMediaPhoto, InputMediaVideo )
مدیریت خطا
در صورت بروز خطا از API، APIError raise میشود.
| attribute | تایپ | توضیح |
|---|---|---|
| error_code | int | کد خطای HTTP |
| description | str | پیام خطا |
from balepy.errors import APIError # روش ۱: try/except در هر هندلر @bot.on_message(filters.text) async def handler(message): try: await bot.send_message(message.chat_id, "سلام") except APIError as e: print(f"Error {e.error_code}: {e.description}") # روش ۲: error handler جهانی @bot.on_error async def global_error(error, update): print(f"Unhandled: {error}")
max_retry بار تلاش مجدد میکند. این رفتار را با max_retry=0 غیرفعال کنید.