Python Telegram Pagination Bot

واجهت مؤخرًا مهمة ترقيم قائمة بالعناصر في بوت برقية. وقد فوجئت عندما وجدت أنه لمثل هذه المهمة التي تبدو نموذجية ، ليس لدى PyPi مكتبة واحدة. لذلك ، تقرر تصحيح هذا الإغفال المزعج ونشر تنفيذه.


يمكنك تثبيت الحزمة من PyPi عن طريق التنفيذ في وحدة التحكم:


pip install python-telegram-bot-pagination

تسهل فئة InlineKeyboardPaginator من حزمة telegram_bot_pagination الحصول على مجموعة من الأزرار المضمنة للتنقل عبر صفحات القائمة. من الضروري أن تنقل إلى المصمم عدد الصفحات التي تنقسم إليها قائمة العناصر ، بالإضافة إلى الصفحة والنمط الحاليين لتوليد البيانات التي يتم إرجاعها بالضغط على زر الروبوت. بعد ذلك ، سيشكل paginator نفسه لوحة المفاتيح الضرورية ، والتي ستكون متاحة من خلال خاصية الترميز.


from telegram_bot_pagination import InlineKeyboardPaginator

paginator = InlineKeyboardPaginator(
        10,
        current_page=1,
        data_pattern='elements#{page}'
    )

سيقوم paginator.markup الآن بإرجاع كائن json لحقل response_markup لطريقة sendMessage Telegram Bot API. في هذه الحالة ، سيتم تشكيل خمسة أزرار. إذا كان عدد الصفحات خمس أو أقل ، فستكون الأزرار في المقابل. إذا كانت هناك صفحة واحدة فقط ، فسيكون الترميز فارغًا. إذا كان هناك أكثر من خمس صفحات ، فستحتوي لوحة المفاتيح على 5 أزرار لـ:


  • الصفحة الأولى؛
  • الصفحة السابقة؛
  • الصفحه الحاليه؛
  • الصفحة التالية؛
  • آخر صفحة.

على سبيل المثال ، إذا كان هناك مصفوفة من حرف_الصفحات تحتوي على أوصاف لشخصيات هاري بوتر لإنشاء روبوت يعرض قائمة من الشخصيات ، فنحن بحاجة إلى وظيفة ترسل صفحة القائمة الحالية:


def send_character_page(message, page=1):
    paginator = InlineKeyboardPaginator(
        len(character_pages),
        current_page=page,
        data_pattern='character#{page}'
    )

    bot.send_message(
        message.chat.id,
        character_pages[page-1],
        reply_markup=paginator.markup,
        parse_mode='Markdown'
    )

ومعالج الأزرار في البوت:



@bot.callback_query_handler(func=lambda call: call.data.split('#')[0]=='character')
def characters_page_callback(call):
    page = int(call.data.split('#')[1])
    bot.delete_message(
        call.message.chat.id,
        call.message.message_id
    )
    send_character_page(call.message, page)

* يستخدم المثال pyTelegramBotAPI للعمل مع البوت.


يمكن العثور على الرمز الكامل للمثال هنا .


ستبدو النتيجة ، وفقًا لعدد الإدخالات في القائمة ، كما يلي:





شكرا للانتباه. سأكون سعيدًا بأي نقد بناء.


All Articles