Input Function Update and extension bug fix

This commit is contained in:
naibo 2023-03-24 22:21:46 +08:00
parent bbccc26ce7
commit 8a404eecf4
16 changed files with 546 additions and 401 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
{"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data","absolute_user_data_folder":"C:\\Users\\Naibo\\Desktop\\EasySpider\\ElectronJS\\user_data"} {"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data","absolute_user_data_folder":"D:\\Documents\\Projects\\EasySpider\\ElectronJS\\user_data"}

View File

@ -46,6 +46,9 @@ let language = "en";
let driver = null; let driver = null;
let mainWindow = null; let mainWindow = null;
let flowchart_window = null; let flowchart_window = null;
let current_handle = null;
let old_handles = [];
let handle_pairs = {};
// var ffi = require('ffi-napi'); // var ffi = require('ffi-napi');
// var libm = ffi.Library('libm', { // var libm = ffi.Library('libm', {
@ -92,7 +95,7 @@ function createWindow() {
} }
function beginInvoke(msg) { async function beginInvoke(msg) {
if (msg.type == 1) { if (msg.type == 1) {
if (msg.message.id != -1) { if (msg.message.id != -1) {
let url = ""; let url = "";
@ -124,7 +127,53 @@ function beginInvoke(msg) {
//keyboard //keyboard
// const robot = require("@jitsi/robotjs"); // const robot = require("@jitsi/robotjs");
let keyInfo = msg.message.keyboardStr; let keyInfo = msg.message.keyboardStr;
driver.findElement(By.xpath(msg.message.xpath)).sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo); let handles = await driver.getAllWindowHandles();
console.log("handles", handles);
let exit = false;
let content_handle = handle_pairs[msg.message.id];
console.log(msg.message.id, content_handle);
let order = [...handles.filter(handle => handle != current_handle && handle != content_handle), current_handle, content_handle]; //搜索顺序
let len = order.length;
while (true) {
// console.log("handles");
try{
let h = order[len - 1];
console.log("current_handle", current_handle);
if(h != null && handles.includes(h)){
await driver.switchTo().window(h);
current_handle = h;
console.log("switch to handle: ", h);
}
// await driver.executeScript("window.stop();");
// console.log("executeScript");
let element = await driver.findElement(By.xpath(msg.message.xpath));
console.log("Find Element at handle: ", current_handle);
await element.sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
console.log("send key");
break;
} catch (error) {
console.log("len", len);
len = len - 1;
if (len == 0) {
break;
}
}
// .then(function (element) {
// console.log("element", element, handles);
// element.sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
// exit = true;
// }, function (error) {
// console.log("error", error);
// len = len - 1;
// if (len == 0) {
// exit = true;
// }
// }
// );
}
// let handles = driver.getAllWindowHandles();
// driver.switchTo().window(handles[handles.length - 1]);
// driver.findElement(By.xpath(msg.message.xpath)).sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
// robot.keyTap("a", "control"); // robot.keyTap("a", "control");
// robot.keyTap("backspace"); // robot.keyTap("backspace");
// robot.typeString(keyInfo); // robot.typeString(keyInfo);
@ -134,8 +183,18 @@ function beginInvoke(msg) {
try { try {
if (msg.from == 0) { if (msg.from == 0) {
socket_flowchart.send(msg.message.pipe); //直接把消息转接 socket_flowchart.send(msg.message.pipe); //直接把消息转接
let message = JSON.parse(msg.message.pipe);
let type = message.type;
if(type.indexOf("Click")>=0){
await new Promise(resolve => setTimeout(resolve, 2000)); //等两秒
let handles = await driver.getAllWindowHandles();
if(arrayDifference(handles, old_handles).length > 0){
old_handles = handles;
current_handle = handles[handles.length - 1];
console.log("New tab opened, change current_handle to: ", current_handle);
} }
else { }
} else {
socket_window.send(msg.message.pipe); socket_window.send(msg.message.pipe);
} }
} catch { } catch {
@ -172,26 +231,38 @@ const WebSocket = require('ws');
let socket_window = null; let socket_window = null;
let socket_start = null; let socket_start = null;
let socket_flowchart = null; let socket_flowchart = null;
var wss = new WebSocket.Server({ port: websocket_port }); let wss = new WebSocket.Server({port: websocket_port});
wss.on('connection', function (ws) { wss.on('connection', function (ws) {
ws.on('message', function (message, isBinary) { ws.on('message', async function (message, isBinary) {
let msg = JSON.parse(message.toString()); let msg = JSON.parse(message.toString());
// console.log(msg, msg.type, msg.message); // console.log(msg, msg.type, msg.message);
if (msg.type == 0) { if (msg.type == 0) {
if (msg.message.id == 0) { if (msg.message.id == 0) {
socket_window = ws; socket_window = ws;
console.log("set socket_window") console.log("set socket_window")
} } else if (msg.message.id == 1) {
else if (msg.message.id == 1) {
socket_start = ws; socket_start = ws;
console.log("set socket_start") console.log("set socket_start")
} } else if (msg.message.id == 2) {
else if (msg.message.id == 2) {
socket_flowchart = ws; socket_flowchart = ws;
console.log("set socket_flowchart"); console.log("set socket_flowchart");
}
} else{ } else{
beginInvoke(msg); await new Promise(resolve => setTimeout(resolve, 2300));
handle_pairs[msg.message.id] = current_handle;
console.log("Set handle_pair for id: ", msg.message.id, " to ", current_handle);
// console.log("handle_pairs: ", handle_pairs);
}
} else if (msg.type == 10) {
let leave_handle = handle_pairs[msg.message.id];
if (leave_handle!=null && leave_handle!=undefined && leave_handle!="")
{
await driver.switchTo().window(leave_handle);
console.log("Switch to handle: ", leave_handle);
current_handle = leave_handle;
}
}
else {
await beginInvoke(msg);
} }
}); });
}); });
@ -201,6 +272,7 @@ console.log(process.platform);
async function runBrowser(lang = "en", user_data_folder = '') { async function runBrowser(lang = "en", user_data_folder = '') {
const serviceBuilder = new ServiceBuilder(driverPath); const serviceBuilder = new ServiceBuilder(driverPath);
let options = new chrome.Options(); let options = new chrome.Options();
options.addArguments('--disable-blink-features=AutomationControlled');
language = lang; language = lang;
if (lang == "en") { if (lang == "en") {
options.addExtensions(path.join(__dirname, "EasySpider_en.crx")); options.addExtensions(path.join(__dirname, "EasySpider_en.crx"));
@ -219,6 +291,8 @@ async function runBrowser(lang="en", user_data_folder='') {
.setChromeOptions(options) .setChromeOptions(options)
.setChromeService(serviceBuilder) .setChromeService(serviceBuilder)
.build(); .build();
await driver.manage().setTimeouts({implicit: 10000, pageLoad: 10000, script: 10000});
await driver.executeScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
const cdpConnection = await driver.createCDPConnection("page"); const cdpConnection = await driver.createCDPConnection("page");
let stealth_path = path.join(__dirname, "stealth.min.js"); let stealth_path = path.join(__dirname, "stealth.min.js");
let stealth = fs.readFileSync(stealth_path, 'utf8'); let stealth = fs.readFileSync(stealth_path, 'utf8');
@ -227,6 +301,8 @@ async function runBrowser(lang="en", user_data_folder='') {
}); });
try { try {
await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&lang=" + lang); await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&lang=" + lang);
old_handles = await driver.getAllWindowHandles();
current_handle = old_handles[old_handles.length - 1];
} finally { } finally {
// await driver.quit(); // 退出浏览器 // await driver.quit(); // 退出浏览器
} }
@ -308,3 +384,8 @@ app.on('window-all-closed', function () {
// In this file you can include the rest of your app's specific main process // 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. // code. You can also put them in separate files and require them here.
function arrayDifference(arr1, arr2) {
return arr1.filter(item => !arr2.includes(item));
}

View File

@ -25,9 +25,17 @@ chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
} else if (request.type == 2) { } else if (request.type == 2) {
let message = { let message = {
type: 2, //消息类型2代表键盘输入 type: 2, //消息类型2代表键盘输入
message: { "keyboardStr": request.value, "xpath": request.xpath } // {}全选{BS}退格 message: { "keyboardStr": request.value, "xpath": request.xpath, "id": request.id } // {}全选{BS}退格
}; };
ws.send(JSON.stringify(message)); ws.send(JSON.stringify(message));
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
// 获取当前选项卡的 ID
const tabId = tabs[0].id;
const url = tabs[0].url;
// 停止当前页面的加载
chrome.tabs.executeScript(tabId, {code: 'window.stop();'});
});
} else if (request.type == 3) { } else if (request.type == 3) {
let tmsg = request.msg; let tmsg = request.msg;
tmsg.tabIndex = nowTabIndex; //赋值当前tab的id tmsg.tabIndex = nowTabIndex; //赋值当前tab的id

View File

@ -17,8 +17,22 @@ export var global = {
defaultbgColor: 'rgba(221,221,255,0.8)', defaultbgColor: 'rgba(221,221,255,0.8)',
boxShadowColor: "blue 0px 0px 5px", boxShadowColor: "blue 0px 0px 5px",
lang: config.language, lang: config.language,
id: "C" + Math.floor(Math.random() * (99999999)).toString(),
ws: null,
}; };
global.ws = new WebSocket("ws://localhost:8084");
global.ws.onopen = function() {
// Web Socket 已连接上,使用 send() 方法发送数据
console.log("已连接");
let message = {
type: 0, //消息类型0代表连接操作
message: {
id: global.id, //socket id
}
};
this.send(JSON.stringify(message));
};
export function getOS () { export function getOS () {
if (navigator.userAgent.indexOf('Window') > 0) { if (navigator.userAgent.indexOf('Window') > 0) {

View File

@ -114,6 +114,17 @@ document.addEventListener("mousemove", function() {
}); });
window.addEventListener("beforeunload", function(event) {
event.preventDefault();
let message = {
type: 10,
message: {
id: global.id, //socket id
}
};
global.ws.send(JSON.stringify(message));
});
//点击没反应时候的替代方案 //点击没反应时候的替代方案
document.onkeydown = function(event) { document.onkeydown = function(event) {
// console.log("keydown"); // console.log("keydown");
@ -153,19 +164,6 @@ function generateToolkit() {
if (difference > 0) { if (difference > 0) {
$(".tooldrag").css("cssText", "height:" + (26 + difference) + "px!important") $(".tooldrag").css("cssText", "height:" + (26 + difference) + "px!important")
} }
timer = setInterval(function() { //时刻监测相应元素是否存在(防止出现如百度一样元素消失重写body的情况),如果不存在,添加进来
if (document.body != null && document.getElementById("wrapperToolkit") == null) {
this.clearInterval(); //先取消原来的计时器,再设置新的计时器
document.body.append(global.div); //默认如果toolkit不存在则div和tdiv也不存在
document.body.append(global.tdiv);
document.body.append(toolkit);
generateToolkit();
}
}, 3000);
}
//Vue元素
generateToolkit();
//实现提示框拖拽功能 //实现提示框拖拽功能
$('.tooldrag').mousedown(function(e) { $('.tooldrag').mousedown(function(e) {
// e.pageX // e.pageX
@ -201,3 +199,16 @@ $('.tooldrag').mousedown(function(e) {
$(document).off('mousemove'); $(document).off('mousemove');
}); });
}); });
timer = setInterval(function() { //时刻监测相应元素是否存在(防止出现如百度一样元素消失重写body的情况),如果不存在,添加进来
if (document.body != null && document.getElementById("wrapperToolkit") == null) {
this.clearInterval(); //先取消原来的计时器,再设置新的计时器
document.body.append(global.div); //默认如果toolkit不存在则div和tdiv也不存在
document.body.append(global.tdiv);
document.body.append(toolkit);
generateToolkit();
}
}, 3000);
}
//Vue元素
generateToolkit();

View File

@ -23,9 +23,10 @@ export function input(value) {
"xpath": readXPath(global.nodeList[0]["node"], 0), "xpath": readXPath(global.nodeList[0]["node"], 0),
"value": value, "value": value,
}; };
let msg = { "type": 3, msg: message }; let msg = { type: 3, msg: message };
window.stop();
chrome.runtime.sendMessage(msg); chrome.runtime.sendMessage(msg);
msg = { "type": 2, value: value, xpath: message.xpath }; msg = { type: 2, value: value, xpath: message.xpath, id: global.id};
chrome.runtime.sendMessage(msg); chrome.runtime.sendMessage(msg);
} }

View File

@ -571,145 +571,5 @@ export default {
</script> </script>
<style> <style>
.tooltips {
width: 330px;
min-height: 300px;
background-color: white;
position: fixed;
z-index: 2147483647;
right: 30px;
bottom: 30px;
font-size: 13px !important;
font-weight: normal !important;
border: solid navy 2px;
-webkit-user-select: none;
/* 文字不可被选中 */
}
.tooldrag {
background-color: navy;
width: 100%;
text-align: center;
font-size: 13px;
height: 26px !important;
padding-top: 8px !important;
color: white;
}
.realcontent {
text-align: left;
padding-top: 10px !important;
padding-bottom: 80px !important;
padding-left: 20px !important;
padding-right: 10px !important;
}
.innercontent {
text-align: left;
padding-top: 5px !important;
padding-left: 12px !important;
}
.innercontent a {
display: inline-block;
text-decoration: none;
margin-top: 2px !important;
font-size: 13px;
color: navy !important;
cursor: pointer;
text-decoration: none !important;
}
.innercontent a:hover {
color: blue !important;
}
.innercontent span {
font-size: 20px;
color: navy;
line-height: normal;
padding-left: 5px !important;
}
.tooltips button {
margin-top: 7px !important;
font-size: 13px;
border-radius: 5px;
border: solid 2px navy;
background-color: white;
color: navy;
width: 100px;
height: 30px;
cursor: pointer;
margin-left: 15px !important;
}
.tooltips input[type=text] {
display: block;
margin-top: 7px !important;
padding-left: 5px !important;
margin-bottom: 7px !important;
font-size: 15px;
border-radius: 5px;
border: solid 2px navy;
width: 204px;
height: 30px;
}
.tooltips button:hover {
color: blue;
}
/* 下面用来对冻结表格首行元素和固定表格宽度和高度设定样式 */
.toolkitcontain {
border: 1px solid #cdd !important;
/*width: 280px !important;*/
/* 上面的宽度设定很重要 */
height: 150px;
overflow: auto;
margin-top: 10px !important;
position: relative;
}
.toolkitcontain table {
table-layout: fixed;
border-spacing: 0!important;
word-break: break-all;
word-wrap: break-word;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 100%;
}
.toolkitcontain th,
.toolkitcontain td,
.toolkitcontain tr {
border: 1px solid rgb(78, 78, 78) !important;
height: 25px !important;
width: 100px !important;
text-align: center !important;
font-weight: normal !important;
overflow: hidden !important;
font-size: 11px !important;
padding-left: 1px !important;
padding-right: 0px !important;
padding-top: 0px !important;
padding-bottom: 0px !important;
vertical-align: middle!important;
}
.toolkitcontain .toolkittb2 {
position: sticky;
top: 0px;
margin-bottom: 0px;
background-color: azure;
z-index: 1000;
}
.toolkitcontain .toolkittb4 {
position: absolute;
}
</style> </style>

View File

@ -27,6 +27,7 @@
"http://*/*", "http://*/*",
"https://*/*" "https://*/*"
], ],
"css": ["style/toolkit.css"],
"js": ["content-scripts/main.js"], "js": ["content-scripts/main.js"],
"run_at": "document_end", "run_at": "document_end",
"all_frames": false "all_frames": false
@ -42,6 +43,6 @@
} }
], ],
"permissions": [ "permissions": [
"identity", "storage", "tabs" "identity", "storage", "tabs","scripting"
] ]
} }

View File

@ -0,0 +1,141 @@
.tooltips {
width: 330px;
min-height: 300px;
background-color: white;
position: fixed;
z-index: 2147483647;
right: 30px;
bottom: 30px;
font-size: 13px !important;
font-weight: normal !important;
border: solid navy 2px;
-webkit-user-select: none;
/* 文字不可被选中 */
}
.tooldrag {
background-color: navy;
width: 100%;
text-align: center;
font-size: 13px;
height: 26px !important;
padding-top: 8px !important;
color: white;
}
.realcontent {
text-align: left;
padding-top: 10px !important;
padding-bottom: 80px !important;
padding-left: 20px !important;
padding-right: 10px !important;
}
.innercontent {
text-align: left;
padding-top: 5px !important;
padding-left: 12px !important;
}
.innercontent a {
display: inline-block;
text-decoration: none;
margin-top: 2px !important;
font-size: 13px;
color: navy !important;
cursor: pointer;
text-decoration: none !important;
}
.innercontent a:hover {
color: blue !important;
}
.innercontent span {
font-size: 20px;
color: navy;
line-height: normal;
padding-left: 5px !important;
}
.tooltips button {
margin-top: 7px !important;
font-size: 13px;
border-radius: 5px;
border: solid 2px navy;
background-color: white;
color: navy;
width: 100px;
height: 30px;
cursor: pointer;
margin-left: 15px !important;
}
.tooltips input[type=text] {
display: block;
margin-top: 7px !important;
padding-left: 5px !important;
margin-bottom: 7px !important;
font-size: 15px;
border-radius: 5px;
border: solid 2px navy;
width: 204px;
height: 30px;
}
.tooltips button:hover {
color: blue;
}
/* 下面用来对冻结表格首行元素和固定表格宽度和高度设定样式 */
.toolkitcontain {
border: 1px solid #cdd !important;
/*width: 280px !important;*/
/* 上面的宽度设定很重要 */
height: 150px;
overflow: auto;
margin-top: 10px !important;
position: relative;
}
.toolkitcontain table {
table-layout: fixed;
border-spacing: 0!important;
word-break: break-all;
word-wrap: break-word;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 100%;
}
.toolkitcontain th,
.toolkitcontain td,
.toolkitcontain tr {
border: 1px solid rgb(78, 78, 78) !important;
height: 25px !important;
width: 100px !important;
text-align: center !important;
font-weight: normal !important;
overflow: hidden !important;
font-size: 11px !important;
padding-left: 1px !important;
padding-right: 0px !important;
padding-top: 0px !important;
padding-bottom: 0px !important;
vertical-align: middle!important;
}
.toolkitcontain .toolkittb2 {
position: sticky;
top: 0px;
margin-bottom: 0px;
background-color: azure;
z-index: 1000;
}
.toolkitcontain .toolkittb4 {
position: absolute;
}

View File

@ -0,0 +1,11 @@
参数1_文本
吸毒的人最初是怎样沾上毒品的?
LSP是什么意思
如何看待微软研究院发表的 GPT-4 测评文章,认为 GPT-4 可以被视作AGI的早期版本
有哪些嵌套了好几层逻辑的经典故事?
百度还有希望崛起吗?
谁能告诉我你觉得最可悲的事是什么?
小张买了河豚鱼挂车把手上,转头鱼被王大妈偷了后,煮给孙子吃,孙子被毒死,民事责任与刑事责任怎么认定?
为何 Linus 一个人就能写出这么强的系统,中国却做不出来?
鸿门宴明明是一个失败的宴席,为什么却能进入中学课本?
男人最无声的炫富是什么?
1 参数1_文本
2 吸毒的人最初是怎样沾上毒品的?
3 LSP是什么意思?
4 如何看待微软研究院发表的 GPT-4 测评文章,认为 GPT-4 可以被视作AGI的早期版本?
5 有哪些嵌套了好几层逻辑的经典故事?
6 百度还有希望崛起吗?
7 谁能告诉我你觉得最可悲的事是什么?
8 小张买了河豚鱼挂车把手上,转头鱼被王大妈偷了后,煮给孙子吃,孙子被毒死,民事责任与刑事责任怎么认定?
9 为何 Linus 一个人就能写出这么强的系统,中国却做不出来?
10 鸿门宴明明是一个失败的宴席,为什么却能进入中学课本?
11 男人最无声的炫富是什么?

View File

@ -0,0 +1,16 @@
openPage
Loading page: https://www.zhihu.com
loop
getData
getData
getData
pathNotFound: //*[contains(@class, "css-0")]/div[5]/div[1]/div[1]/div[1]/h2[1]/div[1]
getData
getData
pathNotFound: //*[contains(@class, "css-0")]/div[8]/div[1]/div[1]/div[1]/h2[1]/div[1]
getData
getData
getData
getData
getData
Done!

View File

@ -0,0 +1 @@
{"id":0,"name":"知乎_登录后采集","url":"https://www.zhihu.com","links":"https://www.zhihu.com","containJudge":false,"desc":"https://www.zhihu.com\n使用带用户配置的浏览器模式来先手工登录后保存信息再接着执行。","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.zhihu.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.zhihu.com"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"string","exampleValue":"历史上有哪些通过“正当手段”干出不正当事的人物?"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.zhihu.com","links":"https://www.zhihu.com","scrollType":0,"scrollCount":0}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3],"isInLoop":false,"position":1,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","wait":0,"scrollType":0,"scrollCount":0,"loopType":2,"pathList":"//*[contains(@class, \"css-0\")]/div[2]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[3]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[4]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[5]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[6]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[7]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[8]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[9]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[10]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[11]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[12]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[13]/div[1]/div[1]/div[1]/h2[1]/div[1]","textList":"","exitCount":0,"historyWait":2}},{"id":3,"index":3,"parentId":2,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","wait":0,"paras":[{"nodeType":0,"contentType":0,"relative":true,"name":"参数1_文本","desc":"","relativeXpath":"","exampleValues":[{"num":0,"value":"历史上有哪些通过“正当手段”干出不正当事的人物?"},{"num":1,"value":"新加坡有哪些不好的地方?"},{"num":2,"value":"孙悟空可以秒杀山村老尸那样的厉鬼吗?"},{"num":3,"value":"为什么渐渐厌倦玩《原神》了?"},{"num":4,"value":"历史上有哪些著名的考古乌龙事件?"},{"num":5,"value":"苹果公司为什么能把用户调教得这么好?"},{"num":6,"value":"哪个瞬间让你发现了世界的bug"},{"num":7,"value":"假如中国的院士,想为亲属谋体制内的工作,难度大吗?为什么?"},{"num":8,"value":"你一直珍藏的视频是哪个?"},{"num":9,"value":"如何评价《原神》角色艾莉丝?"},{"num":10,"value":"索罗斯如何做空的英镑、泰铢?为什么做空香港失败了?"},{"num":11,"value":"如何在婚前认清并杜绝王力宏这种男人?"}],"default":""}],"loopType":2}}]}