电报机器人可以阻止特定用户吗?

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

我有一个电报机器人,对于任何收到的消息,它都会在服务器中运行一个程序并将其结果发回。但有一个问题!如果用户向我的机器人发送太多消息(垃圾邮件),它将使服务器变得非常繁忙!
有什么办法可以阻止一秒内发送超过5条消息的人并且不再收到他们的消息吗? (使用电报 API!)

telegram-bot spam-prevention
4个回答
9
投票

首先我要说的是,Telegram Bot API 本身不具备这样的能力,因此你需要自己实现它,你需要做的就是:

  1. 统计用户在一秒钟内发送的消息数量,如果没有数据库,这将不是那么容易。但是,如果您有一个包含名为 Black_List 的表的数据库,并将所有消息及其发送时间保存在另一个表中,您将能够计算在预定义时间段内通过一个特定 ChatID 发送的消息数(在您的情况下;1 秒)并检查计数是否大于 5,如果答案为“是”,您可以将该 ChatID 插入到 Black_List 表中。
  2. 每次机器人收到消息时,它都必须运行数据库查询以查看发件人的 chatID 是否存在于 Black_List 表中。如果它存在,它应该继续自己的工作并忽略该消息(或者甚至它可以向用户发送警报说:“你被阻止了。”我认为这可能很耗时)。

请注意,据我所知,当前的电报机器人 API 没有停止接收消息的功能,但正如我上面提到的,您可以忽略来自垃圾邮件发送者的消息。

为了节省时间,您应该避免建立数据库连接 每次机器人收到更新(消息)时,您可以加载 将 Black_List 中存在的 ChatID 添加到 DataSet 中并更新 将新的垃圾邮件发送者 ChatID 插入后的数据集 Black_List 表。 这样查询次数就会减少 明显。


0
投票

我通过这种方式实现了它:

# Using the ttlcache to set a time-limited dict. you can adjust the ttl.
ttl_cache = cachetools.TTLCache(maxsize=128, ttl=60)


def check_user_msg_frequency(message):
    print(ttl_cache)
    msg_cnt = ttl_cache[message.from_user.id]
    if msg_cnt > 3:
        now = datetime.now()
        until = now + timedelta(seconds=60*10)
        bot.restrict_chat_member(message.chat.id, message.from_user.id, until_date=until)
        

def set_user_msg_frequency(message):
    if not ttl_cache.get(message.from_user.id):
        ttl_cache[message.from_user.id] = 1
    else:
        ttl_cache[message.from_user.id] += 1

通过上述功能,您可以记录任意用户在一段时间内发送的消息数量。如果用户发送的消息超过预期,他就会受到限制。

然后,您调用的每个处理程序都应该调用这两个函数:

@bot.message_handler(commands=['start', 'help'])
def handle_start_help(message):
    set_user_msg_frequency(message)
    check_user_msg_frequency(message)

我正在使用

pyTelegramBotAPI
这个模块来处理。


0
投票

我知道我参加聚会迟到了,但这是另一个不使用 Db 的简单解决方案:

  • 创建一个 ConversationState 类,当他们开始与机器人聊天时附加到每个电报 ID

  • 然后向 ConversationState 类添加一个 LastMessage DateTime 变量

  • 现在,每次您收到消息时,请检查 LasteMessage DateTime 是否已经过去了足够的时间,如果没有足够的时间已经过去,则会显示警告消息。

如果您担心性能,您还可以实现一个删除会话状态类的计时器。


0
投票

我想知道机器人用户对话是否与超级组和频道不同,以及如何不同?

在telegram Docs中,有这个函数banChatMember,它可以在频道和超级组中使用 当我尝试使用它来禁止用户进行机器人用户对话时,它返回了此错误

错误代码:400, 描述:“错误请求:无法禁止私人聊天中的成员”

所以听起来屏蔽/禁止私人聊天中的用户必须在代码中实现 有没有办法使用电报功能来达到这个结果?

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