我正在使用 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 来简单地进行过滤,但问题是如何编写自己的过滤器。以前是可以的,也许有些东西已经改变了,或者我误解了什么。