我有一个电报机器人,对于任何收到的消息,它都会在服务器中运行一个程序并将其结果发回。但有一个问题!如果用户向我的机器人发送太多消息(垃圾邮件),它将使服务器变得非常繁忙!
有什么办法可以阻止一秒内发送超过5条消息的人并且不再收到他们的消息吗? (使用电报 API!)
首先我要说的是,Telegram Bot API 本身不具备这样的能力,因此你需要自己实现它,你需要做的就是:
每次机器人收到消息时,它都必须运行数据库查询以查看发件人的 chatID 是否存在于 Black_List 表中。如果它存在,它应该继续自己的工作并忽略该消息(或者甚至它可以向用户发送警报说:“你被阻止了。”我认为这可能很耗时)。
请注意,据我所知,当前的电报机器人 API 没有停止接收消息的功能,但正如我上面提到的,您可以忽略来自垃圾邮件发送者的消息。
为了节省时间,您应该避免建立数据库连接 每次机器人收到更新(消息)时,您可以加载 将 Black_List 中存在的 ChatID 添加到 DataSet 中并更新 将新的垃圾邮件发送者 ChatID 插入后的数据集 Black_List 表。 这样查询次数就会减少 明显。
我通过这种方式实现了它:
# 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
这个模块来处理。
我知道我参加聚会迟到了,但这是另一个不使用 Db 的简单解决方案:
创建一个 ConversationState 类,当他们开始与机器人聊天时附加到每个电报 ID
然后向 ConversationState 类添加一个 LastMessage DateTime 变量
现在,每次您收到消息时,请检查 LasteMessage DateTime 是否已经过去了足够的时间,如果没有足够的时间已经过去,则会显示警告消息。
如果您担心性能,您还可以实现一个删除会话状态类的计时器。
我想知道机器人用户对话是否与超级组和频道不同,以及如何不同?
在telegram Docs中,有这个函数banChatMember,它可以在频道和超级组中使用 当我尝试使用它来禁止用户进行机器人用户对话时,它返回了此错误
错误代码:400, 描述:“错误请求:无法禁止私人聊天中的成员”
所以听起来屏蔽/禁止私人聊天中的用户必须在代码中实现 有没有办法使用电报功能来达到这个结果?