后台截图Fiori App结果并发送企业微信

发布时间:2026/6/26 6:42:10
后台截图Fiori App结果并发送企业微信 1.使用puppeteer通过launch()方法启动浏览器通过 page.goto 让浏览器加载目标网页通过page.screenshot()将当前页面保存为图片文件2.源代码const puppeteer require(puppeteer); const fs require(fs); const path require(path); const os require(os); // Fiori应用地址 const FIORI_URL http://192.XXX.XX.177/zfi_profit_ex/index.html; // 企业微信相关接口token / 上传 / 推送 const WX_API_BASE http://10.XX.XX.159; // SAP 接口获取推送工号等 const SAP_API_BASE http://192.XXX.XX.XXX:8020; const SAP_BASIC_AUTH Basic Buffer.from(账号:密码).toString(base64); // 日志写入函数 function writeLog(message) { const logPath path.join(__dirname, 1100_month_profit_push.log); const time new Date().toISOString(); fs.appendFileSync(logPath, [${time}] ${message}\n); console.log([${time}] ${message}); } function delay(ms) { return new Promise((resolve) setTimeout(resolve, ms)); } // 根据操作系统确定Chrome路径 function getChromePath() { const platform os.platform(); if (platform win32) { return C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe; } else if (platform linux) { const possiblePaths [ /usr/bin/google-chrome, /usr/bin/google-chrome-stable, /usr/bin/chromium, /usr/bin/chromium-browser, ]; for (const chromePath of possiblePaths) { if (fs.existsSync(chromePath)) { return chromePath; } } return null; } return null; } function getAuthToken() { return fetch(${WX_API_BASE}/common/getToken, { method: GET, headers: { Accept: */*, }, }) .then((response) { if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } return response.text(); }) .then((tokenString) { writeLog(获取 token 成功); return tokenString; }); } function upLoadImage(headers, imageBuffer, imageName) { const formData new FormData(); const blob new Blob([imageBuffer], { type: image/png }); formData.append(file, blob, imageName); return fetch(${WX_API_BASE}/file/wx/upload, { method: POST, headers, body: formData, }) .then((response) response.json()) .then((result) { if (result.code 200) { writeLog(图片上传成功: ${result.data}); return result.data; } throw new Error(result.msg || 上传失败); }); } function sendWx(headers, imageUrl) { const requestHeaders Object.assign({}, headers, { Content-Type: application/json, }); return fetch(${SAP_API_BASE}/zbak_inf?ACTIONGET_WX_WORKCODE, { method: POST, headers: { Content-Type: application/json, Authorization: SAP_BASIC_AUTH, }, body: JSON.stringify({ bukrs: 1100, type: M }), }) .then((response) { if (!response.ok) { throw new Error( 获取推送工号失败(GET_WX_WORKCODE): HTTP ${response.status}, ); } return response.text(); }) .then((oData) { var workcodes JSON.parse(oData).join(,); writeLog(推送工号: ${workcodes}); return fetch(${WX_API_BASE}/message/wx/send, { method: POST, headers: requestHeaders, body: JSON.stringify({ workcodes: workcodes, imageurl: imageUrl, }), }); }) .then((response) { if (!response.ok) { throw new Error(企业微信推送失败(/message/wx/send): HTTP ${response.status}); } return response.json(); }) .then((result) { if (result.code 200) { writeLog(企业微信推送成功); return result; } throw new Error(result.msg || 推送失败); }); } async function waitForProfitCardsLoaded(page) { writeLog(等待 profit card 数据加载...); await page.waitForFunction( () { const core window.sap window.sap.ui window.sap.ui.getCore(); if (!core) { return false; } const gridEl document.querySelector([id$profitCards]); if (!gridEl) { return false; } const gridCtrl core.byId(gridEl.id); if (!gridCtrl) { return false; } const oViewModel gridCtrl.getModel(view); const oCardsModel gridCtrl.getModel(cards); if (!oViewModel || !oCardsModel) { return false; } if (oViewModel.getProperty(/busy) true) { return false; } const aPeriods oViewModel.getProperty(/aPeriods) || []; const aCards oCardsModel.getData() || []; if (!aPeriods.length || aCards.length aPeriods.length) { return false; } const domCards document.querySelectorAll(.zfiProfitMonthCard); if (domCards.length aPeriods.length) { return false; } const iCardsWithData aCards.filter((oCard) oCard.hasData).length; if (iCardsWithData 0) { const chartCount document.querySelectorAll( .zfiProfitMonthCard .sapSuiteRMC, .zfiProfitMonthCard .sapSuiteUiMicrochartRadialMicroChart, ).length; if (chartCount iCardsWithData * 3) { return false; } } return true; }, { timeout: 120000, polling: 500 }, ); writeLog(profit card 数据加载完成); } (async () { const chromePath getChromePath(); const launchOptions { headless: true, args: [ --window-size1440,850, --no-sandbox, --disable-setuid-sandbox, --disable-dev-shm-usage, --disable-gpu, --no-first-run, --no-zygote, --single-process, ], }; if (chromePath) { launchOptions.executablePath chromePath; writeLog(使用 Chrome 路径: ${chromePath}); } else { writeLog(使用 Puppeteer 内置的 Chromium); } const browser await puppeteer.launch(launchOptions); const page await browser.newPage(); await page.setViewport({ width: 1440, height: 850 }); await page.setDefaultTimeout(60000); await page.authenticate({ username: 账号, password: 密码, }); writeLog(已设置 Basic Auth); await page.goto(FIORI_URL, { waitUntil: networkidle2, timeout: 60000, }); writeLog(页面打开成功); writeLog(等待 UI5 应用初始化...); await page.waitForFunction( () window.sap window.sap.ui window.sap.ui.getCore() window.sap.ui.getCore().getComponent, { timeout: 30000 }, ); writeLog(UI5 应用初始化完成); writeLog(查找 page 元素...); let pageElement null; let retryCount 0; const maxRetries 3; while (!pageElement retryCount maxRetries) { try { pageElement await page.waitForSelector([id$page], { timeout: 20000, visible: true, }); writeLog(page 元素加载完成); break; } catch (error) { retryCount; writeLog(第 ${retryCount} 次尝试失败等待 3 秒后重试...); await delay(3000); } } if (!pageElement) { writeLog(ERROR: 无法找到 page 元素保存调试截图); await page.screenshot({ path: path.join(__dirname, debug-page-not-found.png), }); throw new Error(无法找到 page 元素); } await waitForProfitCardsLoaded(page); writeLog(等待微图表渲染完成...); await delay(3000); writeLog(开始截图...); const screenshotBuffer await pageElement.screenshot({ type: png, captureBeyondViewport: true, }); writeLog(截图完成); writeLog(开始上传图片并推送企业微信...); const imageName ${Date.now()}.png; const tokenString await getAuthToken(); const headers { Authorization: Bearer ${tokenString}, }; const imageUrl await upLoadImage(headers, screenshotBuffer, imageName); await sendWx(headers, imageUrl); writeLog(已发送月度运营指标专家分析截图); await delay(2000); writeLog(操作完成); await browser.close(); writeLog(浏览器已关闭); })().catch((error) { writeLog(脚本执行失败: ${error.message}); process.exit(1); });