【截图服务 +打包】pkg打包 puppeteer

目录

最后结论

windows打包成服务 

定制executablePath 

用程序来查找chrome.exe 代替上面的写配置文件

服务遇到的问题

 使用java开一个线程启动

遇到的问题与解决

版本匹配问题

打出包后的运行报错问题

linux下的安装

安装n

库缺少

程序运行后的报错

制作

运行报错与修改后成功

方式二chromedrive

实验数据

参考文档


最后结论

pkg -t win --public ./screenshots.js --output ./dist/screen.exe

服务启动:

postman调用 : 

windows打包成服务 

  

D:\web-video-platform\nssm.exe install wvp-screen  "D:\web-video-platform\chrome\screen"
rem D:\web-video-platform\nssm.exe set wvp-screen AppDirectory "D:\web-video-platform\chrome"
D:\web-video-platform\nssm.exe start wvp-screen

定制executablePath 

{"executablePath": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
}

使用方法 

const config2 = require("D:\\web-video-platform\\chrome\\puppeteer.config.json");

let chromePath = await findChromePath(winreg.HKLM,'\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe',"Path");chromePath = chromePath+ "\\chrome.exe";logStream.write(`I  should have it here :${chromePath}\n`);

用程序来查找chrome.exe 代替上面的写配置文件

   可以灵活根据每台主机本身的情况

async function findChromePath(myhive,mykey,myvalue) {const chromeKey = new winreg({hive: myhive,//winreg.HKLM,key: mykey,//'\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe'});try {const result = await new Promise((resolve, reject) => {chromeKey.get(myvalue, (err, result) => {if (err) {reject(err);} else {resolve(result);}});});console.log(result.value);return result.value ;} catch (err) {console.error('Chrome installation path not found in registry.');return null;}
}

服务遇到的问题

    会找不着系统默认的chrome位置 

    会有时候截图是空

 使用java开一个线程启动

     会截图几次后服务死掉

遇到的问题与解决

版本匹配问题

pkg 这里说的是v3.5,实际装的是5.8.1,没有关系;可以向下兼容。

但node 18.15.0以上的就没有能与pkg相匹配相适应 的, 所以只能选 这个 。

node,21 ,19.8.1 在工程里都试过了,工程本身可以,但pkg进行打包时,说明pkg没有找到能匹配 》19版本的实现,所以,只能选  18.15.0 

打出包后的运行报错问题

 如下解决nodejs + pkg+ puppeteer 路径问题以及 Passed function is not well-serializable 问题_passed function cannot be serialized!-CSDN博客

linux下的安装

安装n

由于gcc没有装,先装gcc ;然后再装glibc23 

linux文件版本管理,Linux下使用n来管理多版本NodeJS-CSDN博客

库缺少

 /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ../../bin/xxx)
 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ../../bin/xxx)
————————————————

            Error: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found-CSDN博客 

因为已经安装了gcc 9.x的版本,所以找找就好

# 查询本机的so库
find / -name "libstdc++.so.*"

cp /usr/local/gcc/...../libstdc++.so.6.0.28 /usr/lib64

ln -snf ./libstdc++.so.6.0.28 ./libstdc++.so.6

程序运行后的报错

Error: Failed to launch the browser process! /root/.cache/puppeteer/chrome/linux-123.0.6312.58/chrom

centos puppeteer问题汇总_missing x server or $display-CSDN博客

制作

pkg -t linux --public ./screenshots.js --output ./dist/screen

运行报错与修改后成功

如果 没有装浏览器,会报错

Error: Failed to launch the browser process! /root/.cache/puppeteer/chrome/l

我们直接装下chrome 

成功! 

地址 10.60.100.194: /home/java/mesh/screen/dist

方式二chromedrive

需要: chromedrive.exe 及版本号与之完全对应的chrome

这会导致安装包很大。

如下的方式,没有做成服务,每次调用都要调动chrome,耗费几秒;应该把chrome启动后,作为服务,一直放着。

public static void main(String[] args) throws Exception {// String path = "E:\\chromes\\107\\App\\Chrome-bin\\chrome.exe";// System.setProperty("webdriver.chrome.bin", path);System.setProperty("webdriver.chrome.driver","chromedriver.exe");ChromeOptions options = new ChromeOptions();// options.setBinary(path);options.addArguments("--headless");  //无界面模式options.addArguments("--disable-gpu");  // headless模式下,windows系统可能需要options.addArguments("--window-size=1920,1080");  //缺少此配置,headless模式可能点击不到元素options.addArguments("--remote-allow-origins=*");options.addArguments("--start-maximized");  //启动时最大化窗口WebDriver webDriver = new ChromeDriver(options);String url = "https://www.baidu.com/";
//        String url = "http://localhost:6767/#/wvp/alarmScreenShotMap?lnglat=121.449333,31.025822";webDriver.get(url);webDriver.manage().window().maximize();Thread.sleep(8000);WebElement element = webDriver.findElement(By.id("containerForShot"));File screenshotFile = ((TakesScreenshot) element).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(screenshotFile, new File("static/shot/test.png"));webDriver.quit();}

实验数据

   性能 :只启动了一个browse

    内存500M (感觉 有点多)

参考文档

nodejs + pkg+ puppeteer 路径问题以及 Passed function is not well-serializable 问题_passed function cannot be serialized!-CSDN博客

#打包 #exe #pkg 使用 pkg 将 nodejs 打包编译为 exe_pkg打包nodejs-CSDN博客

Releases · vercel/pkg-fetch (github.com)

主要是这个工程参考

netwild/screenshots: A small tool based on Nodejs environment, using Puppeter to take full screen screenshots of any webpage (github.com)

安装n需要的更新 :

升级glibc (gcc make等)

 CentOS上升级glibc2.17至glibc2.31_glibc 升级-CSDN博客

Chrome浏览器版本和chromedriver兼容对照_chromedriver版本对应-CSDN博客

Release 109.0.5414.120 · ulixee/chrome-versions (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

化工机械如何精准地进行网络营销推广?

合作咨询联系竑图 hongtu201988 化工机械行业该如何做网络推广,让销量和利润都有明显的提升呢?湖南竑图网络来为大家分析分析: 一、产品的用户是谁? 在传统行业中,用户群体的多样性不容忽视。比如机械设备有很多种&am…

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果&#xff1a; 解密后的数据就是正常数据&#xff1a; 后端&#xff1a;使用的是spring-cloud框架&#xff0c;在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30…

Kamailio-超强dispatcher负载均衡模块

Kamailio 负载均衡的功能主要依靠 Dispatcher 模块完成&#xff0c;模块官方文档参看 为什么要引入负载均衡&#xff1f;如何使用&#xff1f; 引入和配置功能路由调用命令行指令 为什么要引入负载均衡&#xff1f; Q: 如果单台VOIP服务的性能不能满足业务需求了&#xff0…

C++中的I/O流

本节主要看代码理解 I/O流继承关系 iostream 主要类 cin cout cerr clog while&#xff08;cin>>str&#xff09; &#xff5b; //处理 &#xff5d; 当接收ctrl z 或 ctrl c时&#xff0c;会停止&#xff0c; 原理&#xff1a;重载操作符bool&#xff0c;令指定istr…

Meta:大语言模型可以通过自我批判取得大幅提升!

夕小瑶科技说 原创 作者 | 谢年年 论文的审稿模式想必大家都不会陌生&#xff0c;一篇论文除了分配多个评审&#xff0c;最后还将由PC综合评估各位审稿人的reviews撰写meta-review。 最近&#xff0c;来自Meta的研究团队将这一模式引进到大模型的对齐训练中。模型同时扮演 执…

poker (GuanDan)

poker &#xff08;GuanDan&#xff09; 掼蛋 基础比大小规则: ①单牌 2最小与以往不太一样&#xff08;2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A < Joker&#xff09; 如果本级打9&#xff0c;那么9就比A大&#xff0c;…

安装Anaconda(过程)

Anaconda是一个开源的Python发行版本&#xff0c;用来管理Python相关的包&#xff0c;安装Anaconda可以很方便的切换不同的环境&#xff0c;使用不同的深度学习框架开发项目&#xff0c;本文将详细介绍Anaconda的安装。 一、安装 1、安装方式 官网&#xff1a;“https://www.…

JVM - GC垃圾回收

文章目录 目录 文章目录 1. 自动垃圾回收 1.1 垃圾回收区域 2. 方法区回收 3. 堆回收 3.1 对象已死&#xff1f; 3.1.1 引用计数算法 3.1.2 可达性分析算法 3.1.3 再谈引用 强引用 软引用 弱引用 虚引用 3.2 垃圾收集算法 3.2.1 分代收集理论 3.2.2 垃圾回收算…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; …

【Vue3】自动化路由配置:Vue3与unplugin-vue-router的完美结合

引言 在Vue3项目中&#xff0c;路由管理是构建复杂应用不可或缺的一部分。传统上&#xff0c;手动编写路由配置既繁琐又容易出错。本文将介绍如何利用unplugin-vue-router插件&#xff0c;实现Vue3项目的自动化路由配置&#xff0c;从而提升开发效率和准确性。 unplugin-vue-…

基于SpringBoot+Vue+MySQL的考研互助交流平台

系统展示 用户前台界面 管理员后台界面 系统背景 本文设计并实现了一个基于SpringBoot、Vue.js和MySQL的考研互助交流平台。该平台旨在为广大考研学子提供一个集资源共享、学习交流、经验分享、心理辅导等功能于一体的综合性在线社区。通过SpringBoot构建高效稳定的后端服务&am…

轻松实现游戏串流,内网穿透

一、部署Gemini Gemini使用教程 二、部署Moonlight 过程大概说一下&#xff0c;网上有太多太多moonlight的东西了 需要运行游戏的机器上安装GFE&#xff08;GeForce Experience&#xff09;&#xff0c;登录并开启GAMESTREAM&#xff08;游戏串流&#xff09;功能 注&…

网络安全 L2 Introduction to Cryptography 密码学

Definitions 1. crypto - hidden/secret grafia - writing 2. “the science and study of secret writing” 3. Cryptography is the science of protecting data, which provides means of converting data into unreadable form, so that 1. the data cannot be ac…

vue + Element UI table动态合并单元格

一、功能需求 1、根据名称相同的合并工作阶段和主要任务合并这两列&#xff0c;但主要任务内容一样&#xff0c;但要考虑主要任务一样&#xff0c;但工作阶段不一样的情况。&#xff08;枞向合并&#xff09; 2、落实情况里的定量内容和定性内容值一样则合并。&#xff08;横向…

9.11 QT ( Day 4)

一、作业 1.Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器类 #include <QTime> #include <QtTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…

杨氏矩阵中查找某个数字是否存在(不能使用遍历)

杨氏矩阵&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的 如图所示&#xff1a; i为行&#xff0c;j为列 如果要找9&#xff0c;先从arr【0】【2】处开始找&#xff0c;3<9,i,排除第一行&#xff0c;6<9,i,排除第…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…

B-树底层原理

一、B-树介绍 定义&#xff1a; B-树&#xff08;B-Tree&#xff09;是一种自平衡的树形数据结构&#xff0c;广泛应用于数据库和操作系统中。它的设计目标是减少搜索、顺序访问、插入和删除操作中比较次数和移动次数&#xff0c;特别适合于磁盘中数据的存储和检索。 性质&a…

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1&#xff08;高级消息队列协议&#xff09;是一种网络协议&#xff0c;它允许遵从该协议的客户端&#xff08;Publisher或者Consumer&#xff09;应用程序与遵从该协议的消息中间件代理&#xff08;Broker&#xff0c;如RabbitMQ&#xff09;…