优化js代码注入

This commit is contained in:
jianxin committed 2025-04-01 09:21:43 +08:00
1 parent d15e8185bb
commit 6ba9ed637b
3 files changed
+176 -64

No files matched your search

+58 -31
View File
@@ -1,36 +1,63 @@
let wpsInstance = null;
function InvokeFromXbot(param) {
let jsonObj = (typeof (param) == 'string' ? JSON.parse(param) : param)
let func = jsonObj.Func;
let args = jsonObj.Args;
args = JSON.parse(args);
console.log(func);
console.log(args);
switch (func) {
case "getDocumentName": {
const doc = wps.WpsApplication().ActiveDocument;
alert(doc.Name);
if (!doc) {
return { currentDoc: null }
}
return { currentDoc: doc.Name }
}
case "evalCode": {
// 1. 注入 WPS 对象
// 2. 执行函数, 获取返回值
let code = args?.code;
console.log("start eval code");
console.log(code);
// var result = eval(code);
// const tmpCode = `return ${code}`; // 为了获取返回值,需要在代码前面加上 return
const result = new Function(code)(); // 执行并获取返回值
console.log(result);
console.log("success eval code");
return { message: "ok", data: result }
}
// 1. 解析参数, 如果不是字符串, 则转换为字符串, 并用json解析, 解析失败直接retrun
if (typeof param !== 'string') {
param = JSON.stringify(param);
}
try {
param = JSON.parse(param);
} catch (e) {
return { msg: '参数解析失败', code: -1 };
}
return { message: "ok" }
// 2. 判断是否有method字段, 如果没有直接return
if (!param.method) {
return { msg: '参数错误', code: -2 };
}
// 3. 获取 method 字段对应的方法和 args 参数
let method = param.method;
let args = null;
try {
args = JSON.parse(param.args);
} catch (e) {
args = {};
}
console.log("method:", method);
console.log("args:", args);
// confsole.log("args", typeof args);
// 4. 判断 method 是否为 inject, 如果是则执行注入方法, 其他走默认方法执行调用函数
if (method === 'inject') {
let code = args.code;
console.log("start eval code");
console.log(code);
console.log(new Function(code)());
wpsInstance = new Function(code)(); // 执行并获取返回值
console.log("success eval code");
return { message: "inject ok", code: 0 }
}
// 5. 判断是否有 wpsInstance, 如果没有直接return
if (!wpsInstance) {
return {msg: '未注入', code: -3};
}
// 6. 判断 wpsInstance 是否有 method 方法, 如果没有直接return
if (!wpsInstance[method]) {
return {msg: '方法不存在', code: -4};
}
// 7. 执行 wpsInstance 的 method 方法, 并返回结果
try {
const result = wpsInstance[method](args ?? null);
return {msg: '执行成功', code: 0, data: result};
} catch (e) {
return {msg: '执行失败', code: -5};
}
}