我正在为我的firebase云函数使用puppeteer extra。然而,当该功能被触发时,我得到了一个错误,说木偶师不见了,并要求我安装木偶师,而我已经安装了木偶师。我再次尝试安装它,但仍然出现了同样的错误。出了什么问题?
我的函数文件夹的package.json
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
......
},
"engines": {
"node": "8"
},
"dependencies": {
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.1",
"puppeteer": "^5.4.1",
"puppeteer-extra": "^3.1.15",
"puppeteer-extra-plugin-stealth": "^2.6.3"
},
"devDependencies": {
"firebase-functions-test": "^0.2.0"
},
"private": true
}
云功能的开始
const functions = require('firebase-functions');
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
exports.myFunction = functions.https.onCall((data, context) => {
async function XXX() {
try {
const browser = await puppeteer.launch({
headless: false
});
......
}
catch(e) {
......
}
}
}
完整错误消息
Puppeteer is missing. :-)
Note: puppeteer is a peer dependency of puppeteer-extra,
which means you can install your own preferred version.
- To get the latest stable version run: 'yarn add puppeteer' or 'npm i puppeteer'
Alternatively:
- To get puppeteer without the bundled Chromium browser install 'puppeteer-core'
- To use puppeteer-firefox install 'puppeteer-firefox' and use the 'addExtra' export
更新
我更换了
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
带有
const puppeteer = require('puppeteer');
然后我在部署函数时出错。错误消息为
Function failed on loading user code. Error message: Code in file index.js can't be loaded.
Is there a syntax error in your code?
我检查了一下,如果我在不修改代码的任何其他部分的情况下切换回puppeteer extra,部署就可以正常工作。
这几天我遇到了一个非常类似的问题,花了很多时间才意识到错误来自哪里以及如何修复。
我正在做一个node.js项目,并安装了带有yarn的puppeteer来抓取网站,所有这些设置都被放入了一个docker容器中(稍后将在我的回答中解释我为什么提到这一点(。
所以问题和你的完全一样,我得到了一个错误,我错过了木偶师,尽管它已经安装好了。尝试删除node_modules并重新安装,重新创建整个环境等,但似乎都不起作用。
让我松了一口气的解决方案是添加我的package.json
依赖项:
"agent-base": "^6.0.2",
"https-proxy-agent": "^5.0.1",
原因是puppeteer收到错误消息失败,这是一条误导性消息,但它从puppeter/node_modules/https_agent/src/agent.ts文件或类似的命名文件中抛出了一个错误,我不能100%确定文件名。
重要的是https_agent/src不是一个有效的路径,甚至不存在,但https_agent
试图访问该文件,当然失败了。
因此,通过添加agent-base
基本依赖项解决了这个问题,我可以运行我的yarn
命令,直到出现下一个错误。
在代码方面,我在Puppetter的启动函数中添加了一些额外的参数,所以启动看起来像:
await Puppeteer.launch({ headless: true, defaultViewport: null, args: ['--no-sandbox', '--disable-setuid-sandbox'] })
此外,我的进口产品与您在更新答案之前的初始产品一样:
import Puppeteer from 'puppeteer-extra'
import Stealth from 'puppeteer-extra-plugin-stealth'
从那以后,我第一次犯了一个误导性的错误,即整个包都不见了,我在执行木偶师时打开无头浏览器时遇到了问题。解决方案是在我的Dockerfile
中添加这两行:
RUN apk add git netcat-openbsd chromium
ENV PUPPETEER_EXECUTABLE_PATH="/usr/bin/chromium-browser"
之后,我的命令正常运行,添加到crontab中,一切都很顺利。
把我的解决方案放在这里,希望能帮助像我一样遇到同样问题的其他人。花费我大部分时间的最大的事情是puppeteer is missing
的误导性错误,所以我希望我能从另一个和我一样陷入困境的人那里节省一些时间吗。