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

Discord定时发送消息无响应问题求助(用discord与schedule模块)

Discord定时消息无响应问题解决办法

核心问题

你遇到的问题根源在于schedule同步库和Discord.py的异步事件循环不兼容:

  • 直接用asyncio.run调用异步发送消息函数,会创建独立的事件循环,和Discord客户端的循环脱节,导致消息无法正确发送。
  • client.run()是阻塞函数,会占用主线程,schedule需要的run_pending()任务检查无法执行,因此定时任务永远不会触发。

方案一:使用Discord.py自带的任务循环(推荐)

Discord.py提供的tasks.loop模块完美适配异步环境,无需额外依赖schedule库:

import discord
from discord.ext import tasks, commands
import datetime
from pytz import timezone

schedule_messages = {
    "11:55": "Mine Clearence",
    "19:55": "Golemore",
    "01:49": "Daily reset"
}

# 根据你的基础代码配置intents
intents = discord.Intents.default()
intents.message_content = True
client = commands.Bot(command_prefix="!", intents=intents)

async def send_scheduled_message(message):
    channel_id = 1160338542329860116  
    channel = client.get_channel(channel_id)
    if channel is not None:
        await channel.send(message)
    else:
        print(f"Channel with ID {channel_id} not found.")

# 为每个定时消息创建每日任务
for time_str, msg in schedule_messages.items():
    # 解析时间并绑定时区
    target_time = datetime.time.fromisoformat(time_str)
    @tasks.loop(time=target_time, timezone=timezone('Europe/London'))
    async def daily_task(message=msg):
        await send_scheduled_message(message)
    
    # 启动任务
    daily_task.start()

# 替换为你的机器人令牌
client.run("YOUR_BOT_TOKEN")

方案二:保留schedule库,适配异步循环

如果一定要使用schedule,需要在后台线程运行任务检查,同时将异步任务提交到Discord的事件循环中:

import discord
import asyncio
import schedule
import time
from threading import Thread
from pytz import timezone

schedule_messages = {
    "11:55": "Mine Clearence",
    "19:55": "Golemore",
    "01:49": "Daily reset"
}

# 配置intents
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

async def send_scheduled_message(message):
    channel_id = 1160338542329860116  
    channel = client.get_channel(channel_id)
    if channel is not None:
        await channel.send(message)
    else:
        print(f"Channel with ID {channel_id} not found.")

# 后台线程运行schedule的任务检查
def run_schedule_loop():
    while True:
        schedule.run_pending()
        time.sleep(1)

# 初始化定时任务,将异步任务提交到Discord循环
for time_str, message in schedule_messages.items():
    def job(msg=message):
        # 用Discord的事件循环执行异步函数
        asyncio.run_coroutine_threadsafe(send_scheduled_message(msg), client.loop)
    
    schedule.every().day.at(time_str, timezone('Europe/London')).do(job)

# 启动后台线程
Thread(target=run_schedule_loop, daemon=True).start()

client.run("YOUR_BOT_TOKEN")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:02:49