0

0

Discord.js:实现无声消息发送的实用指南

DDD

DDD

发布时间:2025-11-27 12:37:32

|

1021人浏览过

|

来源于php中文网

原创

Discord.js:实现无声消息发送的实用指南

本教程详细介绍了如何在 discord.js 应用程序中实现无声消息的发送。通过分析 discord 消息的内部结构,我们发现设置消息的 flags 属性为 4096 是发送无声消息的关键。文章将提供具体的代码示例,帮助开发者轻松掌握此功能,提升用户体验。

引言

在开发 Discord 机器人时,有时我们需要发送一些不希望触发用户通知或提及(ping)的消息。这类消息通常被称为“无声消息”或“静默消息”。尽管 Discord 官方客户端提供了发送无声消息的选项,但在使用 Discord.js 这样的编程库时,其实现方式可能不那么直观,因为官方文档中通常没有直接提及此功能。本节将深入探讨如何在 Discord.js 中有效地发送无声消息。

Discord 消息标志 (Message Flags) 概览

Discord 消息的内部结构包含一个名为 flags 的属性,它是一个 MessageFlagsBitField 类型的字段。这个字段用于存储关于消息的各种元数据,例如消息是否已删除、是否为临时消息等。每个标志都对应一个特定的位(bit),通过设置或取消设置这些位,可以改变消息的行为或显示方式。

在对发送的无声消息进行深入分析后,我们发现无声消息与普通消息在 flags 属性上存在显著差异。具体来说,当消息被标记为无声时,其 flags 字段的 bitfield 值被设置为 4096。而普通消息的 bitfield 值通常为 0。这个 4096 实际上对应着 SuppressNotifications 标志,其作用是抑制消息通知。

实现无声消息发送

要在 Discord.js 中发送无声消息,关键在于在发送消息时,将 flags 属性设置为包含 4096 这个值的数组。以下是具体的实现步骤和代码示例。

常见误区与正确方法

许多开发者可能会尝试通过在消息内容中添加 @silent 关键词,或在消息对象中设置 silent: true、is_silent: true、ephemeral: true 等属性来发送无声消息。然而,这些尝试通常不会成功,或产生预期之外的结果。

  • 错误尝试示例:

    极限网络办公Office Automation
    极限网络办公Office Automation

    专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬

    下载
    // 尝试1:通过内容关键词
    var msg = await channel.send("@silent message"); // 仅发送字面量,不触发无声效果
    
    // 尝试2:通过消息对象属性
    var msg = await channel.send({
      content: "message",
      silent: true, // 无效属性
      is_silent: true, // 无效属性
      ephemeral: true // 这是临时消息(只有发送者可见),与无声消息(所有人可见但无通知)不同
    });

    这些方法并不能实现真正的无声消息,因为 Discord.js 库或 Discord API 没有直接解析这些自定义属性来实现无声效果。

正确实现方式

要发送无声消息,我们需要利用 flags 属性,并将其设置为 [4096]。

const { Client, GatewayIntentBits } = require('discord.js');

// 初始化 Discord 客户端,并声明所需的意图(Intents)
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,        // 访问服务器信息
    GatewayIntentBits.GuildMessages, // 接收服务器消息
    GatewayIntentBits.MessageContent // 访问消息内容 (v13+ 机器人需要此意图)
  ]
});

// 机器人上线事件
client.on('ready', () => {
  console.log(`机器人已登录为 ${client.user.tag}!`);
});

// 接收消息事件
client.on('messageCreate', async message => {
  // 忽略机器人自身发送的消息
  if (message.author.bot) return;

  // 当用户发送 '!send_silent' 命令时
  if (message.content === '!send_silent') {
    try {
      // 在当前频道发送无声消息
      // MessageFlagsBitField.SuppressNotifications 的值为 4096
      const silentMessage = await message.channel.send({
        content: "这是一条无声消息,不会触发通知。",
        flags: [4096] // 关键:设置 flags 属性为 4096
      });
      console.log(`无声消息已发送,ID: ${silentMessage.id}`);
      // 可以在此处回复用户,告知无声消息已发送
      await message.reply('无声消息已成功发送!');
    } catch (error) {
      console.error("发送无声消息失败:", error);
      await message.reply('发送无声消息时发生错误。');
    }
  }
});

// 请替换为您的机器人 token
// client.login('YOUR_BOT_TOKEN');

// 示例:直接在某个频道发送无声消息 (假设您已获取到频道对象)
/*
async function sendSilentMessageToChannel(channel) {
  try {
    const silentMessage = await channel.send({
      content: "这是一条由函数发送的无声消息。",
      flags: [4096]
    });
    console.log(`无声消息已发送到频道 ${channel.name},ID: ${silentMessage.id}`);
  } catch (error) {
    console.error(`向频道 ${channel.name} 发送无声消息失败:`, error);
  }
}
*/

在上述代码中,flags: [4096] 是实现无声消息的关键。4096 这个数值对应着 MessageFlagsBitField.SuppressNotifications。当设置此标志时,Discord 客户端会抑制对该消息的通知,即使消息中包含 @everyone 或 @here 也不会触发通知。

注意事项

  1. 标志值的来源: 4096 这个值是通过对 Discord API 响应进行观察和实验发现的,它对应 MessageFlagsBitField.SuppressNotifications。虽然它目前有效,但并非直接在 Discord.js 官方文档中明确指出用于发送无声消息的 API。这意味着未来 Discord API 更新时,这个值或其行为可能会发生变化。
  2. ephemeral 与 silent 的区别 ephemeral 标志用于发送只有特定用户可见的临时消息,通常用于斜杠命令的回复。而 silent 消息是所有用户可见但不会触发通知的普通消息。两者用途不同,请根据实际需求选择。
  3. 使用场景: 无声消息特别适用于发送后台操作结果、状态更新、不重要的提示或调试信息,以避免打扰用户。例如,机器人完成一项长时间任务后,可以发送一条无声消息告知结果。
  4. 官方支持: 始终关注 Discord.js 的官方更新和文档。如果未来有更官方、更抽象的 API 来发送无声消息,建议优先采用。

总结

通过在 Discord.js 中发送消息时设置 flags: [4096],我们可以有效地发送无声消息,避免不必要的通知。虽然这种方法目前是基于对 Discord API 行为的观察,但它为开发者提供了一个实用的解决方案,以在特定场景下提升用户体验。在实际应用中,请留意 Discord API 的潜在更新,并准备好调整实现方式,以确保功能的持续可用性。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5270

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

218

2023.09.21

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号