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

Discord.py后台任务:如何为消息反应传递正确上下文?代码求助

解决Discord机器人后台任务中添加消息反应的上下文问题

我明白你现在遇到的问题了——在后台定时任务里发送图片后,不知道怎么正确给消息添加反应对吧?咱们先拆解下你代码里的问题,再一步步修正。

你的代码里的核心问题

  • 调用bot.add_reaction时,你传的是discord.message,这是Discord.py里的消息类,不是你刚发送出去的那条实际消息对象,机器人根本不知道要给哪条消息加反应
  • bot.is_closed少了括号,应该是bot.is_closed()——这是个方法调用,不然会一直判断为True,循环根本停不下来
  • 用discord.Object创建频道对象不够稳妥,最好用bot.get_channel获取真实的频道实例,避免后续操作因为对象无效出错

修正后的完整代码

import asyncio
import discord

async def my_background_task():
    await bot.wait_until_ready()
    counter = 0
    # 用get_channel获取真实的频道对象,比discord.Object更可靠
    channel = bot.get_channel(446782521070321664)
    # 调用is_closed()方法判断机器人状态,必须加括号
    while not bot.is_closed():
        counter += 1
        with open('vbuck.png', 'rb') as f:
            # 保存send_file返回的消息对象,这就是刚发出去的那条消息
            sent_message = await bot.send_file(channel, f)
        # 用保存的sent_message作为第一个参数,给目标消息加反应
        await bot.add_reaction(sent_message, '<:vbuck:441740047897591809>')
        # 7分钟=420秒,定时逻辑没问题
        await asyncio.sleep(420)

bot.loop.create_task(my_background_task())

关键修改点解释

  • 获取有效频道对象:bot.get_channel会从机器人的缓存里拉取真实的频道实例,确保后续发送消息、操作消息都能正常执行,而discord.Object只是一个空壳对象,没有实际的频道数据支撑
  • 保存发送的消息实例:send_file方法会返回发送成功的Message对象,我们把它存在sent_message变量里,这就是后续要加反应的具体目标
  • 正确调用add_reaction:第一个参数必须是实际的Message对象,而不是discord.message类,这样机器人才能精准定位到要操作的消息
  • 修复循环终止条件:bot.is_closed()是判断机器人是否已关闭的方法,必须加括号调用,不然循环会无限执行下去

额外版本兼容提示

如果你的Discord.py版本比较新(v1.0+),send_file已经被官方弃用了,建议改用channel.send方法,代码可以改成这样:

with open('vbuck.png', 'rb') as f:
    sent_message = await channel.send(file=discord.File(f))

这样更符合新版本的API规范,避免后续版本更新后出现兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:29