Python Library for Bale Messenger

balepy

کتابخانه‌ای قدرتمند و async برای ساخت ربات‌های Bale Messenger — با رابطی الهام‌گرفته از Pyrogram

pip install -U balepy کپی
✓ Async / Await ✓ v1.5.1 Python 3.9+ MIT License

نصب کتابخانه

با یک دستور ساده آخرین نسخه balepy را نصب کنید.

bash
# نصب آخرین نسخه
pip install -U balepy

# نصب از GitHub
pip install git+https://github.com/mamdmehrabi/balepy.git
💡
برای رنگ‌آمیزی خروجی در ترمینال، می‌توانید colorama را هم نصب کنید: pip install colorama

اولین ربات

با چند خط کد یک ربات echo ساده بسازید.

python
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

python
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

کلاس اصلی برای تمام عملیات ربات. تمام متدها از این کلاس در دسترس هستند.

class Client
Client(name: str, bot_token: str, **kwargs)
پارامترتایپاجباریتوضیح
namestrنام ربات (فقط برای نمایش)
bot_tokenstrتوکن ربات از BaleBot
wallet_tokenOptional[str]توکن wallet برای پرداخت
timeoutOptional[int]20timeout درخواست‌های HTTP
max_retryOptional[int]3تعداد تلاش مجدد در خطا
base_urlOptional[str]آدرس سفارشی API
proxiesOptional[str]آدرس پروکسی

اجرا و چرخه حیات

run() sync
ربات را با long polling اجرا می‌کند. مناسب برای اسکریپت‌های ساده.
بدون پارامتر
start() async
شروع polling برای استفاده در event loop موجود.
بدون پارامتر
get_file_url() sync
آدرس مستقیم دانلود فایل را می‌سازد.
file_path: str
download_file() async
فایل را با file_id دانلود می‌کند و tuple برمی‌گرداند.
file_id: str
python
# استفاده در داخل event loop
import asyncio

async def main():
    await bot.start()

asyncio.run(main())

Middleware

قبل از رسیدن آپدیت به هندلر، منطق اجرا کنید. با برگرداندن False می‌توانید پردازش را متوقف کنید.

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

ارسال پیام متنی به یک چت.

send_message async
dict
پارامترتایپاجباریتوضیح
chat_idUnion[int, str]آیدی چت یا username
textstrمتن پیام
parse_modeOptional[str]HTML یا Markdown
reply_to_message_idOptional[int]آیدی پیام برای ریپلای
reply_markupOptional[dict]کیبورد / دکمه‌ها
python
await bot.send_message(
    chat_id=123456789,
    text="<b>سلام!</b> این یک پیام تستی است.",
    parse_mode="HTML"
)

send_photo

send_photo async
dict
پارامترتایپاجباریتوضیح
chat_idUnion[int, str]آیدی چت
photostrfile_id یا URL تصویر
captionOptional[str]توضیح زیر تصویر
parse_modeOptional[str]فرمت caption
reply_to_message_idOptional[int]ریپلای به پیام
reply_markupOptional[dict]کیبورد
python
await bot.send_photo(
    chat_id=message.chat_id,
    photo="https://example.com/image.jpg",
    caption="عکس زیبا 🌿"
)

send_audio

send_audio async
dict
پارامترتایپاجباریتوضیح
chat_idUnion[int, str]آیدی چت
audiostrfile_id یا URL فایل صوتی
captionOptional[str]توضیح
durationOptional[int]مدت زمان (ثانیه)
performerOptional[str]نام خواننده
titleOptional[str]عنوان آهنگ
reply_to_message_idOptional[int]ریپلای
reply_markupOptional[dict]کیبورد

send_video

📹
پارامترهای این متد مشابه send_audio هستند با اضافه‌شدن width، height و duration.
python
await bot.send_video(
    chat_id=message.chat_id,
    video="file_id_here",
    caption="ویدیو",
    width=1280,
    height=720,
    duration=60
)

send_document

python
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_animation async
ارسال GIF یا انیمیشن.
chat_id animation caption
send_voice async
ارسال پیام صوتی (فرمت OGG).
chat_id voice duration
send_sticker async
ارسال استیکر با file_id.
chat_id sticker
send_video_note async
ارسال ویدیو نوت (دایره‌ای).
chat_id video_note duration length

send_location / send_contact / send_dice / send_venue

send_location async
ارسال موقعیت جغرافیایی.
chat_id latitude: float longitude: float
send_contact async
ارسال کارت تماس.
chat_id phone_number first_name last_name
send_dice async
ارسال تاس انیمیشنی.
chat_id emoji
send_venue async
ارسال مکان با نام و آدرس.
chat_id latitude longitude title address

send_media_group

ارسال چند رسانه به صورت آلبوم.

python
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

forward_message async
فوروارد پیام از چتی به چت دیگر.
chat_id from_chat_id message_id
copy_message async
کپی پیام بدون نشانه‌ی فوروارد.
chat_id from_chat_id message_id caption
delete_message async
حذف یک پیام از چت.
chat_id message_id

ویرایش پیام

edit_message_text async
ویرایش متن یک پیام.
text chat_id message_id parse_mode
edit_message_caption async
ویرایش caption رسانه.
chat_id message_id caption
edit_message_reply_markup async
ویرایش کیبورد پیام.
chat_id message_id reply_markup

پین کردن پیام

pin async
پین کردن پیام در چت.
chat_id message_id disable_notification
unpin async
آنپین کردن پیام مشخص.
chat_id message_id
unpin_all_messages async
آنپین کردن تمام پیام‌ها.
chat_id

Callback Query

anwser_callback_query async
dict
پارامترتایپاجباریتوضیح
callback_query_idstrآیدی callback
textOptional[str]متن نوتیفیکیشن
show_alertboolFalseنمایش به صورت alert
urlOptional[str]URL برای باز کردن
cache_timeOptional[int]مدت cache به ثانیه
python
@bot.on_callback_query()
async def handle_callback(callback):
    await bot.anwser_callback_query(
        callback_query_id=callback.id,
        text="✅ دریافت شد",
        show_alert=True
    )

دریافت و دانلود فایل

get_file async
اطلاعات فایل را بر اساس file_id برمی‌گرداند.
file_id: str
get_file_url sync
آدرس مستقیم دانلود فایل را می‌سازد.
file_path: str
download_file async
tuple از (file_path, url) برمی‌گرداند.
file_id: str
python
# دریافت اطلاعات فایل
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_me async
اطلاعات ربات جاری را برمی‌گرداند.
User
log_out async
از سرور خارج می‌شود.
dict
get_user_profile_photos async
عکس‌های پروفایل کاربر را برمی‌گرداند.
user_id offset limit

get_chat / get_user

get_chat async
اطلاعات کامل چت را برمی‌گرداند.
chat_id
ChatFullInfo
get_user async
اطلاعات کاربر را با user_id برمی‌گرداند.
user_id
ChatFullInfo

مدیریت اعضای چت

get_chat_administrators async
لیست ادمین‌های چت.
chat_id
list[ChatMember]
get_chat_member async
اطلاعات یک عضو خاص.
chat_id user_id
get_chat_members_count async
تعداد اعضای چت.
chat_id
ban_chat_member async
بن کردن عضو.
chat_id user_id until_date revoke_messages
unban_chat_member async
آنبن کردن عضو.
chat_id user_id only_if_banned
promote_chat_member async
ارتقا دادن عضو به ادمین.
chat_id user_id can_delete_messages can_pin_messages
restrict_chat_member async
محدود کردن دسترسی عضو.
chat_id user_id permissions: ChatPermissions
leave_chat async
ربات از چت خارج می‌شود.
chat_id
invite_to_chat async
دعوت کاربر به چت.
chat_id user_id
approve_chat_join_request async
تأیید درخواست عضویت.
chat_id user_id
decline_chat_join_request async
رد درخواست عضویت.
chat_id user_id

تنظیمات چت

set_chat_title async
تغییر عنوان چت.
chat_idtitle
set_chat_description async
تغییر توضیحات چت.
chat_iddescription
set_chat_photo async
تغییر عکس چت.
chat_idphoto
delete_chat_photo async
حذف عکس چت.
chat_id
set_chat_permissions async
تنظیم مجوزهای پیش‌فرض.
chat_idpermissions: ChatPermissions
set_chat_administrator_custom_title async
عنوان سفارشی برای ادمین.
chat_iduser_idcustom_title

دستورات ربات

set_my_commands async
تنظیم لیست دستورات ربات.
commands: list[BotCommand]
get_my_commands async
دریافت لیست دستورات فعلی.
list[BotCommand]
delete_my_commands async
حذف همه دستورات ربات.
بدون پارامتر
python
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 باید در ۱۰ ثانیه پاسخ دهید.
send_invoice async
dict
پارامترتایپاجباریتوضیح
chat_idUnion[int, str]آیدی چت
titlestrعنوان فاکتور
descriptionstrتوضیح فاکتور
payloadstrداده داخلی (برای شناسایی سفارش)
priceslist[LabeledPrice]لیست قیمت‌ها
photo_urlOptional[str]URL تصویر محصول
need_nameOptional[bool]درخواست نام
need_phone_numberOptional[bool]درخواست شماره
is_flexibleOptional[bool]قیمت قابل تغییر
python
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_idstrآیدی query
okboolTrueتأیید یا رد پرداخت
error_messageOptional[str]پیام خطا در صورت رد

مدیریت استیکر

get_sticker_set async
اطلاعات پک استیکر را برمی‌گرداند.
name: str
StickerSet
upload_sticker_file async
آپلود فایل استیکر جدید.
user_idpng_sticker
create_new_sticker_set async
ایجاد پک استیکر جدید.
user_id name title emojis
add_sticker_to_set async
افزودن استیکر به پک.
user_id name emojis
set_sticker_position_in_set async
تغییر موقعیت استیکر در پک.
sticker position: int
delete_sticker_from_set async
حذف استیکر از پک.
sticker

دریافت آپدیت‌ها

get_updates async
دریافت آپدیت‌ها با long polling.
offset: int = -1 limit: int = 100 timeout allowed_updates
set_webhook async
تنظیم Webhook برای دریافت آپدیت.
url: str max_connections allowed_updates
get_webhook_info async
اطلاعات Webhook فعلی.
WebHookInfo
delete_webhook async
حذف Webhook و بازگشت به polling.
بدون پارامتر

فیلترهای آماده

فیلترهای singleton که نیاز به instantiate ندارند.

فیلترهای نوع محتوا

filters.text
filters.photo
filters.video
filters.audio
filters.voice
filters.document
filters.sticker
filters.animation
filters.contact
filters.location
filters.dice
filters.invoice
filters.successful_payment
filters.video_note
filters.venue
filters.caption
filters.media

فیلترهای چت

filters.private
filters.group
filters.channel

فیلترهای رویداد

filters.reply
filters.forwarded
filters.pinned_message
filters.new_chat_members
filters.left_chat_member
filters.bot
filters.all

فیلترهای تابعی

filters.command(commands, prefixes="/")
فیلتر دستورات مانند /start یا /help. می‌توان list داد.
commands: str | list prefixes: str = "/"
filters.regex(pattern, flags=0)
فیلتر با الگوی regex روی text یا caption.
pattern: str flags: int
filters.text_match(keywords, case_sensitive=False)
فیلتر بر اساس وجود کلمه کلیدی در متن.
keywords: str | list case_sensitive
filters.user(user_ids)
فیلتر بر اساس user_id فرستنده.
user_ids: int | list[int]
filters.chat(chat_ids)
فیلتر بر اساس chat_id.
chat_ids: int | list[int]
filters.callback_data(pattern)
فیلتر callback query با wildcard (*) پشتیبانی می‌کند.
pattern: str | list

ترکیب فیلترها

با عملگرهای &، | و ~ فیلترها را ترکیب کنید.

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

python
# فیلتر 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() هندلر اضافه کنید.

MessageHandler
هندل پیام‌های معمولی
CommandHandler
هندل دستورات — argument اول command string است
CallbackQueryHandler
هندل callback query با data_match wildcard
EditedMessageHandler
هندل پیام‌های ویرایش شده
ChannelPostHandler
هندل پست‌های کانال
PreCheckoutQueryHandler
هندل pre-checkout پرداخت
ShippingQueryHandler
هندل shipping query
SuccessfulPaymentHandler
هندل پرداخت موفق
MyChatMemberHandler
هندل تغییر وضعیت ربات در چت
ChatMemberHandler
هندل تغییر وضعیت اعضا
ChatJoinRequestHandler
هندل درخواست عضویت
NewChatMembersHandler
هندل ورود اعضای جدید
python
from 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:

🧑 User
idint
first_namestr
last_namestropt
usernamestropt
is_botbool
💬 Chat
idint
typestr
titlestropt
usernamestropt
📨 Message
message_idint
chat_idint
from_userUseropt
textstropt
captionstropt
photo, video, audio, ...objopt
🔘 CallbackQuery
idstr
from_userUser
data_textstropt
messageMessageopt
🖼 PhotoSize
file_idstr
widthint
heightint
file_sizeintopt
📁 File
file_idstr
file_unique_idstr
file_pathstropt
file_sizeintopt
💰 LabeledPrice
labelstr
amountint
to_dict()method
🎛 InlineKeyboardMarkup
inline_keyboardlist[list[Button]]
🔲 InlineKeyboardButton
textstr
callback_datastropt
urlstropt
⚙️ ChatPermissions
can_send_messagesboolopt
can_send_media_messagesboolopt
to_dict()method
🔗 InviteLink
invite_linkstr
creatorUser
expire_dateintopt
member_limitintopt
📍 Location
latitudefloat
longitudefloat
🎭 BotCommand
commandstr
descriptionstr
to_dict()method
🔄 Update
update_idint
messageMessageopt
callback_queryCallbackQueryopt
edited_messageMessageopt
🌐 WebHookInfo
urlstr
has_custom_certificatebool
pending_update_countint
python
from balepy.types import (
    User, Chat, Message, CallbackQuery,
    InlineKeyboardMarkup, InlineKeyboardButton,
    LabeledPrice, BotCommand, ChatPermissions,
    InputMediaPhoto, InputMediaVideo
)

مدیریت خطا

در صورت بروز خطا از API، APIError raise می‌شود.

class APIError(Exception)
attributeتایپتوضیح
error_codeintکد خطای HTTP
descriptionstrپیام خطا
python
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}")
Client به صورت خودکار تا max_retry بار تلاش مجدد می‌کند. این رفتار را با max_retry=0 غیرفعال کنید.
balepy v1.5.1 | MIT License | Python 3.9+ | Bale Bot API