// ==UserScript==
// @name 抖店批量同意仅退款售后单
// @namespace http://tampermonkey.net/
// @version 1.17
// @description 自动执行操作,并可以手动控制开始/停止,每分钟执行一次,操作之间有2秒延迟,每执行5次循环后刷新一次页面
// @author Kevin Liu
// @license MIT
// @match https://fxg.jinritemai.com/ffa/maftersale/aftersale/list*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 控制定时执行的标志
let isRunning = true;
let intervalId = null;
let cycleCount = 0; // 循环计数器
// 创建并添加按钮
const controlButton = document.createElement('button');
controlButton.innerText = '暂停';
controlButton.style.position = 'fixed';
controlButton.style.top = '20px';
controlButton.style.left = '20px';
controlButton.style.zIndex = 9999;
controlButton.style.padding = '10px 20px';
controlButton.style.backgroundColor = '#FF6347'; // 红色,表示暂停
controlButton.style.color = 'white';
controlButton.style.fontSize = '16px';
controlButton.style.border = 'none';
controlButton.style.borderRadius = '5px';
controlButton.style.cursor = 'pointer';
document.body.appendChild(controlButton);
// 按钮点击事件
controlButton.addEventListener('click', function() {
if (isRunning) {
// 停止操作
clearInterval(intervalId);
isRunning = false;
controlButton.innerText = '开始';
controlButton.style.backgroundColor = '#4CAF50'; // 绿色,表示开始
console.log('操作已停止');
} else {
// 开始操作
isRunning = true;
controlButton.innerText = '暂停';
controlButton.style.backgroundColor = '#FF6347'; // 红色,表示暂停
console.log('操作已开始');
startOperation(); // 执行一次操作
// 每分钟执行一次
intervalId = setInterval(startOperation, 60000);
}
});
// 延迟5秒后开始执行操作
setTimeout(() => {
startOperation(); // 执行一次操作
intervalId = setInterval(startOperation, 60000); // 每分钟执行一次
}, 5000);
// 执行自动化操作
function startOperation() {
try {
console.log('正在执行操作...');
// Step 1: 判断“已发货退款待处理”按钮是否选中,没选中就点击
const shippedRefundButton = document.evaluate(
'//*[@id="orderAppContainer"]/div/div[3]/div[1]/div[1]/div/div[1]/div/div/div/div/div/div[1]/div/div[3]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (shippedRefundButton) {
console.log('已找到“已发货退款待处理”按钮');
// 获取 data-kora-json 属性并解析
const buttonData = shippedRefundButton.getAttribute('data-kora-json');
console.log('按钮数据:', buttonData);
// 解析并获取 button_status
const parsedData = JSON.parse(buttonData.replace(/"/g, '"')); // 替换 HTML 实体
const buttonStatus = parsedData.button_status;
console.log('button_status:', buttonStatus);
// 只有当 button_status 是 0 时才点击
if (buttonStatus === 0) {
shippedRefundButton.click();
console.log('点击“已发货退款待处理”按钮');
} else {
console.log('“已发货退款待处理”按钮不可点击,button_status 不是 0');
return; // 如果按钮不可点击,则退出该函数
}
} else {
console.log('未找到“已发货退款待处理”按钮');
return; // 如果按钮不存在,也退出该函数
}
// Step 2: 每1分钟循环执行的操作
// 2.1 循环判断“我已悉知”按钮是否存在,存在就点击
setTimeout(() => {
const acknowledgeButton = document.evaluate(
'/html/body/div[7]/div/div[2]/div/div[2]/div/div/div[3]/button[1]/span',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (acknowledgeButton) {
acknowledgeButton.click();
console.log('点击“我已悉知”按钮');
} else {
console.log('没有“我已悉知”按钮');
}
}, 2000); // 延迟2秒
// 2.2 循环判断弹窗的“确定”按钮是否存在,存在就点击
setTimeout(() => {
const confirmButtons = document.evaluate(
'//button[contains(@class, "auxo-btn-primary") and span[text()="确定"]]',
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
// 循环点击所有“确定”按钮
for (let i = 0; i < confirmButtons.snapshotLength; i++) {
const confirmButton = confirmButtons.snapshotItem(i);
confirmButton.click();
console.log('点击弹窗的“确定”按钮');
// 延迟1秒后继续检查
setTimeout(() => {}, 1000);
}
}, 4000); // 延迟4秒
// 2.3 循环判断“知道了”按钮是否存在,存在就点击
setTimeout(() => {
const knowButton = document.evaluate(
'//button[span[text()="知道了"]]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (knowButton) {
knowButton.click();
console.log('点击“知道了”按钮');
} else {
console.log('没有“知道了”按钮');
}
}, 6000); // 延迟6秒
// 2.4 点击查询按钮
setTimeout(() => {
const queryButton = document.evaluate(
'//*[@id="orderAppContainer"]/div/div[3]/div[2]/button[1]/span',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (queryButton) {
queryButton.click();
console.log('点击“查询”按钮');
} else {
console.log('未找到“查询”按钮');
}
}, 8000); // 延迟8秒
// 2.5 判断全选按钮是否可点击,若可点击则点击
setTimeout(() => {
const selectAllButton = document.evaluate(
'//*[@id="orderAppContainer"]/div/div[5]/div/div/div/div/div/div/div/div/table/thead/tr/th[1]/div/label/span/input',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (selectAllButton) {
const isDisabled = selectAllButton.hasAttribute('disabled');
if (!isDisabled) {
selectAllButton.click();
console.log('点击“全选”按钮');
// Step 2.6 点击批量同意退款按钮
const bulkAgreeRefundButton = document.evaluate(
'//*[@id="orderAppContainer"]/div/div[4]/div/div[3]/button/span',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (bulkAgreeRefundButton) {
bulkAgreeRefundButton.click();
console.log('点击“批量同意退款”按钮');
// Step 2.7 检查弹窗确定按钮并点击
setTimeout(() => {
const confirmButton = document.evaluate(
'//button[contains(@class, "auxo-btn-primary") and span[text()="确定"]]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (confirmButton) {
confirmButton.click();
console.log('点击弹窗的“确定”按钮');
} else {
console.log("没有弹窗“确定”按钮");
}
}, 1000); // 延迟1秒
// 2.8 再次点击查询按钮
setTimeout(() => {
const queryButton = document.evaluate(
'//*[@id="orderAppContainer"]/div/div[3]/div[2]/button[1]/span',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
if (queryButton) {
queryButton.click();
console.log('点击“查询”按钮');
} else {
console.log('未找到“查询”按钮');
}
}, 3000); // 延迟3秒
}
} else {
console.log('“全选”按钮不可点击');
}
} else {
console.log('未找到“全选”按钮');
}
}, 10000); // 延迟10秒
// 如果已经执行了5次循环,刷新页面
cycleCount++;
if (cycleCount >= 5) {
console.log('已执行5次循环,刷新页面');
location.reload();
cycleCount = 0; // 重置循环计数器
}
} catch (error) {
console.error('自动化操作失败:', error);
}
}
})();