如何从Discord消息URL中获取对应消息的具体内容?
Discord 频道内消息链接自动生成嵌入引用实现
核心实现流程
- 监听消息事件:为Bot绑定
messageCreate事件回调,过滤掉Bot自身发送的消息避免触发循环响应,用正则匹配消息文本中符合格式的Discord站内消息链接,正则捕获组依次提取目标服务器ID、源频道ID、原消息ID三个核心参数。 - 前置校验拉取原消息:先校验Bot是否对源频道持有
查看频道、读取消息历史权限,跨服务器链接如果Bot未加入对应服务器直接跳过;权限校验通过后调用接口拉取源频道实例、再拉取对应ID的原消息完整内容,原消息已删除、拉取报错时直接静默跳过,不发送冗余提示打扰聊天。 - 构造嵌入消息结构:按照原生引用的交互习惯组装Embed对象:
- 作者区域填充原消息发送者的昵称、头像
- 描述区域完整填充原消息的文本内容,原消息附带图片类附件时,将第一张图片补到嵌入的图片展示位
- 页脚标注原消息所属的源频道名称,时间戳对齐原消息的发送时间
- 嵌入侧边色值优先取原消息发送者在服务器内最高身份组的自定义配色,无自定义配色时使用Discord默认品牌蓝
- 嵌入整体绑定原消息的跳转地址,用户点击嵌入即可快速跳转到原消息所在位置
- 发送嵌入内容:构造完成后直接在当前用户发送链接的频道推送嵌入消息即可,同一条消息包含多个有效消息链接时,按匹配顺序逐个拉取生成嵌入发送。
核心代码示例(基于discord.js v14)
// 站内消息链接匹配正则 const discordMsgLinkReg = /https?:\/\/(?:canary\.|ptb\.)?discord\.com\/channels\/(\d+)\/(\d+)\/(\d+)/g; client.on('messageCreate', async (triggerMsg) => { const linkMatches = [...triggerMsg.content.matchAll(discordMsgLinkReg)]; if (!linkMatches.length) return; for (const match of linkMatches) { const [, targetGuildId, sourceChannelId, sourceMsgId] = match; // 只处理当前服务器内的消息链接 if (targetGuildId !== triggerMsg.guild.id) continue; try { const sourceChannel = await client.channels.fetch(sourceChannelId); const sourceMessage = await sourceChannel.messages.fetch(sourceMsgId); // 组装嵌入内容 const quoteEmbed = { author: { name: sourceMessage.author.tag, icon_url: sourceMessage.author.displayAvatarURL({ size: 256 }) }, description: sourceMessage.content, url: sourceMessage.url, footer: { text: `引用自 #${sourceChannel.name}` }, timestamp: sourceMessage.createdAt, color: sourceMessage.member?.displayHexColor || 0x5865F2 }; // 补充原消息内的图片附件 const firstImageAttach = sourceMessage.attachments.find(att => att.contentType?.startsWith('image/')); if (firstImageAttach) { quoteEmbed.image = { url: firstImageAttach.url }; } await triggerMsg.channel.send({ embeds: [quoteEmbed] }); } catch (err) { // 拉取/发送失败时静默跳过,不干扰正常聊天 continue; } } });
注意:不要在嵌入内容里添加多余的Bot标识、推广文案,尽可能对齐官方原生引用的展示样式,减少冗余信息对聊天流的干扰。
内容的提问来源于stack exchange,提问作者Neekh
相关产品推荐
相关产品推荐

