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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:20:04