如何使用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
相关产品推荐
相关产品推荐

