在discord.js中如何实现URL过滤,使指定链接触发时机器人返回错误
Discord.js 截图机器人URL过滤功能实现方案
实现逻辑
URL过滤逻辑需要放在调用截图API之前执行,避免无意义的接口请求消耗资源。你可以根据自己的需求选择域名匹配、完整URL精确匹配、URL关键词匹配等过滤规则。
具体修改步骤
- 先定义禁止访问的规则列表
- 新增URL解析和过滤判断逻辑,命中规则直接返回错误
- 适配原有的请求逻辑,补全用户输入URL可能缺失的协议前缀,避免解析错误
修改后完整代码
// 自定义禁止域名列表,可根据需求增删 const BLOCKED_DOMAINS = ['example.com', 'test.com', 'banned-site.org']; // 若需要精确匹配完整URL可启用该变量 // const BLOCKED_URLS = ['https://example.com/specific-page'] // 检查用户是否输入内容 if (args.length === 0) return message.channel.send({ embed: { color: config.embedcolor, title: "Please provide a valid URL!" } }) // 处理用户输入的URL,补全协议前缀 let inputUrl = args.join(" "); if (!inputUrl.startsWith('http://') && !inputUrl.startsWith('https://')) { inputUrl = 'https://' + inputUrl; } // URL合法性校验+过滤逻辑 try { const parsedUrl = new URL(inputUrl); // 域名过滤判断 if (BLOCKED_DOMAINS.includes(parsedUrl.hostname)) { return message.channel.send({ embed: { color: config.embedcolor, title: "❌ 该链接属于禁止访问范围,无法生成截图" } }) } // 若需要精确匹配URL,替换上面的判断逻辑即可 // if (BLOCKED_URLS.includes(inputUrl)) { // return message.channel.send({ // embed: { // color: config.embedcolor, // title: "❌ 该链接属于禁止访问范围,无法生成截图" // } // }) // } // 若需要URL关键词过滤,使用以下逻辑 // if (inputUrl.includes('违禁关键词')) { // return 同上错误 // } } catch (err) { // URL解析失败说明格式非法 return message.channel.send({ embed: { color: config.embedcolor, title: "请提供合法的URL格式!" } }) } // 调用截图API const body = await fetch(`https://shot.screenshotapi.net/screenshot?&url=${encodeURIComponent(inputUrl)}&fresh=true&output=json&file_type=png&wait_for_event=load`) .then(res => res.json().catch(() => { })); if (!body) return message.channel.send({ embed: { color: config.embedcolor, title: "❌ Error" } }) if (body.error) return message.channel.send({ embed: { color: config.embedcolor, title: "❌ Error URL not found" } }); const embed = new MessageEmbed() .setTitle(`🌐 ${body.url} `) .setColor(config.embedcolor) .setTimestamp() .setFooter("https://cdn.discordapp.com/attachments/725019921159028808/739770316754256012/Screenshot_20200803-1459592.png") .setImage(`${body.screenshot}`) message.channel.send(embed);
扩展说明
如果需要更灵活的过滤规则,比如匹配所有二级域名、正则匹配URL规则,直接修改过滤判断部分的逻辑即可。
内容的提问来源于stack exchange,提问作者Faris Daffa
相关产品推荐
相关产品推荐

