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

