如何用discord.py实现定时自动发消息?解决AttributeError报错
解决discord.py Client定时发送消息的问题
问题分析
- 最初的
AttributeError是因为client.loop只能在异步上下文(比如异步事件回调、异步函数)中访问,非异步代码直接调用会触发错误。 - 移到异步函数后无输出无报错,通常是任务未正确启动、频道无法找到、权限不足,或者任务逻辑存在阻塞导致的。
正确实现方案
以下是完整的可运行代码,基于discord.py 2.2.3和Python 3.11:
import discord import asyncio # 配置必要的意图,message_content意图需要在Discord开发者后台开启 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) async def periodic_message_task(channel_id, interval): # 等待客户端完全初始化就绪 await client.wait_until_ready() # 获取目标频道 target_channel = client.get_channel(channel_id) if not target_channel: print(f"错误:无法找到ID为{channel_id}的频道") return # 循环发送消息 while not client.is_closed(): await target_channel.send("定时消息已发送") await asyncio.sleep(interval) @client.event async def on_ready(): print(f"机器人已登录:{client.user}") # 在on_ready事件中启动定时任务(异步上下文安全) # 替换为你的目标频道ID和间隔时间(秒) client.loop.create_task(periodic_message_task(123456789012345678, 10)) # 替换为你的机器人TOKEN client.run("YOUR_BOT_TOKEN_HERE")
关键注意事项
- 意图配置:必须在Discord开发者后台的「机器人」页面开启
message_content意图,否则机器人可能无法发送或读取消息。 - 频道ID获取:开启Discord开发者模式(设置→高级→开发者模式),右键目标频道复制ID。
- 权限检查:确保机器人已加入目标服务器,且在目标频道拥有「发送消息」的权限。
- 任务启动时机:必须在
on_ready事件中启动任务,此时客户端已完成初始化,loop属性可安全访问。
内容的提问来源于stack exchange,提问作者fuzzyexoskills
相关产品推荐
相关产品推荐

