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

使用puppeteer爬取prnt.sc时setInterval触发ERR_INVALID_CALLBACK错误

问题原因&修复方案
  • 你遇到的TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received Promise { <pending> }报错,直接原因是setInterval传参错误:你写的setInterval(llamar(), 2000)中,llamar()是直接调用异步函数,返回的是Promise对象,而setInterval要求第一个参数是待执行的函数引用,不是函数执行后的返回值。

该报错修复方式:去掉llamar后的括号,改为setInterval(llamar, 2000)即可。

其他需要修正的逻辑问题

你的代码还有多处逻辑错误,仅改上述参数依然无法正常运行:

  1. 随机URL生成逻辑错误:原代码循环6次每次都拼接https://prnt.sc/前缀,最终会得到6个域名拼接的无效地址,正确逻辑是先生成6位随机字符串再拼接前缀。
  2. 变量未声明问题:path = Math.random()没有声明关键字,会隐式创建全局变量,存在变量污染风险。
  3. 异步任务堆积风险:爬取、启动浏览器的操作耗时很容易超过2秒,直接用setInterval会导致大量任务堆积,建议改为单任务执行完成后再触发下一次的调度逻辑。

修正后完整可运行代码

const puppeteer = require("puppeteer");
const select = require('puppeteer-select');

async function llamar() {
  const browser = await puppeteer.launch({
    headless: true
  });

  // 修正随机URL生成逻辑
  let text = "https://prnt.sc/";
  const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for (var i = 0; i < 6; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  console.log('当前爬取地址:', text)

  const page = await browser.newPage();
  // 补充变量声明
  const path = Math.random().toString()
  await page.goto(text)
  const element = await select(page).getElement('button:contains(AGREE)');
  await element.click()
  await page.screenshot({
    path: path + '.jpg'
  })

  await browser.close();
  // 单任务执行完成后再触发下一次,避免任务堆积
  setTimeout(llamar, 2000)
}

// 首次触发执行
llamar()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:24:03