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

discord.js中如何实现两张图片是否相同的校验功能?

解决方案

核心思路

同一张图片的二进制内容是固定的,我们可以通过对比图片内容的哈希值来判断是否为同一张图片,不受Discord生成的临时CDN链接影响。你之前的方法失效的原因是Discord每次上传相同文件都会生成独立的CDN链接,直接对比attachment属性本质是对比临时链接,自然无法匹配。

实现步骤

  • 首先计算你要校验的基准图片的哈希值(推荐用MD5或SHA256,这里以MD5为例),提前存为常量
  • 收到用户消息后,先判断是否存在图片类型的附件
  • 下载附件的二进制内容,计算其哈希值,和提前存储的基准哈希对比即可

代码示例

首先安装请求库用来下载图片内容,以axios为例:

npm install axios

完整实现代码:

const axios = require('axios');
const crypto = require('crypto');
// 替换为你自己计算得到的基准图片MD5哈希值
const TARGET_IMAGE_MD5 = '替换为实际的基准图片MD5';

// 计算Buffer的MD5哈希的工具函数
function getMd5FromBuffer(buffer) {
    return crypto.createHash('md5').update(buffer).digest('hex');
}

// 消息监听逻辑
client.on('messageCreate', async msg => {
    // 跳过机器人自身发送的消息
    if (msg.author.bot) return;
    // 无附件直接返回
    if (msg.attachments.size === 0) return;

    const attachment = msg.attachments.first();
    // 判断是否为图片类型,可根据需求调整允许的后缀
    const isImage = /\.(png|jpg|jpeg|gif|webp)$/i.test(attachment.name);
    if (!isImage) return;

    try {
        // 下载图片二进制内容
        const res = await axios.get(attachment.url, { responseType: 'arraybuffer' });
        const imageBuffer = Buffer.from(res.data);
        // 计算当前图片哈希
        const currentMd5 = getMd5FromBuffer(imageBuffer);
        // 和基准哈希对比
        if (currentMd5 === TARGET_IMAGE_MD5) {
            msg.channel.send("Same photo is sent");
            // 其他自定义逻辑
        }
    } catch (err) {
        console.error('图片下载或哈希计算失败', err);
    }
});

获取基准图片MD5的方法

你可以运行临时代码计算你指定的基准图片的MD5,拿到值后替换上面的常量即可:

// 若基准图片在本地
const fs = require('fs');
const buffer = fs.readFileSync('本地基准图片的路径.png');
console.log(getMd5FromBuffer(buffer));

// 若基准图片是线上链接
axios.get('你的基准图片链接', { responseType: 'arraybuffer' }).then(res => {
    const buffer = Buffer.from(res.data);
    console.log(getMd5FromBuffer(buffer));
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 09:45:00