You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为机器人命令添加冷却时间,防止用户频繁发送命令刷屏

实现命令冷却机制(强制等待+剩余时长提示)

核心思路

要实现这个功能,核心是追踪每个用户的上次命令执行时间,每次收到命令时对比当前时间,判断是否仍在冷却周期内:

  • 若在冷却中:计算剩余等待时长并告知用户
  • 若冷却结束:执行命令并更新用户的上次执行时间

单机场景示例(Python)

适合单实例运行的机器人或服务,用内存字典存储用户的时间戳:

import time

# 存储用户ID与上次执行时间的映射,确保用户唯一标识
user_last_exec = {}
# 可根据需求切换为30秒
COOLDOWN_DURATION = 15

def process_user_command(user_id, command_content):
    current_ts = time.time()
    
    # 检查冷却状态
    if user_id in user_last_exec:
        elapsed = current_ts - user_last_exec[user_id]
        if elapsed < COOLDOWN_DURATION:
            remaining = int(COOLDOWN_DURATION - elapsed)
            print(f"请等待{remaining}秒后再发送命令")
            return
    
    # 执行实际命令逻辑
    print(f"执行用户[{user_id}]的命令:{command_content}")
    # 更新用户的上次执行时间
    user_last_exec[user_id] = current_ts

分布式场景示例(Redis)

如果服务是多实例部署,需要用共享缓存(如Redis)存储冷却数据,避免实例间状态不一致:

import redis
import time

# 初始化Redis连接
redis_client = redis.Redis(host="localhost", port=6379, db=0)
COOLDOWN_DURATION = 15

def process_user_command_distributed(user_id, command_content):
    current_ts = time.time()
    cache_key = f"cmd_cooldown:{user_id}"
    
    # 从Redis获取上次执行时间
    last_exec_ts = redis_client.get(cache_key)
    if last_exec_ts:
        elapsed = current_ts - float(last_exec_ts)
        if elapsed < COOLDOWN_DURATION:
            remaining = int(COOLDOWN_DURATION - elapsed)
            print(f"请等待{remaining}秒后再发送命令")
            return
    
    # 执行命令
    print(f"执行用户[{user_id}]的命令:{command_content}")
    # 存储时间戳并设置过期时间(自动清理失效数据)
    redis_client.setex(cache_key, COOLDOWN_DURATION, current_ts)

关键注意事项

  • 用户标识唯一性:必须用用户的唯一ID(如平台UID)作为键,避免不同用户的冷却状态互相干扰
  • 灵活配置冷却时间:可以针对不同命令设置不同的冷却时长,把COOLDOWN_DURATION改为函数参数即可
  • 提示语优化:剩余时长取整数,用户感知更清晰;也可以根据场景调整提示文案,比如“还剩{remaining}秒,稍后再试”

内容的提问来源于stack exchange,提问作者Ace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:45:20