乐趣区

关于puppeteer:Mac-M1arm-系列芯片如何安装-Chromium-Puppeteer

最近写个脚本用到 puppeteer,而后装置 Chromium 呈现一点问题,这里记录一下解决方案。

Puppeteer 主动装置失败

在 Puppeteer 装置时会主动装置 Chromium,然而却总是报错 502 导致下载失败,间接下载能够下载,命令行 wget 也能够,猜想是因为 Puppeteer 开启了新的 process 来装置导致环境变量失落,而后就迷信上网失败了。

这会回头看了看 Puppeteer 的装置脚本,如同能够应用 npm_config_https_proxy 等配置来迷信上网。

function overrideProxy() {
    // Override current environment proxy settings with npm configuration, if any.
    const NPM_HTTPS_PROXY = process.env['npm_config_https_proxy'] || process.env['npm_config_proxy'];
    const NPM_HTTP_PROXY = process.env['npm_config_http_proxy'] || process.env['npm_config_proxy'];
    const NPM_NO_PROXY = process.env['npm_config_no_proxy'];
    if (NPM_HTTPS_PROXY) {process.env['HTTPS_PROXY'] = NPM_HTTPS_PROXY;
    }
    if (NPM_HTTP_PROXY) {process.env['HTTP_PROXY'] = NPM_HTTP_PROXY;
    }
    if (NPM_NO_PROXY) {process.env['NO_PROXY'] = NPM_NO_PROXY;
    }
}

不过过后没看就间接打算手动装置 Chromium 了,要手动装置在装置 Puppeteer 时须要先敞开主动下载:

PUPPETEER_SKIP_DOWNLOAD='true' pnpm add puppeteer

这样就能够跳过 Puppeteer 中主动的 Chromium 装置。

手动装置 Chromium

失败尝试

手动装置首先是应用了 homebrew 的形式,然而因为之前玩 Stable Diffusion 一些依赖包的兼容问题,我的 homebrew 切到了 x86 版本,所以装置后的是 intel 芯片版本的 Chromium,导致无奈关上,关上就会显示弹窗:

You can’t open the application“Chromium”because this application is not supported on this Mac.

无奈就去官网:https://download-chromium.appspot.com/ 手动下载,后果不成想官网挂的也是 intel 版本:

不死心的下载试了一下,果然不行。

胜利装置

而后无奈的搜了一下,发现了这个问题:https://stackoverflow.com/questions/66002337/is-the-homebrew-chromium-m1-optimised,其中提及到 homebrew 中装置的脚本:

 arch = Hardware::CPU.intel? ? "Mac" : "Mac_Arm"
 ...
 url "https://commondatastorage.googleapis.com/chromium-browser-snapshots/#{arch}/#{version}/chrome-mac.zip

原来只须要将地址中的架构类型变更更换为想要的版本就能够了。

而官网对应的下载地址是:https://download-chromium.appspot.com/dl/Mac?type=snapshots,所以我将其中的 Mac 替换为 Mac_Arm 失去如下地址:https://download-chromium.appspot.com/dl/Mac_Arm?type=snapshots,关上果然胜利下载了。

下载实现后解压,就拿到了 Arm 版本的 Chromium。然而关上时又呈现了新的问题:

Chromium is damaged and can't be opened. You should move it to the Trash.

遇到这个报错必须要移除对应的验证:

xattr -c /Applications/Chromium.app

好了,终于能够关上了,可喜可贺。

API Keys missing

然而当我关上后又发现 Chromium 上飘着一行提醒:

Google API Keys are missing. Some functionality of chromium will be disabled.

不过此时的 Chromium 曾经能够失常应用了,然而子已经曰过:“遇到问题不能坐以待毙”,还是解决下好了。

查了一下起因是 Chromium 的一些性能如 Google 账号同步等等须要应用 Google API Keys,要解决这个提醒大体是两种思路:

  1. 能够抉择禁用这个提醒,然而这样 Chromium 的一些性能也就无奈应用了。
  2. 申请 Google API keys,并填入。

如果想要禁用提醒能够编辑 Chromium.app > Contents > Info.plist 文件并增加以下内容:

<key>LSEnvironment</key>
<dict>
    <key>GOOGLE_API_KEY</key>
    <string>no</string>
    <key>GOOGLE_DEFAULT_CLIENT_ID</key>
    <string>no</string>
    <key>GOOGLE_DEFAULT_CLIENT_SECRET</key>
    <string>no</string>
</dict>

而如果想要填入 Google API Keys 则须要去 Google Cloud 申请 API Keys,具体的流程能够参考:https://www.chromium.org/developers/how-tos/api-keys/#acquiri…

还有一种办法就是间接应用网上流出的 API Keys,比方这个:

export GOOGLE_API_KEY="AIzaSyCkfPOPZXDKNn8hhgu3JrA62wIgC93d44k"
export GOOGLE_DEFAULT_CLIENT_ID="811574891467.apps.googleusercontent.com"
export GOOGLE_DEFAULT_CLIENT_SECRET="kdloedMFGdGla2P1zacGjAQh"

在 bash 执行上述代码将 API Keys 设置到环境变量重启 Chromium 即可失效。

然而肯定须要留神 ⚠️: 应用了 API Keys 可能会导致数据信息透露问题,所以如果有敏感信息切勿应用别人提供的 Key!!!

在 Puppeteer 中应用

因为 Chromium 不是由 Puppeteer 装置的,所以 Puppeteer 会找不到 Chromium 地位,须要在 Puppeteer 的配置文件中增加 executablePath 来指定 Chromium 的地位:

const {join} = require('path');

/**
 * @type {import("puppeteer").Configuration}
 */
module.exports = {
    // Changes the cache location for Puppeteer.
    cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    executablePath: '/Applications/Chromium.app/Contents/MacOS/Chromium'
};

参考资料

  • https://stackoverflow.com/questions/66002337/is-the-homebrew-chromium-m1-optimised
  • https://stackoverflow.com/questions/21276763/google-api-keys-missing-warning-message-when-using-chromium-portable
  • https://groups.google.com/a/chromium.org/g/chromium-dev/c/cTP…
  • https://www.chromium.org/developers/how-tos/api-keys/#acquiri…
退出移动版