UNPKG

cadb

Version:

安卓/鸿蒙系统截图/录屏工具

164 lines (152 loc) 4.48 kB
/** * Created by Niki on 2024/8/9 13:32. * Email: m13296644326@163.com */ const program = require('commander'); const {execSync, execFileSync} = require('child_process'); const {shellConfigs, ConsoleColors, logRed} = require('../common/constants'); const { isHarmonyDeviceConnected, getRightFileName, getSystemHomePath, chooseHarmonyRealDeviceId, isAndroidDeviceConnected, chooseAndroidRealDeviceId, isWin, openFileInFinder, hdcPath, adbPath, } = require('../common/utils'); const fs = require('fs'); const packageInfo = require('./../package.json'); const path = require('path'); const os = require('os'); let destDir = `${getSystemHomePath()}/${packageInfo.name}-screenshot/`; if (isWin()) { destDir = path.join(os.homedir(), `${packageInfo.name}-screenshot`); } const prefix = 'aScreenshot'; const regRule = `^${prefix}-(\\d+)`; program .option('-c --clean', 'clean the screenshot directory') .action(arg => { run(arg); }) .parse(process.argv); function run(arg) { const {clean} = arg; if (clean) { // todo 实现清除逻辑 } // 优先检测android设备; todo: 后续可以考虑增加参数, 选择优先端 const consumed = doAndroidScs(); if (!consumed) { console.log('\r\n尝试连接鸿蒙设备'); doHarmonyScs(); } } async function doHarmonyScs() { let dList = isHarmonyDeviceConnected(); if (!dList) { return false; } if (!fs.existsSync(destDir)) { fs.mkdirSync(destDir); } // 拿到一个文件名 const rightFileName = getRightFileName(prefix, destDir, regRule); const realDeviceId = await chooseHarmonyRealDeviceId(dList); // 执行截图 const fullPath = exeHMScs(rightFileName, realDeviceId); openFileInFinder(fullPath); if (!isWin()) { push2Clipboard(fullPath); } return true; } function doAndroidScs() { const dList = isAndroidDeviceConnected(); if (!dList) { return false; } if (!fs.existsSync(destDir)) { fs.mkdirSync(destDir); } // 拿到一个文件名 const rightFileName = getRightFileName(prefix, destDir, regRule); // 执行截图 const fullPath = exeAndroidScs( rightFileName, chooseAndroidRealDeviceId(dList), ); openFileInFinder(fullPath); if (!isWin()) { push2Clipboard(fullPath); } return true; } function exeAndroidScs(imageName, realDeviceCmd = '') { const fullPath = path.join(destDir, `${imageName}.png`); const cmdScreenShot = ['exec-out', 'screencap', '-p']; if (realDeviceCmd) { cmdScreenShot.unshift(...realDeviceCmd.split(' ')); } const result = execFileSync(adbPath, cmdScreenShot, { ...shellConfigs, encoding: 'binary', maxBuffer: 1024 * 1024 * 15, }); fs.writeFileSync(fullPath, result, {encoding: 'binary'}); console.log('\r\nexecute:', `adb ${cmdScreenShot.join(' ')}`); console.log(ConsoleColors.green, '截图文件保存成功:', fullPath); return fullPath; } function exeHMScs(imageName, realDeviceCmd = '') { const fullPath = path.join(destDir, `${imageName}.jpeg`); const cmdScreenShot = [ 'shell', 'snapshot_display', '-f', `/data/local/tmp/${imageName}.jpeg`, ]; if (realDeviceCmd) { cmdScreenShot.unshift(...realDeviceCmd.split(' ')); } let resultHM = execFileSync(hdcPath, cmdScreenShot, shellConfigs); console.log('execute:', `hdc ${cmdScreenShot.join(' ')}`); console.log(resultHM); const cmdPull = ['file', 'recv', `/data/local/tmp/${imageName}.jpeg`]; if (realDeviceCmd) { cmdPull.unshift(...realDeviceCmd.split(' ')); } const resultPull = execFileSync( hdcPath, ['file', 'recv', `/data/local/tmp/${imageName}.jpeg`, fullPath], shellConfigs, ); console.log('execute:', `hdc ${cmdPull.join(' ')}`); console.log(resultPull); console.log('截图文件保存成功:', fullPath); return fullPath; } function push2Clipboard(fullPath) { const copyQSource = '/Applications/CopyQ.app/Contents/MacOS/CopyQ'; if (!fs.existsSync(copyQSource)) { // logRed('检测到CopyQ未安装, 请先安装'); return; } // 每次都打开copyQ应用 const openResult = execSync('open -a CopyQ', shellConfigs); console.log(openResult); try { execSync( `${copyQSource} write image/png - < ${fullPath} && ${copyQSource} select 0`, shellConfigs, ); console.log(ConsoleColors.green, '文件已推入剪切板'); } catch (err) { const {stderr = ''} = err || {}; logRed(stderr); logRed('推入剪切板失败'); } }