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

Discord Bot定时通知问题:任务循环无法发送提前1分钟消息

问题分析与修复方案

你的代码存在三个核心问题导致任务循环无法发送消息:

1. 变量作用域错误

cfg命令里的date、ac、ctx都是局部变量,全局的task_loop根本访问不到这些值。而且如果多次调用cfg,新的参数会直接覆盖旧的,无法同时处理多个提醒任务。

2. 时间判断精度问题

datetime.now()包含微秒级精度,而你解析的date只有分钟级,datetime.now() == date - timedelta(minutes=1)几乎不可能触发——每秒轮询一次的逻辑很难刚好卡到那个精确时间点。

3. 全局轮询效率低下

每秒轮询一次的全局循环不仅浪费资源,还无法精准处理多个独立的提醒任务。


修复后的代码实现

我们改用为每个提醒任务单独创建延迟任务的方式,同时存储必要的频道、角色等信息:

import asyncio
from datetime import datetime, timedelta
import discord
from discord.ext import commands

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

async def send_reminder(channel_id, role_mention, ac):
    # 到点发送提醒
    channel = bot.get_channel(channel_id)
    if channel:
        embed = discord.Embed(title="NOTIFICATION")
        embed.add_field(name=f"{ac} 即将开始", value="距离任务开始还有1分钟!")
        await channel.send(content=role_mention, embed=embed)

@bot.command()
async def cfg(ctx, ac: str, date: str):
    try:
        target_time = datetime.strptime(date, "%Y-%m-%d_%H:%M")
        reminder_time = target_time - timedelta(minutes=1)
        now = datetime.now()
        
        if reminder_time < now:
            await ctx.send("错误:指定时间已过,无法设置提醒!")
            return
        
        # 计算需要延迟的秒数
        delay_seconds = (reminder_time - now).total_seconds()
        
        # 发送设置确认消息
        embed = discord.Embed(title="提醒已设置")
        embed.add_field(name=f"{ac} 提醒时间", value=f"{reminder_time.strftime('%Y-%m-%d %H:%M')}")
        await ctx.send(embed=embed)
        
        # 创建延迟任务,到点自动触发提醒
        asyncio.create_task(
            asyncio.sleep(delay_seconds) 
            and send_reminder(ctx.channel.id, ctx.guild.default_role.mention, ac)
        )
    except ValueError:
        await ctx.send("时间格式错误,请使用:YYYY-MM-DD_HH:MM")

@bot.event
async def on_ready():
    print("Bot已上线!")

bot.run("你的Bot令牌")

关键改进点

  • 每个cfg调用都会生成独立的延迟任务,互不干扰,支持同时设置多个提醒
  • 用asyncio.sleep替代全局轮询,精准控制提醒时间,避免不必要的资源消耗
  • 存储频道ID和角色提及字符串,而非直接保存ctx,避免上下文失效
  • 增加了时间格式错误、过期时间的异常处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:05:28