Fuck QPen Default

Fuck QPEN

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Fuck QPen Default
// @namespace    http://tampermonkey.net/
// @version      2025-3-18
// @description  Fuck QPEN
// @author       VonEquinox & Gemini
// @match        *://*/*
// @grant        GM_addStyle
// @require      https://cdnjs.cloudflare.com/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js
// ==/UserScript==


const GEMINI_API_KEY = "";
const GEMINI_API_BASE_URL = "https://generativelanguage.googleapis.com/v1beta/openai/";

(function() {
    'use strict';

    //答案框
    const outputTextArea = document.createElement('textarea');
    outputTextArea.style.position = 'fixed'; // 固定定位
    outputTextArea.style.top = '160px';      // 调整位置
    outputTextArea.style.left = '20px';     // 调整位置
    outputTextArea.style.width = '7%';     // 宽度
    outputTextArea.style.height = '5%';   // 高度
    outputTextArea.style.zIndex = '9998';    // 确保在按钮下方
    outputTextArea.style.border = 'none';      // 移除边框
    outputTextArea.style.padding = '10px';
    outputTextArea.style.backgroundColor = 'transparent';
    document.body.appendChild(outputTextArea);

    // 1. 创建按钮元素
    const getQuestionButton = document.createElement('button');
    getQuestionButton.textContent = 'Get Answer';
    getQuestionButton.style.position = 'fixed';
    getQuestionButton.style.top = '100px';
    getQuestionButton.style.left = '20px';
    getQuestionButton.style.zIndex = '9999';
    getQuestionButton.style.padding = '10px 15px';
    getQuestionButton.style.backgroundColor = '#4CAF50';
    getQuestionButton.style.backgroundColor = 'transparent';
    getQuestionButton.style.color = 'grey';
    getQuestionButton.style.border = 'none';
    getQuestionButton.style.borderRadius = '5px';
    document.body.appendChild(getQuestionButton);

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

    async function askGemini(question) {

        const systemInstruction = "你是一个精通数学和编程的大师,你会评估题能不能用代码是方式得出答案,你会尽量使用代码的方式进行计算,如果确定代码无法计算才会使用普通的方法进行计算."

        const messages = [
            {
                "role": "system",
                "content": systemInstruction
            },
            {
                "role": "user",
                "tools": [{"code_execution": {}}],
                "content": question,
                temperature: 0.1,
            }
        ];

        const payload = {
            model: "gemini-2.0-flash-thinking-exp",//gemini-2.0-pro-exp gemini-2.0-flash-thinking-exp gemini-exp-1206
            messages: messages,
        };

        try {
            const response = await fetch(`${GEMINI_API_BASE_URL}chat/completions`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': `Bearer ${GEMINI_API_KEY}`
                },
                body: JSON.stringify(payload)
            });

            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }

            const data = await response.json();
            console.log('Gemini API 响应:', data);

            let analysisResult = 'Gemini 分析结果:\n';
            if (data.choices && data.choices.length > 0 && data.choices[0].message && data.choices[0].message.content) {
                analysisResult += data.choices[0].message.content + '\n';
            } else {
                analysisResult += '未能解析出有效结果。\n请查看控制台完整 API 响应。';
            }
            return analysisResult;

        } catch (error) {
            console.error('Gemini API 调用失败:', error);
            alert(`Gemini API 调用失败,请检查控制台错误信息!\n\n${error}`);
        }

    }

    async function analyzeResult(answerSteps) {
        const systemInstruction = "请仔细阅读并分析以下选择题的解题过程。你的目标是理解问题的本质以及解决问题所采取的步骤和逻辑。在理解的基础上,判断哪个选项是正确的答案。解题过程通常会逐步分析问题,并最终确定一个选项为正确答案。你需要关注解题的最终结论,通常会明确指出或暗示正确的选项是哪一个(例如通过排除错误选项或验证正确选项)。请只输出正确选项的字母(例如 A、B、C 或 D),不要包含任何额外的解释或步骤。";

        const messages = [
            {
                "role": "system",
                "content": systemInstruction
            },
            {
                "role": "user",
                "content": answerSteps
            }
        ];

        const payload = {
            model: "gemini-2.0-flash-lite",
            messages: messages,
        };

        return fetch(`${GEMINI_API_BASE_URL}chat/completions`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${GEMINI_API_KEY}`
            },
            body: JSON.stringify(payload)
        })
            .then(response => response.json())
            .then(data => {
            console.log('Gemini API 响应:', data);
            let retStr = data.choices[0].message.content;
            return retStr;
        });
    }

    function findButtonByText(text) {
        const buttons = document.getElementsByTagName('button');
        for (let i = 0; i < buttons.length; i++) {
            if (buttons[i].textContent.trim() === text) {
                return buttons[i];
            }
        }
        return null;
    }

    function IsFinish() {
        let nextButton = findButtonByText('做下一题');
        if(nextButton) {
            return true;
        }else {
            return false;
        }
    }

    async function FuckIt() {
    let questions = ""

        var mainQuestion = "";
        var subQuestion = "";
        document.querySelectorAll('.qpen-exercise-panel.qpen-block').forEach(tempBlock =>{
            if(tempBlock.querySelectorAll(".qpen-exercise-panel-header").length != 0){
                mainQuestion = " 题目:" + tempBlock.querySelector(".qpen-math-show-component.font-18").textContent + "\n";
            }else if(tempBlock.querySelectorAll(".qpen-exercise-panel-subheader").length != 0){
                subQuestion = "小题:" + tempBlock.querySelector(".qpen-math-show-component.font-18").textContent + "\n";
            }
        });

        //获取选项
        const stepChoiceWraps = document.querySelectorAll('.step-choice-wrap');

        var options = "";

        var answerCounter = 0
        stepChoiceWraps.forEach(wrapElement => {
            // 在每个 step-choice-wrap 元素中查找 ant-exercise-library 元素
            const exerciseLibraryElement = wrapElement.querySelector('.ant-exercise-library');
            if (exerciseLibraryElement) {
                // 获取 ant-exercise-library 元素的文本内容
                const questionText = String.fromCharCode(65 + answerCounter) + "," + exerciseLibraryElement.textContent.trim();
                options += questionText + "\n"
                answerCounter++;
            }
        });

        var history = "";

        const historyElements = document.querySelectorAll('.answered-steps.qpen-block');
        historyElements.forEach(historyElement =>{
            if(historyElement.querySelector(".qpen-math-show-component.font-16")){
                historyElement.querySelectorAll(".qpen-math-show-component.font-16").forEach(Element =>{
                    console.log(Element.querySelector(".ant-exercise-library").textContent);
                    history += Element.querySelector(".ant-exercise-library").textContent + "\n";
                });
            }
        })
        console.log("你的作答:" + history + "\n" + mainQuestion + subQuestion + "\n下一步解法选择哪个选项\n" + options);
        const answerSteps = await askGemini("你的作答:" + history + "\n" + mainQuestion + subQuestion + "\n下一步解法选择哪个选项\n" + options);
        console.log(answerSteps)
        let result = await analyzeResult(answerSteps);

        result = result.toUpperCase().replace(/[^A-D]/g, '');
        console.log(result)
        let index = -1;
        if(result === "A"){
            index = 0;
        }else if(result === "B"){
            index = 1;
        }else if(result === "C"){
            index = 2;
        }else if(result === "D"){
            index = 3;
        }else {
            return -1;
        }

        for (const wrapElement of stepChoiceWraps) {
            const exerciseLibraryElement = wrapElement.querySelector('.ant-exercise-library');
            if (exerciseLibraryElement) {
                if (!index--) {
                    wrapElement.click();
                    await Delay(200);
                    wrapElement.click();
                }
            }
        }
    }

    //点击后执行脚本
    getQuestionButton.addEventListener('click', async function() { // 将监听器函数声明为 async
        outputTextArea.value = '';
        while(true) {
            if(IsFinish()) {
                console.log("自动下一题")
                findButtonByText('做下一题').click();
            }
            await Delay(500);
            let statue = await FuckIt();
            if(statue == -1){
                break;
            }
            await Delay(500);
        }

    });

})();