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

如何使用Puppeteer对自定义URL页面截图并发送回Discord频道

代码核心错误点

  • 给page.goto()传的url取值错误:message.client是Discord客户端实例,不是你要截图的网页地址,应该从命令参数args里获取用户传入的URL
  • Puppeteer启动缺少必要的环境适配参数,无桌面环境运行时会启动失败,需增加--no-sandbox、--disable-setuid-sandbox等参数
  • 重复调用page.screenshot(),属于无意义的冗余操作
  • 没有错误捕获逻辑,运行报错时无法定位问题
  • 若使用discord.js v14+版本,发送文件的API写法和旧版本不兼容
  • 命令文件内冗余初始化了Discord Client实例,会和主入口的实例冲突

修复后代码

const Discord = require("discord.js");
const fetch = require('node-fetch');
const cheerio = require("cheerio");
const puppeteer = require('puppeteer');

module.exports =  {
  async run(client, message, args) {
    // 校验用户是否传入要截图的URL
    if (!args[0]) return message.channel.send("请传入要截图的网页URL");
    const url = args[0];
    let browser;
    try {
      // 增加环境适配参数避免Puppeteer启动失败
      browser = await puppeteer.launch({
        args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']
      });
      const page = await browser.newPage();
      // 配置页面加载规则,等待网络空闲后再截图避免内容加载不全
      await page.goto(url, {waitUntil: 'networkidle2', timeout: 30000});
      // 直接获取截图Buffer,不需要额外写入本地磁盘
      const screenshot = await page.screenshot();
      await browser.close();
      // 兼容不同版本discord.js的文件发送逻辑
      if (Discord.version.startsWith('14')) {
        await message.channel.send({
          content: "Screenshot",
          files: [screenshot]
        });
      } else {
        await message.channel.send("Screenshot", {files: [screenshot]});
      }
    } catch (err) {
      // 出错时主动关闭浏览器避免进程残留占用资源
      if (browser) await browser.close();
      console.error(err);
      message.channel.send(`截图失败:${err.message}`);
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 18:24:03