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

Replit环境下discord.py每日定时消息功能异常排查

问题分析与修复方案

你的代码存在几个关键问题,导致定时功能失效:

  • 事件函数未正确注册:on_Ready函数缺少@bot.event装饰器,且函数名应为小写的on_ready(discord.py事件名严格区分大小写),否则机器人启动时不会触发这个函数。
  • datetime对象修改无效:then.replace(hour=12, minute=30)不会修改原对象,需要将返回值重新赋值给then,否则时间设置不生效。
  • 时区未使用UTC:datetime.datetime.now()获取的是本地时间,不是UTC,会导致定时时间偏差,应改用datetime.datetime.utcnow()。
  • 定时任务仅执行一次:当前schedule_daily_message函数只执行一次发送逻辑,需要加入循环才能实现每日重复触发。
  • 频道获取时机不当:在asyncio.sleep之后获取频道,若机器人缓存未加载或频道信息变更,可能获取失败,建议使用fetch_channel确保能拿到频道对象。
  • 缺少必要导入:代码中未导入os和discord.ext.commands,会导致运行报错(你说无报错可能是实际代码里有,但提供的代码缺失)。

修正后的完整代码

import os
import datetime
import asyncio
from discord.ext import commands

bot = commands.Bot(command_prefix="+")
CHANNEL_ID = 你的频道ID  # 替换成实际频道ID

@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")
    await schedule_daily_message()

async def schedule_daily_message():
    while True:
        now = datetime.datetime.utcnow()
        # 计算下一次12:30 UTC的时间
        target_time = now.replace(hour=12, minute=30, second=0, microsecond=0)
        if target_time <= now:
            # 如果当前时间已经过了12:30,就设为第二天的12:30
            target_time += datetime.timedelta(days=1)
        # 计算等待秒数
        wait_seconds = (target_time - now).total_seconds()
        await asyncio.sleep(wait_seconds)
        
        # 获取频道并发送消息
        try:
            channel = await bot.fetch_channel(CHANNEL_ID)
            await channel.send("Enemies Spawned!")
        except Exception as e:
            print(f"发送消息失败: {e}")

bot.run(os.getenv('TOKEN'))

额外注意事项

  • Replit环境保持在线:Replit的免费实例会在一段时间无交互后休眠,导致机器人停止运行。可以使用定时请求工具(如UptimeRobot)定时访问Replit项目的网页端,保持机器人在线。
  • 权限检查:确保机器人拥有目标频道的消息发送权限,且频道ID填写正确。
  • 错误捕获:加入异常捕获可以避免单次发送失败导致整个定时任务崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:35:31