红书聚光_自用

Create a floating window that can be minimized and expanded, and sticks to the bottom right corner.

// ==UserScript==
// @name         红书聚光_自用
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Create a floating window that can be minimized and expanded, and sticks to the bottom right corner.
// @author       You
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 统一管理样式
    const styles = {
        floatingWindow: {
            position: 'fixed',
            bottom: '20px',
            right: '20px',
            width: '300px',
            height: '200px',
            backgroundColor: '#fff',
            border: '1px solid #ccc',
            boxShadow: '0 0 10px rgba(0, 0, 0, 0.2)',
            zIndex: '9999',
            display: 'none'
        },
        titleBar: {
            backgroundColor: '#f0f0f0',
            padding: '5px',
            cursor: 'move'
        },
        minimizeButton: {
            float: 'right'
        },
        windowContent: {
            padding: '10px'
        },
        floatingBall: {
            position: 'fixed',
            bottom: '20px',
            right: '20px',
            width: '50px',
            height: '50px',
            backgroundColor: '#007BFF',
            borderRadius: '50%',
            cursor: 'pointer',
            zIndex: '9999'
        }
    };

    // 创建悬浮窗口元素
    const floatingWindow = document.createElement('div');
    floatingWindow.id = 'floating-window';
    Object.assign(floatingWindow.style, styles.floatingWindow);

    // 创建窗口标题栏
    const titleBar = document.createElement('div');
    Object.assign(titleBar.style, styles.titleBar);
    titleBar.textContent = 'Floating Window';

    // 创建最小化按钮
    const minimizeButton = document.createElement('button');
    Object.assign(minimizeButton.style, styles.minimizeButton);
    minimizeButton.textContent = '-';
    minimizeButton.addEventListener('click', function() {
        floatingWindow.style.display = 'none';
        floatingBall.style.display = 'block';
    });
    titleBar.appendChild(minimizeButton);

    // 将标题栏添加到窗口
    floatingWindow.appendChild(titleBar);

    // 创建窗口内容
    const windowContent = document.createElement('div');
    Object.assign(windowContent.style, styles.windowContent);
    windowContent.textContent = 'This is the content of the floating window.';
    floatingWindow.appendChild(windowContent);

    // 创建折叠后的小圆球
    const floatingBall = document.createElement('div');
    floatingBall.id = 'floating-ball';
    Object.assign(floatingBall.style, styles.floatingBall);
    floatingBall.addEventListener('click', function() {
        floatingBall.style.display = 'none';
        floatingWindow.style.display = 'block';
    });



    // 实现窗口拖动功能
    let isDragging = false;
    let offsetX, offsetY;

    titleBar.addEventListener('mousedown', function(e) {
        isDragging = true;
        offsetX = e.clientX - floatingWindow.offsetLeft;
        offsetY = e.clientY - floatingWindow.offsetTop;
    });

    document.addEventListener('mousemove', function(e) {
        if (isDragging) {
            floatingWindow.style.left = (e.clientX - offsetX) + 'px';
            floatingWindow.style.top = (e.clientY - offsetY) + 'px';
        }
    });

    document.addEventListener('mouseup', function() {
        isDragging = false;

    });



    // 业务逻辑

    // 创建按钮容器
    const buttonContainer = document.createElement('div');

    // 定义按钮文本和对应的点击事件处理函数
    const buttonConfigs = {
        '关闭自动自动优化': function () {
            setup1()
            // 这里可以添加具体的业务逻辑
        },
        '点击搜索组件': function () {
            setup2()
            // 这里可以添加具体的业务逻辑
        },
        '修改创意名称': function () {
            try {
                setup3()
            } catch (error) {
                console.log(error);

            }

            // 这里可以添加具体的业务逻辑
        },
        '添加监测链接': function () {
          // 执行主函数
    main().catch(error => console.error('执行过程中出现错误:', error));//  console.log('触发了添加监测链接操作');
            // 这里可以添加具体的业务逻辑
        }
    };

    // 遍历按钮配置对象,创建按钮并绑定事件
    for (const [buttonText, clickHandler] of Object.entries(buttonConfigs)) {
        const button = document.createElement('button');
        button.textContent = buttonText;
        button.addEventListener('click', clickHandler);
        buttonContainer.appendChild(button);
    }



    // 创建输入框和多行文本框的容器
    const inputContainer = document.createElement('div');

    // 输入框和提示信息配置
    const inputConfigs = [
        { label: '基础创意名称', id: 'base-creative-name', type: 'text' },
        { label: '曝光链接', id: 'exposure-link', type: 'text' },
        { label: '点击链接', id: 'click-link', type: 'text' }
    ];

    // 创建输入框
    inputConfigs.forEach(config => {
        const inputGroup = document.createElement('div');
        inputGroup.classList.add('input-group');

        const label = document.createElement('label');
        label.textContent = config.label;
        label.setAttribute('for', config.id);

        const input = document.createElement('input');
        input.setAttribute('type', config.type);
        input.setAttribute('id', config.id);

        inputGroup.appendChild(label);
        inputGroup.appendChild(input);
        inputContainer.appendChild(inputGroup);
    });

    // 创建多行文本框
    const textareaGroup = document.createElement('div');
    textareaGroup.classList.add('input-group');

    const textareaLabel = document.createElement('label');
    textareaLabel.textContent = '笔记匹配信息';
    textareaLabel.setAttribute('for', 'note-matching-info');

    const textarea = document.createElement('textarea');
    textarea.setAttribute('id', 'note-matching-info');
    textarea.setAttribute('rows', '5');

    textareaGroup.appendChild(textareaLabel);
    textareaGroup.appendChild(textarea);
    inputContainer.appendChild(textareaGroup);




    function setup1() {
        const es = document.querySelectorAll('.flexible.align-center')
        for (let index = 0; index < es.length; index++) {
            const element = es[index];
            if(element.innerText == "关闭"){
                element.click()
            }
        }

    }

    function setup2() {
        const es = document.querySelectorAll('.d-grid.d-radio.d-radio-main-label.d-clickable')
        for (let index = 0; index < es.length; index++) {
            const element = es[index];
            if(element.innerText == "搜索组件"){
                element.click()
            }
        }
    }
    // setup2()




    function setup3(){
    // 改名
    // 基础命名
    const baseName = document.querySelector('#base-creative-name').value//"【达人昵称】-运动户外-全端-【koc-高级定向】-场景";

    // 示例的字符串,这里假设是从外部传入的,你可以根据实际情况修改 场景是0 小红书编号是1
    // const str = `
    // 一个人过节	679498a30000000018004638
    // 送礼	679473f90000000029016f15
    // 赴约	67933d28000000002903db39
    // 赴约	67949ead000000002901221b
    // 一个人过节	67947dad000000001703b0e5
    // 送礼	67934d410000000018008e5c
    // 送礼	679477be0000000029019742
    // 多元尝鲜派	67938fe4000000002503de91
    // 品质进阶派	67933bbe000000002602e53a
    // `;
    const str = document.querySelector('#note-matching-info').value
    // 切割成二维数组
    const noteInfo = str.trim().split('\n').map(item => item.trim().split('	'));

    // 获取所有 class="item" 的元素
    const a = document.querySelectorAll('.item');

    // 遍历数组 a
    a.forEach(item => {
        // 获取第二个 td 的 innerText 作为场景
        const redBookId = item.querySelectorAll('td')[1].innerText;
        const scene = noteInfo.filter(item => item[1] === redBookId)[0][0]
        // 获取第四个 td 的 innerText 作为达人昵称
        const nickname = item.querySelectorAll('td')[3].innerText;

        // 替换基础命名中的达人昵称和场景
        let newName = baseName.replace('达人昵称', nickname).replace('场景', scene);

        // 找到 placeholder="请输入你的创意名称" 的输入框并赋值
        const input = item.querySelector('input[placeholder="请输入你的创意名称"]');
        if (input) {
            input.value = newName;
            const event = new Event('input');
            input.dispatchEvent(event);
        }
    });
    }



    // 定义 url 数组
    // const url = [
    //    // "https://magellan.alimama.com/mmi/xiaohongshu?e=R0ovU3NWOXZid1JJdjlmODM3OEkrZz09&a1=__ID__&a2=__TS__&a3=__CAMPAIGN_ID__&a4=__UNIT_ID__&a5=__CREATIVITY_ID__&a7=__PLACEMENT__&a8=__ADVERTISER_ID__&a13=__OS__&a15=__REQUESTID__&a18=__ANDROIDID__&a19=__IP__&a20=__UA__&a24=__OAID__&a25=__CAID_MD5__&a32=__CAID__&a35=__CLICK_ID__&a36=__NOTE_ID__&a37=__IMEI__&a38=__IDFA__&a68=__KEYWORD_ID__",
    //    // "https://magellan.alimama.com/mmc/xiaohongshu?e=R0ovU3NWOXZid1JJdjlmODM3OEkrZz09&a1=__ID__&a2=__TS__&a4=__CAMPAIGN_ID__&a5=__UNIT_ID__&a6=__CREATIVITY_ID__&a8=__PLACEMENT__&a9=__ADVERTISER_ID__&a14=__OS__&a16=__REQUESTID__&a20=__ANDROIDID__&a21=__IP__&a22=__UA__&a26=__OAID__&a27=__CAID_MD5__&a36=__CAID__&a39=__CLICK_ID__&a40=__NOTE_ID__&a41=__IMEI__&a42=__IDFA__&a70=__KEYWORD_ID__"
    // ];

    // 等待元素出现的函数
    async function waitForElement(selector, text = null) {
        while (true) {
            const elements = document.querySelectorAll(selector);
            for (let i = 0; i < elements.length; i++) {
                const element = elements[i];
                if (text === null || element.innerText === text) {
                    return element;
                }
            }
            await new Promise(resolve => setTimeout(resolve, 100));
        }
    }

    // 等待多个元素出现的函数
    async function waitForElements(selector, count) {
        while (true) {
            const elements = document.querySelectorAll(selector);
            if (elements.length === count) {
                return elements;
            }
            await new Promise(resolve => setTimeout(resolve, 100));
        }
    }

    // 触发 change 事件的函数
    function triggerChangeEvent(element) {
        const event = new Event('input');
        element.dispatchEvent(event);
    }

    async function main() {
        const url = [
            document.querySelector('#exposure-link').value,
            document.querySelector('#click-link').value
        ]
        // setup3()
        // await new Promise(resolve => setTimeout(resolve, 2000));

        // 获取所有 class = link-text 并且 innerText = 添加检测链接 的元素
        const redbookCreate = Array.from(document.querySelectorAll('.link-text')).filter(el => el.innerText === '添加监测链接');

        for (let i = 0; i < redbookCreate.length; i++) {
            const currentElement = redbookCreate[i];
            // 点击循环中的第一个元素
            currentElement.click();

            // 等待 class '.add-action' 且 innerText 为 '添加' 的出现 并且点击 这个有两个都需要点击
            const addButtons = await waitForElements('.add-action', 2);
            addButtons.forEach(button => {
                if (button.innerText === '添加') {
                    button.click();
                }
            });

            // 等待 1 秒
            await new Promise(resolve => setTimeout(resolve, 1000));

            // 等待 placeholder="请输入链接" 的 input 出现 这里面有两个这样的元素
            const inputElements = await waitForElements('input[placeholder="请输入链接"]', 2);
            inputElements[0].value = url[0];
            triggerChangeEvent(inputElements[0]);
            inputElements[1].value = url[1];
            triggerChangeEvent(inputElements[1]);

            // 等待 1 秒
            await new Promise(resolve => setTimeout(resolve, 1000));

            // 点击 btn-content 并且 innerText = 保存
            const saveButton = await waitForElement('.btn-content', '保存');
            saveButton.click();
            await new Promise(resolve => setTimeout(resolve, 1000));

        }
    }

      // 将元素添加到页面
  floatingWindow.appendChild(buttonContainer)
  floatingWindow.appendChild(inputContainer);
  document.body.appendChild(floatingWindow);
  document.body.appendChild(floatingBall);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址