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 غیرفعال کنید.
-
-
ما را در شبکه های اجتماعی دنبال کنید!
- - Telegram - - GitHub -