Python电报分页机器人

最近,我面临着在电报漫游器中对元素列表进行分页的任务。她很惊讶地发现,对于这种看似典型的任务,PyPi没有单个库。因此,决定纠正这一烦人的遗漏并发布其实现。


您可以通过在控制台中执行以下操作从PyPi安装软件包:


pip install python-telegram-bot-pagination

telegram_bot_pagination包中的InlineKeyboardPaginator类使获取一组用于浏览列表页面的内联按钮变得容易。必须将构造元素列表的页面数以及通过按bot按钮返回的用于生成数据的当前页面和模式传送给构造函数。之后,分页器自己将形成必要的键盘,该键盘可通过markup属性使用。


from telegram_bot_pagination import InlineKeyboardPaginator

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

现在,paginator.markup将为sendMessage Telegram Bot API方法的reply_markup字段返回一个json对象。在这种情况下,将形成五个按钮。如果页面数为五或更少,则按钮将相应地显示。如果只有一页,则标记将为空白。如果页面超过五页,则键盘将包含5个按钮,用于:


  • 第一页;
  • 上一页;
  • 当前页面;
  • 下一页;
  • 最后一页。

例如,如果要创建一个显示字符列表的机器人,要使用包含哈利·波特角色描述的character_pages数组,我们需要一个发送当前列表页面的函数:


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与bot配合使用。


示例的完整代码可以在这里找到


结果取决于列表中的条目数,如下所示:





谢谢您的关注。我会对任何建设性的批评感到高兴。


All Articles