checkReven

计算总价

当前为 2025-03-03 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         checkReven
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  计算总价
// @author       你的名字
// @match        https://www.ads.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
 function waitForElement(selector, callback) {
        const observer = new MutationObserver((mutations, obs) => {
            const element = document.querySelector(selector);
            if (element) {
                obs.disconnect(); // 停止观察
                callback(element);
            }
        });

        // 开始观察整个文档
        observer.observe(document, {
            childList: true,
            subtree: true
        });
    }

    // 等待 chat-launcher-icon 加载完成
    waitForElement('.chat-launcher-icon', () => {
        // 你的脚本逻辑
        initScript();
    });
    // 创建日志窗口
    const logContainer = document.createElement('div');
    logContainer.style.position = 'fixed';
    logContainer.style.left = '10px';
    logContainer.style.bottom = '10px';
    logContainer.style.width = '500px';
    logContainer.style.maxHeight = '400px';
    logContainer.style.overflowY = 'auto';
    logContainer.style.background = 'rgba(0, 0, 0, 0.8)';
    logContainer.style.color = 'white';
    logContainer.style.padding = '10px';
    logContainer.style.borderRadius = '8px';
    logContainer.style.fontSize = '14px';
    logContainer.style.zIndex = '9999';
    logContainer.style.display = 'flex';
    logContainer.style.flexDirection = 'column';
    document.body.appendChild(logContainer);

    // 创建输入框
    const inputField = document.createElement('input');
    inputField.type = 'text';
    inputField.placeholder = '输入 domain_name (用逗号分隔)';
    inputField.style.width = '500px';
    inputField.style.padding = '5px';
    inputField.style.marginBottom = '5px';
    inputField.style.border = '1px solid #ccc';
    inputField.style.borderRadius = '4px';
     inputField.style.color = 'white';
    // 创建过滤按钮
    const filterButton = document.createElement('button');
    filterButton.innerText = '过滤';
    filterButton.style.marginLeft = '5px';
    filterButton.style.padding = '5px 10px';
    filterButton.style.background = '#007bff';
    filterButton.style.color = 'white';
    filterButton.style.border = 'none';
    filterButton.style.borderRadius = '4px';
    filterButton.style.cursor = 'pointer';

    // 创建清空按钮
    const clearButton = document.createElement('button');
    clearButton.innerText = '清空';
    clearButton.style.marginLeft = '5px';
    clearButton.style.padding = '5px 10px';
    clearButton.style.background = '#dc3545';
    clearButton.style.color = 'white';
    clearButton.style.border = 'none';
    clearButton.style.borderRadius = '4px';
    clearButton.style.cursor = 'pointer';

    // 将输入框和按钮添加到日志窗口
    logContainer.appendChild(inputField);
    logContainer.appendChild(filterButton);
    logContainer.appendChild(clearButton);

    let filterDomains = [];
    let capturedData = []; // 用于存储捕获的请求数据

    // 过滤按钮点击事件
    filterButton.addEventListener('click', () => {
        const inputText = inputField.value.trim();
        if (inputText) {
            filterDomains = inputText.split(',').map(domain => domain.trim());
            logMessage(`<b>✅ 过滤列表更新:</b> ${JSON.stringify(filterDomains)}`);
        }

        // 过滤并展示数据
        applyFilter();
    });

    // 清空按钮点击事件
    clearButton.addEventListener('click', () => {
        // 清空日志窗口内容
        logContainer.innerHTML = '';
        // 重新添加输入框和按钮
        logContainer.appendChild(inputField);
        logContainer.appendChild(filterButton);
        logContainer.appendChild(clearButton);
        logMessage(`<b>🧹 日志已清空</b>`);
    });

    function logMessage(message) {
        const logItem = document.createElement('div');
        logItem.innerHTML = message;
        logContainer.appendChild(logItem);
        logContainer.scrollTop = logContainer.scrollHeight;
    }

    // 监听 XMLHttpRequest 请求
    const originalXhrOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (method, url, ...args) {
        this._requestUrl = url;
        return originalXhrOpen.apply(this, [method, url, ...args]);
    };

    const originalXhrSend = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function (body) {
        this.addEventListener("load", function () {
            try {
                const responseData = JSON.parse(this.responseText);

                if (responseData.data && Array.isArray(responseData.data)) {
                    // 存储捕获的数据
                    capturedData = responseData.data.map(({ domain_name, estimated_revenue }) => ({
                        domain_name,
                        estimated_revenue: parseFloat(estimated_revenue) // 将 estimated_revenue 转换为数字
                    }));

                    logMessage(`<b>📥 数据已捕获,等待过滤...</b>`);
                } else {
                    logMessage(`<b>⚠️ 服务器返回的数据格式不匹配,未找到 'data' 数组。</b>`);
                }
            } catch (error) {
                logMessage(`<b>❌ JSON 解析失败:</b> ${error.message}`);
            }
        });
        return originalXhrSend.apply(this, arguments);
    };
console.log("asdasd");
    // 应用过滤并展示数据
    function applyFilter() {
        if (capturedData.length === 0) {
            logMessage(`<b>⚠️ 没有捕获到数据,请先发起请求。</b>`);
            return;
        }

        let filteredData = capturedData;

        // 如果有过滤条件,就筛选数据
        if (filterDomains.length > 0) {
            filteredData = capturedData.filter(item => filterDomains.includes(item.domain_name));
        }

        // 计算总的反款金额
        const totalRevenue = filteredData.reduce((sum, item) => sum + item.estimated_revenue, 0);

        // 展示总的反款金额
        logMessage(`<b>📥 总反款:</b> ${totalRevenue.toFixed(2)}`);
    }
})();