2024年10月

新建 run.py

import os
import sys

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

if __name__ == '__main__':
    sys.argv = ['manage.py', 'runserver', '127.0.0.1:8001']  # 指定默认运行的命令
    main()

安装pyinstall

pip install pyinstaller 

命令参考
img

执行命令

pyinstaller -F --name=run run.py --specpath .  

(function () {
    const originalSend = XMLHttpRequest.prototype.send;
    const originalOpen = XMLHttpRequest.prototype.open;

    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
        this._url = url;   // 保存请求 URL 以便后续使用
        this._method = method;
        this._async = async;
        originalOpen.apply(this, arguments);  // 保持原来的 open 方法
    };

    XMLHttpRequest.prototype.send = function (body) {
        const xhr = this;  // 保存当前 XMLHttpRequest 对象的引用

        console.log('拦截到 XHR 请求的响应:', xhr.responseText);
        // 拦截 onreadystatechange,获取响应数据
        xhr.addEventListener('readystatechange', function () {
            if (xhr.readyState === 4) {  // readyState 4 表示请求已完成
                console.log('拦截到 XHR 请求的响应:', xhr.responseText);

                // 在这里你可以对响应数据进行处理
                // alert(xhr.responseText)
                //拦截指定的url
                if (xhr._url.includes('keyword')) {
                    console.log(JSON.parse(xhr.responseText).data)
                }
            }
        });

        // 调用原始 send 方法
        originalSend.apply(this, arguments);
    };
})();

function simulateScrollDown(pixels, interval) {
    let scrolled = 0;
    const scrollStep = pixels / 10; // 每次滚动的步长
    const scrollInterval = setInterval(() => {
        if (scrolled < pixels) {
            document.querySelector('.scroll-menu-wrap').scrollBy(0, scrollStep); // 向下滚动
            scrolled += scrollStep;
        } else {
            clearInterval(scrollInterval); // 滚动结束
        }
    }, interval);
}
   let ele = document.querySelector('.g-table-body')
   ele.scrollTop+=200  

滚动到元素

ele.scrollIntoView({
  behavior: 'smooth', // 平滑滚动,默认是立即滚动
  block: 'start'      // 让元素顶部与视口顶部对齐,可选值:'start', 'center', 'end', 'nearest'
});

async function inputText(input, text) {
  // 手动触发 input 和 change 事件
  for (let event of ['click', 'focus', 'text', 'input', 'change', 'blur']){
  if (event === 'text'){
    input.value = text;
  }else{
        input.dispatchEvent(new Event(event, { bubbles: true }));

  }
  await sleep(600)
  }
}

方式1

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function simulateTextInput(inputBox, text) {
    let range = document.createRange();
    range.selectNodeContents(inputBox);
    let sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);

    await sleep(500)

    let inputEvent = new InputEvent('input', {
        bubbles: true,
        cancelable: true,
        inputType: 'insertText',
        data: text
    });

    inputBox.textContent = text;
    inputBox.dispatchEvent(inputEvent);
}

box = document.querySelector('#main .copyable-area [contenteditable="true"][role="textbox"]')
simulateTextInput(box, "😇")

方式2

let text = document.querySelector('div textarea')
    let pasteEvent = new ClipboardEvent('paste', {
        dataType: 'text/plain',
        data: imgs.join('\n')
    });

    let event = new Event('input', {
        bubbles: true,
        cancelable: true,
    });

// 模拟设置粘贴的内容
    text.value = 'something';

// 触发粘贴事件
    text.dispatchEvent(event);

方式3

const e = new InputEvent("input", {
                bubbles: true,
                cancelable: true
            });
            ele.dispatchEvent(e);
            const ee = new KeyboardEvent("keydown", {
                altKey: false,
                bubbles: true,
                cancelable: true,
                key: 'Enter',
                code: 'Enter',
                keyCode: 13,
                repeat: false
            });
            ele.dispatchEvent(ee);

终极

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function fillData(input, value) {
    let events = ['click', 'focus', 'setVal', 'input', 'change', 'blur'];
    for (let event of events) {
        if (event === 'setVal') {
            if (input.tagName.toLowerCase() === 'input') {
                input.setAttribute('value', value)
            } else {
                //text
                input.textContent = value
            }
        } else {
            console.log(`fill value query: ${input} value: ${value} event: ${event}`,);
            let eventObj = new Event(event, {
                bubbles: true,
                cancelable: true,
            })
            input.dispatchEvent(eventObj);
            await sleep(400)
        }
    }
}