puppeteer在centos6.x版本的尝试

写在前面的话

博客和生活一样,都是需要用心经营的,我把博客丢掉两年多,总是对自己讲,实在是太忙没时间写,可真的吗?不是这样,时间还是能够挤出来的,懒惰才是根本原因,人一旦变懒,会在方方面面表现出,会慢慢变成一种习惯。2019年坚持锻炼一年,效果还算不错,然后疫情来了,emmm....是时候拿出真正的技术啦!

为什么会写这篇文章,实在是在实践过程中躺了许多坑,帮助那些还在迷茫途中的小朋友指引下明灯,希望能够帮到正在看文章的你。先把结论抛给大家,CentOS 6不支持安装puppeteer。

 =================================== 可爱的分割线 ===================================

本机环境测试,macOS Catalina + node v12.16.1 + npm 6.13.4 安装puppeteer构建可用的导出pdf服务,没有问题,完全可用【在导出过程中发现pdf窗口viewport不对情况,可通过设置puppeteer.launch({defaultViewport: null})解决】

我们的重点是什么?构建导出pdf服务,服务器环境CentOS 6.3 Final版本,不支持连接外网。所以初步方案是通过编写shell脚本部署,编写脚本前,需要校验环境是否可行,是否能够支持正常的导出pdf文件,所以我们选择先手动尝试安装。

我们漫长虐心的实践开始了。

1.先和厂内同学沟通,了解到CentOS 6不支持安装puppeteer,具体卡在libxxxx.so包的安装上,出于对事情的好奇,决定还是践行一下。

2.下载Linux系统所需要的文件包,地址从哪里来?可以看下本机mac安装的node_modules文件中puppeteer代码。

a.找到xxxx/node_modules/puppeteer/lib/BrowserFetcher.js文件 (当前使用[email protected]版本)

b.linux平台下载地址

%s/chromium-browser-snapshots/Linux_x64/%d/%s.zip

其中

第一个%s替换为DEFAULT_DOWNLOAD_HOST的值

%d替换为版本号(node_modules/puppeteer-core/packages.json中查找)

最后的%s从函数archiveName中获取,为'chrome-linux'

整体最后的url为 https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/722234/chrome-linux.zip

3.把chrome-linux.zip文件传输到服务器上(自行处理,我使用的是sz/rz命令)

4.unzip解压缩,手动存储到

/node_modules/puppeteer/.local-chromium/linux-722234/

.local-chromium/linux-722234/ 这两层目录为手动创建,722234是版本号,步骤2中的%d值

不同平台对应的目录名称不同,比如mac 就是mac-722234

5.写一个简单的测试脚本,如下,命名为test.js

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.baidu.com');
    await page.screenshot({path: 'example.png'});
    await browser.close();
})();

6.node test,很不顺利,会出现如下错误

xxxxPromiseRejectionWarning: Error: Failed to launch the browser process!
xxxx/node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such xxxx

缺少Chrome程序正常运行的共享库,通过命令查找源

repoquery --nvr --whatprovides libXss.so.1

结果为:

libXScrnSaver-1.2.0-1.el6

此时,通过yum install libXScrnSaver* 安装解决。

然后,再次node test,发现还有错误,这样下去会比较烦躁,我们应该从根本上看看Chrome程序运行到底还缺少哪些文件

7.执行如下命令,首先进到Chrome程序目录

> cd node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux
> ldd chrome | grep not

得到类似于如下内容的结果:

libatk-bridge-2.0.so.0 => not found
libatspi.so.0 => not found
libgtk-3.so.0 => not found
libgdk-3.so.0 => not found

重点来了,查找资料发现libatk-bridge-2.0.so.0在CentOS6.x环境不支持,必须升级到CentOS 7.x版本

原文地址

关键内容如图:

来自官方声明,翻译为人话就是,升级到CentOS7或者使用FF ESR

8.怎么办?不使用FF,可以升级CentOS到7.5,那就好办了

解决方案:使用docker镜像node 10.x + CentOS 7.5 环境,然后手动安装chrome-linux,还是需要解决xxxx.so的各种问题,校验。

成功导出example.png

 

 =================================== 可爱的分割线 ===================================

写在末尾

前前后后花费几天时间,包含部署,打镜像,解决问题,安装程序,调试环境,测试脚本,写总结,关键这几天是多余出来的工作量,这是叫人不爽的地方。编写puppeteer脚本本身,遇到viewport尺寸问题,pdf怎么导出部分内容,如何去白边,加层级,这些属于工作本身,可以接受。最终掉坑到环境部署上,有些尴尬。

 

为什么没提前发现问题呢?

1.对服务器基础设备环境能力过于高估判断;

2.没有考虑过这个问题;

全文结束,感谢您的耐心阅读,有什么问题,留言。

 

你可能感兴趣的:(linux,javascript,puppeteer)