RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1604804
Accepted
Hit
Hit
Asked:2025-01-14 21:17:59 +0000 UTC2025-01-14 21:17:59 +0000 UTC 2025-01-14 21:17:59 +0000 UTC

命令 /report python teleBot 不起作用

  • 772

/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
  • 2 2 个回答
  • 29 Views

2 个回答

  • Voted
  1. Medvedev
    2025-01-15T11:40:29Z2025-01-15T11:40:29Z

    首先,按顺序:

    在 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,并在其中编写所需的所有逻辑。

    例如:

    def handle_response(message):
        ... ...
    
    
    @bot.message_handler(commands=['report'])
    def handle_report(message):
        # как то так
        if message.reply_to_message:
            handle_response(message)
        else:
            print(f'{report_data=}')
            chat_id = message.chat.id
            report_data[chat_id]['message_id'] = message.message_id
            report_data[chat_id]['responses']
            bot.reply_to(message, "Пожалуйста, ответьте ... .")
    

    第三点:

    这里传递的是提交投诉的用户的 ID,而不是被投诉的人的 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} сообщил о нарушении.")
    

    要获取回复消息的用户的 ID,您需要使用message.reply_to_message.from_user.id

    顺便说一句:也许这在技术上是合理的,但感觉report_data = defaultdict(lambda: {'message_id': None, 'responses': set()})它可以用普通词典代替

    • 1
  2. Best Answer
    Hit
    2025-01-18T00:58:10Z2025-01-18T00:58:10Z

    我用这段代码解决了这个问题

    # Хранение данных о репортах
    report_data =  {}
    # Обработка ответа на сообщение с /report
    @bot.message_handler(commands=['report','репорт'])
    def handle_report(message):
        if message.reply_to_message:
            chat_id = message.chat.id#инециалезацыя всякой хрени
            reported_message_text = message.reply_to_message.text
    
            if chat_id not in report_data:#проверка на существования пометки chat_id
                report_data[chat_id] = {'responses': set()}
                
            report = report_data[chat_id]
            #добавляем id балбеса or нарушителя в тетрадь смерти Сталина report
            report['responses'].add(message.reply_to_message.from_user.id) 
            ban_ded=message.reply_to_message.from_user.id
            report_chat=message.chat.id
             
            bot.send_message(admin_grops,f"послали репорт на >> tg://user?id={message.reply_to_message.from_user.id}, @{message.reply_to_message.from_user.username} | сообщение>>" + reported_message_text)
            logger.debug(f"послали репорт на >>  @{message.reply_to_message.from_user.username} | https://t.me/c/{report_chat}/{message.reply_to_message.message_id} сообщение>> " + reported_message_text)
            logger.info(f"Пользователь @{message.from_user.username} сообщил о нарушении.")
            
            # Проверяем, достаточно ли ответов для бана
            if len(report['responses']) >= 5:
    #           bot.kick_chat_member(chat_id, user_to_ban, until_date=int(time.time()) + 86400)
                bot.send_message(admin_grops,f"грубый нарушитель ! >> tg://user?id={ban_ded}")
     
    
                #bot.send_message(admin_grops, f"Пользователь {message.reply_to_message.from_user.username} получил бан на 24 часа за нарушение.")
                #logger.debug(f"Пользователь {message.reply_to_message.from_user.username} получил бан на 24 часа за нарушение.")        
    
            # Удаляем данные о репорте
            del report_data[chat_id]
        else:
           #print(f'{report_data=}')
           #chat_id = message.chat.id
           #report_data[chat_id]['message_id'] = message.message_id
           #report_data[chat_id]['responses']  =report_data[chat_id]['responses'] + 1   
            bot.reply_to(message, "Пожалуйста, ответьте командой на сообщение, нарушающее правила, чтобы сообщить о нарушении.")
    
    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5