Greasy Fork

Greasy Fork is available in English.

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

自动执行操作,并可以手动控制开始/停止,每分钟执行一次,操作之间有2秒延迟

当前为 2024-12-27 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         抖店批量同意仅退款售后单
// @namespace    http://tampermonkey.net/
// @version      1.15
// @description  自动执行操作,并可以手动控制开始/停止,每分钟执行一次,操作之间有2秒延迟
// @author       You
// @license      MIT
// @match        https://fxg.jinritemai.com/ffa/maftersale/aftersale/list
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 控制定时执行的标志
    let isRunning = true;
    let intervalId = null;

    // 创建并添加按钮
    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('点击弹窗的“确定”按钮');
                    // 延迟2秒后继续检查
                    setTimeout(() => {}, 2000);
                }
            }, 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("没有弹窗“确定”按钮");
                                }
                            }, 2000);  // 延迟2秒

                            // 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('未找到“查询”按钮');
                                }
                            }, 2000);  // 延迟2秒
                        }
                    }
                }
            }, 10000);  // 延迟10秒
        } catch (error) {
            console.error('自动化操作失败:', error);
        }
    }
})();