mirror of
https://github.com/NaiboWang/EasySpider.git
synced 2025-04-19 23:14:54 +08:00
267 lines
8.8 KiB
JavaScript
267 lines
8.8 KiB
JavaScript
// Modules to control application life and create native browser window
|
|
const { app, BrowserWindow, dialog, ipcMain, screen } = require('electron');
|
|
app.commandLine.appendSwitch("--disable-http-cache");
|
|
const path = require('path');
|
|
const {exec} = require('child_process');
|
|
const iconPath = path.join(__dirname, 'favicon.ico');
|
|
let driverPath = "";
|
|
let chromeBinaryPath = "";
|
|
let execute_path = "";
|
|
if (process.platform === 'win32' || process.platform === 'win64') {
|
|
driverPath = path.join(__dirname, "chrome_win32/chromedriver_win32.exe");
|
|
chromeBinaryPath = path.join(__dirname, "chrome_win32/chrome.exe");
|
|
execute_path = path.join(__dirname, "chrome_win32/execute.bat");
|
|
} else if (process.platform === 'darwin') {
|
|
driverPath = path.join(__dirname, "chromedriver_mac64");
|
|
chromeBinaryPath = path.join(__dirname, "chrome_mac64.app/Contents/MacOS/Google Chrome");
|
|
execute_path = path.join(__dirname, "easyspider_executestage");
|
|
} else if (process.platform === 'linux') {
|
|
driverPath = path.join(__dirname, "chrome_linux64/chromedriver_linux64");
|
|
chromeBinaryPath = path.join(__dirname, "chrome_linux64/chrome");
|
|
execute_path = path.join(__dirname, "chrome_linux64/easyspider_executestage");
|
|
}
|
|
let language = "en";
|
|
let server_address = "https://servicewrapper.systems";
|
|
let driver = null;
|
|
let mainWindow = null;
|
|
let flowchart_window = null;
|
|
|
|
// var ffi = require('ffi-napi');
|
|
// var libm = ffi.Library('libm', {
|
|
// 'ceil': [ 'double', [ 'double' ] ]
|
|
// });
|
|
// libm.ceil(1.5); // 2
|
|
// const {user32FindWindowEx,
|
|
// winspoolGetDefaultPrinter,} = require('win32-api/fun');
|
|
// async function testt(){
|
|
// // 获取当前电脑当前用户默认打印机名
|
|
// const printerName = await winspoolGetDefaultPrinter()
|
|
// console.log(printerName);
|
|
// }
|
|
|
|
// testt();
|
|
|
|
function createWindow() {
|
|
// Create the browser window.
|
|
mainWindow = new BrowserWindow({
|
|
width: 500,
|
|
height: 300,
|
|
webPreferences: {
|
|
preload: path.join(__dirname, 'preload.js')
|
|
},
|
|
icon: iconPath,
|
|
// frame: false, //取消window自带的关闭最小化等
|
|
resizable: false //禁止改变主窗口尺寸
|
|
})
|
|
|
|
// and load the index.html of the app.
|
|
mainWindow.loadFile('src/index.html');
|
|
|
|
// 隐藏菜单栏
|
|
const { Menu } = require('electron');
|
|
Menu.setApplicationMenu(null);
|
|
|
|
// mainWindow.webContents.openDevTools();
|
|
// Open the DevTools.
|
|
// mainWindow.webContents.openDevTools()
|
|
}
|
|
|
|
|
|
function beginInvoke(msg) {
|
|
if (msg.type == 1) {
|
|
if (msg.message.id != -1) {
|
|
let url = "";
|
|
if (language == "zh"){
|
|
url = server_address + `/FlowChart_CN.html?id=${msg.message.id}&backEndAddressServiceWrapper=` + server_address;
|
|
} else if(language == "en"){
|
|
url = server_address + `/FlowChart.html?id=${msg.message.id}&backEndAddressServiceWrapper=` + server_address;
|
|
}
|
|
console.log(url);
|
|
flowchart_window.loadURL(url);
|
|
}
|
|
mainWindow.hide();
|
|
flowchart_window.show();
|
|
const { windowManager } = require("node-window-manager");
|
|
const window = windowManager.getActiveWindow();
|
|
// Prints the currently focused window bounds.
|
|
console.log(window.getBounds());
|
|
// This method has to be called on macOS before changing the window's bounds, otherwise it will throw an error.
|
|
// It will prompt an accessibility permission request dialog, if needed.
|
|
windowManager.requestAccessibility();
|
|
// Sets the active window's bounds.
|
|
let size = screen.getPrimaryDisplay().workAreaSize
|
|
let width = parseInt(size.width)
|
|
let height = parseInt(size.height * 0.6)
|
|
window.setBounds({ x: 0, y: size.height * 0.4, height:height, width:width });
|
|
|
|
} else if (msg.type == 2) {
|
|
//keyboard
|
|
const robot = require("@jitsi/robotjs");
|
|
//TODO 实现全选并删除功能,目前没有
|
|
keyInfo = msg.message.keyboardStr.split("BS}")[1];
|
|
robot.typeString(keyInfo);
|
|
robot.keyTap("shift");
|
|
robot.keyTap("shift");
|
|
} else if (msg.type == 3) {
|
|
try {
|
|
if (msg.from == 0) {
|
|
socket_flowchart.send(msg.message.pipe); //直接把消息转接
|
|
}
|
|
else {
|
|
socket_window.send(msg.message.pipe);
|
|
}
|
|
} catch {
|
|
dialog.showErrorBox("Error", "Please open the flowchart window first");
|
|
}
|
|
} else if (msg.type == 5){
|
|
var child = require('child_process').execFile;
|
|
var parameters = [msg.message.id, server_address];
|
|
|
|
// child('Chrome/easyspider_executestage.exe', parameters, function(err,stdout, stderr) {
|
|
// console.log(stdout);
|
|
// });
|
|
|
|
let spawn = require("child_process").spawn;
|
|
let child_process = spawn(execute_path, parameters);
|
|
child_process.stdout.on('data', function (data) {
|
|
console.log(data.toString());
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
const WebSocket = require('ws');
|
|
let socket_window = null;
|
|
let socket_start = null;
|
|
let socket_flowchart = null;
|
|
var wss = new WebSocket.Server({ port: 8084 });
|
|
wss.on('connection', function (ws) {
|
|
ws.on('message', function (message, isBinary) {
|
|
let msg = JSON.parse(message.toString());
|
|
// console.log(msg, msg.type, msg.message);
|
|
if (msg.type == 0) {
|
|
if (msg.message.id == 0) {
|
|
socket_window = ws;
|
|
console.log("set socket_window")
|
|
}
|
|
else if (msg.message.id == 1) {
|
|
socket_start = ws;
|
|
console.log("set socket_start")
|
|
}
|
|
else if (msg.message.id == 2) {
|
|
socket_flowchart = ws;
|
|
console.log("set socket_flowchart");
|
|
}
|
|
} else {
|
|
beginInvoke(msg);
|
|
}
|
|
});
|
|
});
|
|
|
|
const { Builder, By, Key, until } = require("selenium-webdriver");
|
|
const chrome = require('selenium-webdriver/chrome');
|
|
const { ServiceBuilder } = require('selenium-webdriver/chrome');
|
|
const { rootCertificates } = require('tls');
|
|
const { exit } = require('process');
|
|
const {windowManager} = require("node-window-manager");
|
|
|
|
console.log(process.platform);
|
|
|
|
async function runBrowser(lang="en") {
|
|
const serviceBuilder = new ServiceBuilder(driverPath);
|
|
let options = new chrome.Options();
|
|
language = lang;
|
|
if(lang=="en") {
|
|
options.addExtensions(path.join(__dirname, "EasySpider_en.crx"));
|
|
} else if(lang=="zh") {
|
|
options.addExtensions(path.join(__dirname, "EasySpider_zh.crx"));
|
|
}
|
|
options.setChromeBinaryPath(chromeBinaryPath);
|
|
driver = new Builder()
|
|
.forBrowser('chrome')
|
|
.setChromeOptions(options)
|
|
.setChromeService(serviceBuilder)
|
|
.build();
|
|
try {
|
|
await driver.get(server_address + "/taskList.html?backEndAddressServiceWrapper=" + server_address + "&lang=" + lang);
|
|
} finally {
|
|
// await driver.quit(); // 退出浏览器
|
|
}
|
|
}
|
|
|
|
function handleOpenBrowser(event, lang="en") {
|
|
const webContents = event.sender;
|
|
const win = BrowserWindow.fromWebContents(webContents);
|
|
runBrowser(lang);
|
|
let size = screen.getPrimaryDisplay().workAreaSize;
|
|
let width = parseInt(size.width);
|
|
let height = parseInt(size.height * 0.6);
|
|
flowchart_window = new BrowserWindow({
|
|
x:0,
|
|
y:0,
|
|
width: width,
|
|
height: height,
|
|
icon: iconPath,
|
|
});
|
|
let url = "";
|
|
let id = -1;
|
|
if (lang == "en") {
|
|
url = server_address + `/FlowChart.html?id=${id}&backEndAddressServiceWrapper=` + server_address;
|
|
}else if(lang == "zh") {
|
|
url = server_address + `/FlowChart_CN.html?id=${id}&backEndAddressServiceWrapper=` + server_address;
|
|
}
|
|
// and load the index.html of the app.
|
|
flowchart_window.loadURL(url);
|
|
flowchart_window.hide();
|
|
flowchart_window.on('close', function (event) {
|
|
mainWindow.show();
|
|
});
|
|
}
|
|
|
|
function handleOpenInvoke(event, lang="en"){
|
|
const window = new BrowserWindow({icon: iconPath});
|
|
let url = "";
|
|
language = lang;
|
|
if (lang == "en") {
|
|
url = server_address + `/taskList.html?type=1&backEndAddressServiceWrapper=` + server_address;
|
|
}else if(lang == "zh") {
|
|
url = server_address + `/taskList.html?type=1&backEndAddressServiceWrapper=` + server_address + "&lang=zh";
|
|
}
|
|
// and load the index.html of the app.
|
|
window.loadURL(url);
|
|
window.maximize();
|
|
mainWindow.hide();
|
|
window.on('close', function (event) {
|
|
mainWindow.show();
|
|
});
|
|
}
|
|
|
|
// This method will be called when Electron has finished
|
|
// initialization and is ready to create browser windows.
|
|
// Some APIs can only be used after this event occurs.
|
|
app.whenReady().then(() => {
|
|
ipcMain.on('start-design', handleOpenBrowser);
|
|
ipcMain.on('start-invoke', handleOpenInvoke);
|
|
createWindow();
|
|
|
|
app.on('activate', function () {
|
|
// On macOS it's common to re-create a window in the app when the
|
|
// dock icon is clicked and there are no other windows open.
|
|
if (BrowserWindow.getAllWindows().length === 0){
|
|
createWindow();
|
|
}
|
|
})
|
|
})
|
|
|
|
// Quit when all windows are closed, except on macOS. There, it's common
|
|
// for applications and their menu bar to stay active until the user quits
|
|
// explicitly with Cmd + Q.
|
|
app.on('window-all-closed', function () {
|
|
if (process.platform !== 'darwin'){
|
|
app.quit();
|
|
}
|
|
})
|
|
|
|
// In this file you can include the rest of your app's specific main process
|
|
// code. You can also put them in separate files and require them here.
|