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

在discord.js中如何实现URL过滤,使指定链接触发时机器人返回错误

Discord.js 截图机器人URL过滤功能实现方案

实现逻辑

URL过滤逻辑需要放在调用截图API之前执行,避免无意义的接口请求消耗资源。你可以根据自己的需求选择域名匹配、完整URL精确匹配、URL关键词匹配等过滤规则。

具体修改步骤

  1. 先定义禁止访问的规则列表
  2. 新增URL解析和过滤判断逻辑,命中规则直接返回错误
  3. 适配原有的请求逻辑,补全用户输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:04