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
相关产品推荐
相关产品推荐

