如何使用 telegram.ext 中的 MessageHandler 正确过滤消息

问题描述 投票:0回答:1

我正在使用 Python3 和 telegram-python-bot v.21.0.1 库使用 telegram 和 telegram.ext 模块来创建我的机器人。 现在我面临着创建自定义过滤器来过滤来自此聊天的管理员\所有者的消息的问题。

这是我的代码:

async def handle_message(update: Update, context: CallbackContext):
    user_status = await context.bot.get_chat_member(update.effective_chat.id, update.effective_user.id)
    status_message = f"User status {update.effective_user.mention_html()} in this chat: {user_status.status}"
    await context.bot.send_message(chat_id=update.effective_chat.id,
                                   text=status_message,
                                   parse_mode='HTML')


class NotPrivilegedUserFilter(filters.BaseFilter):
    def filter(self, message):
        return False


application = Application.builder().token(TOKEN).build()
my_filter = NotPrivilegedUserFilter()
application.add_handler(MessageHandler(filters=my_filter, callback=handle_message))
application.run_polling()

据我了解,要创建自己的过滤器,您需要从 BaseFilter 创建自己的子类并实现 filter 方法,该方法将返回 bool。在上面的例子中,一切都很简单,它总是返回 false,只是为了确保它有效。然后 MessageHandler 获取消息并从逻辑上讲应该将其传递到过滤器中,在本例中,传递到已初始化的 NotPrivilegedUserFilter 作为变量 my_filter。然而,在运行时,这不起作用,没有错误或异常,并且总是调用我的处理消息的handle_message回调(写入在聊天中写入的成员的状态)。

实际上,问题是——我做错了什么?我的任务是过滤掉状态为 ChatMemberStatus.ADMINISTRATOR、ChatMemberStatus.OWNER 的成员发送的消息。

我已经阅读了文档,它的描述似乎与我完全一样,而且我已经阅读了 BaseFilter 和 MessageHandler 类中库中的文档字符串。我询问了 ChatGPT,但它也没有提供任何信息;我尝试了他建议的所有选项。 另外,我通过打印(笑)类 NotPrivilegedUserFilter 进行调试,以确保它在 MessageHandler 操作期间被调用,但这并没有发生。 我还查看了 python-telegram-bot 项目的 GitHub 上的代码示例,但没有找到创建自定义过滤器的示例。

我查看了 Stack Overflow 上提供的选项...好吧,您当然可以创建一个返回聊天管理员 ID 和其他特权用户列表的函数,并通过检查列表中的 ID 来简单地进行过滤,但问题是如何编写自己的过滤器。以前是可以的,也许有些东西已经改变了,或者我误解了什么。

python-3.x telegram-bot python-telegram-bot
1个回答
0
投票

您应该从

MessageFilter
继承子类。这在
BaseHandler
的类描述和 this wiki page 上也有详细介绍。


免责声明:我目前是

python-telegram-bot
的维护者。

© www.soinside.com 2019 - 2024. All rights reserved.