抖店批量同意仅退款售后单

自动执行操作,并可以手动控制开始/停止,每分钟执行一次,操作之间有2秒延迟,每执行5次循环后刷新一次页面

目前为 2025-01-19 提交的版本。查看 最新版本

// ==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);
        }
    }
})();