Telegram 机器人会回复所有群组消息,而不是仅在提及时回复

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

我正在使用 python-telegram-bot 库构建一个 Telegram 机器人。我希望我的机器人仅在使用其用户名(例如@my_bot_username)明确提及时才响应群聊中的消息。但是,机器人目前会回复群组中的所有消息,即使未提及也是如此。

这是我的代码的相关部分:

from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

TOKEN = 'your-bot-token'
BOT_USERNAME = '@my_bot_username'

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    message_type = update.message.chat.type
    text = update.message.text

    if message_type == 'group':
        if BOT_USERNAME in text:
            new_text = text.replace(BOT_USERNAME, '').strip()
            response = handle_responses(new_text)
        else:
            return  # Ignore messages that don't mention the bot
    else:
        response = handle_responses(text)

    await update.message.reply_text(response)

def handle_responses(text: str) -> str:
    if 'hello' in text.lower():
        return 'Hello! Nice to meet you!'
    return 'Sorry, I don\'t understand.'

if __name__ == '__main__':
    app = Application.builder().token(TOKEN).build()
    app.add_handler(MessageHandler(filters.TEXT, handle_message))
    app.run_polling()
问题
  • 机器人会回复群聊中的所有消息,即使不是 提到过。
  • 我添加了一个条件来检查消息中是否包含机器人的用户名, 但它仍然没有达到预期的效果。
我的尝试
  • 我使用条件
    if BOT_USERNAME in text
    来检查机器人的 消息中的用户名。然而,这似乎不起作用 正确。
  • 我尝试打印 message_type 和文本进行调试,它们 看来识别正确了。
预期行为

在群聊中,机器人应仅在使用其用户名(例如@my_bot_username)明确提及时做出响应。在私人聊天中,机器人应该回复所有消息。

实际行为

机器人会回复群聊中的所有消息,无论是否提及。

python telegram-bot
1个回答
0
投票

问题是,如果

update.message.chat.type
'group'
,您的 if 语句仅检查机器人的用户名是否在消息中,并且假设如果
update.message.chat.type
不是
'group'
,则它是私人消息。然而,正如文档here中所述,
update.message.chat.type
也可以是
'supergroup'
。所以你希望你的 if 语句是:

    if message_type == 'group' or message_type == 'supergroup':
        if BOT_USERNAME in text:
            new_text = text.replace(BOT_USERNAME, '').strip()
            response = handle_responses(new_text)
        else:
            return  # Ignore messages that don't mention the bot
    else:
        response = handle_responses(text)

也只是一个建议,我的理解是你总是想检查机器人的名字是否在消息中除非它是私人消息。因此,我会让代码表明,如果消息类型是私有的,则发送消息,否则检查机器人的用户名是否在消息中。像这样:

    if message_type == 'private':
        response = handle_responses(text)
    else: #if it isn't a prvate message
        if BOT_USERNAME in text:
            new_text = text.replace(BOT_USERNAME, '').strip()
            response = handle_responses(new_text)
        else:
            return # Ignore messages that don't mention the bot

顺便说一句,当我在这些类型的情况下遇到问题时,我发现将

if else
语句变成
if elif else
并准确输入我的假设很有帮助,因为我经常会犯错误假设,比如这里发生的事情。因此,将您的声明更改为如下所示:

    if message_type == 'group':
        if BOT_USERNAME in text:
            new_text = text.replace(BOT_USERNAME, '').strip()
            response = handle_responses(new_text)
        else:
            return  # Ignore messages that don't mention the bot
    elif message_type == 'private':
        response = handle_responses(text)
    else:
        print(f"Message type isn't 'group' or 'private', it is {message_type}")

会告诉你

update.message.chat.type
既不是
private
也不是
group

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