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

DiscordJS:如何为机器人自身发送的消息创建Thread

解决Discord机器人无法为自身消息创建Thread的问题

看起来你现在的核心问题是:当前代码只给用户的原始消息创建了线程,但你实际想把线程绑定在机器人自己发送的嵌入回复上——而且你的逻辑其实不需要修改if(message.author.bot) return;这个判断,因为触发整个流程的是用户发起的消息。

先拆解你现有代码的问题:

  • 你调用的message.startThread()里的message是用户发的原始消息,之后你又删除了这条消息,不仅会让线程失去父消息(可能引发异常),也完全不符合你“为机器人自身消息创建线程”的需求。
  • 你的异步逻辑用了.then()嵌套,虽然能跑,但可读性差,也容易出现时序问题。

下面是调整后的代码,直接给机器人发送的嵌入回复创建线程:

client.on('messageCreate', async message => { 
  if(message.author.bot) return; 
  if(message.channel.id === config.suggestChannelID) { 
    const suggestEmbed = new MessageEmbed() 
      .setColor('#FEE75C') 
      .setTitle(message.content) 
      .setAuthor({ 
        name: message.member.displayName, 
        iconURL: '[REDACTED]', 
        url: '[REDACTED]' 
      }) 
      .setTimestamp() 
      .setFooter({ 
        text: 'SuggestManager', 
        iconURL: '[REDACTED]' 
      }); 

    // 先发送机器人的嵌入回复,拿到消息对象
    const sentEmbed = await message.reply({ embeds: [suggestEmbed] }); 

    // 给机器人自己的这条消息创建线程
    const discussThread = await sentEmbed.startThread({ 
      name: `讨论: ${message.content.substring(0, 20)}`, // 用建议内容前20字做线程名,更直观
      autoArchiveDuration: 60, 
      type: 'GUILD_PUBLIC_THREAD', 
      reason: '为用户建议创建讨论线程' 
    }); 

    // 添加表情反应
    await sentEmbed.react("👍"); 
    await sentEmbed.react("👎"); 

    // 删除用户的原始消息
    await message.delete(); 
  }; 
});

关键调整点说明:

  1. 线程绑定对象变更:不再给用户的原始消息创建线程,而是给机器人发送的sentEmbed消息调用startThread(),这样线程就牢牢绑定在机器人的回复上了。
  2. 异步逻辑优化:把.then()改成await写法,代码更易读,也能避免异步操作顺序混乱的问题。
  3. 线程名优化:用建议内容的前20字符作为线程名,比固定的name更有辨识度,用户一眼就能知道线程对应的是哪个建议。
  4. 权限检查:确保你的机器人账号在目标频道拥有CREATE_PUBLIC_THREADS、SEND_MESSAGES、MANAGE_MESSAGES这些必要权限,否则可能创建线程失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:57:30