我正在使用 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
来检查机器人的
消息中的用户名。然而,这似乎不起作用
正确。在群聊中,机器人应仅在使用其用户名(例如@my_bot_username)明确提及时做出响应。在私人聊天中,机器人应该回复所有消息。
机器人会回复群聊中的所有消息,无论是否提及。
问题是,如果
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
。