Greasy Fork

来自缓存

Greasy Fork is available in English.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         抖店批量同意仅退款售后单
// @namespace    http://tampermonkey.net/
// @version      1.21
// @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; // 定时器 ID
    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('已找到“已发货退款待处理”按钮');
                const buttonData = shippedRefundButton.getAttribute('data-kora-json');
                const parsedData = JSON.parse(buttonData.replace(/"/g, '"'));
                const buttonStatus = parsedData.button_status;

                if (buttonStatus === 0) {
                    shippedRefundButton.click();
                    console.log('点击“已发货退款待处理”按钮');
                } else {
                    console.log('“已发货退款待处理”按钮已选中');
                }
            }

            // Step 2: 点击查询按钮
            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);

            // Step 3: 判断全选按钮是否可点击,若可点击则点击
            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 4: 点击批量同意退款按钮
                        setTimeout(() => {
                            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 5: 循环检查并点击弹窗的“确定”按钮
                                setTimeout(() => {
                                    let confirmButton;
                                    const interval = setInterval(() => {
                                        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 {
                                            clearInterval(interval);
                                            console.log('没有弹窗“确定”按钮,退出循环');
                                        }
                                    }, 1000); // 每秒检查一次
                                }, 2000);
                            } else {
                                console.log('未找到“批量同意退款”按钮');
                            }
                        }, 2000);
                    } else {
                        console.log('“全选”按钮不可点击');
                    }
                } else {
                    console.log('未找到“全选”按钮');
                }
            }, 4000);

            // 累计循环计数器
            cycleCount++;
            if (cycleCount >= 5) {
                console.log('已执行5次循环,刷新页面');
                cycleCount = 0; // 重置计数器
                location.reload(); // 刷新页面
            }
        } catch (error) {
            console.error('执行操作时出错:', error);
        }
    }
})();