/report 命令应按如下方式工作:用户看到违反规则的消息并使用命令进行响应,有关报告的消息将发送到管理组,如果用户中的 5 个人报告了违规行为,则会将他们保留一天,以下是代码:
# Хранение данных о репортах
report_data = defaultdict(lambda: {'message_id': None, 'responses': set()})
@bot.message_handler(commands=['report'])
def handle_report(message):
chat_id = message.chat.id
report_data[chat_id]['message_id'] = message.message_id
report_data[chat_id]['responses'].clear()
bot.reply_to(message, "Пожалуйста, ответьте на сообщение, нарушающее правила, чтобы сообщить о нарушении.")
# Обработка ответа на сообщение с /report
@bot.message_handler(func=lambda msg: msg.reply_to_message and msg.reply_to_message.message_id in [data['message_id'] for data in report_data.values()])
def handle_response(message):
chat_id = message.chat.id
report = report_data[chat_id]
# Добавляем ID пользователя
report['responses'].add(message.from_user.id)
bot.send_message(admin_grops,f"послали репорт на >> tg://user?id={message.from_user.id}, @{message.from_user.username} " + message.text)
print(f"Пользователь @{message.from_user.username} сообщил о нарушении.")
# Проверяем, достаточно ли ответов для бана
if len(report['responses']) >= 5:
user_to_ban = message.reply_to_message.from_user.id
bot.kick_chat_member(chat_id, user_to_ban, until_date=int(time.time()) + 86400)
bot.send_message(admin_grops, f"Пользователь {user_to_ban} получил бан на 24 часа за нарушение.")
# Логируем бан
with open('ban_list.txt', 'a', encoding='utf-8') as f:
log_entry = f"{datetime.now()} - Пользователь {user_to_ban} получил бан\n"
f.write(log_entry)
# Удаляем данные о репорте
del report_data[chat_id]
但实际上代码的工作方式是这样的:用户发送一份报告(正如我之前所描述的),但机器人报告说该消息应该是对另一条消息的回应,尽管事实上一切都是正确的。但是报告不会通过,但如果另一个用户响应/report 命令,报告将通过同一个用户。请帮忙
首先,按顺序:
在 Python 中,解释器从上到下逐行读取代码。也就是说,在您的情况下,当用户发送命令时,
/report您将始终执行该函数handle_report(message),仅仅是因为该函数将首先被读取并且命令处理程序将被触发/report。其次:
@bot.message_handler(func=lambda msg: msg.reply_to_message and msg.reply_to_message.message_id in [data['message_id'] for data in report_data.values()])- 这是一个难以阅读的长黑客程序,根据问题中提供的代码的位置来判断,它甚至不起作用,因为处理程序没有触发。而且您不需要用 lambda 来想出额外的处理程序,一切都简单得多:您有一个命令处理程序/report,并在其中编写所需的所有逻辑。例如:
第三点:
这里传递的是提交投诉的用户的 ID,而不是被投诉的人的 ID。
要获取回复消息的用户的 ID,您需要使用
message.reply_to_message.from_user.id顺便说一句:也许这在技术上是合理的,但感觉
report_data = defaultdict(lambda: {'message_id': None, 'responses': set()})它可以用普通词典代替我用这段代码解决了这个问题