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
相关产品推荐
相关产品推荐

