Greasy Fork镜像 支持简体中文。

Google Forms Helper

Aids to solve google forms

目前為 2024-02-08 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Google Forms Helper
// @namespace    https://github.com
// @version      2.3
// @description  Aids to solve google forms
// @author       erucix
// @match        https://docs.google.com/forms/*
// @icon         https://www.gstatic.com/images/branding/product/1x/forms_2020q4_48dp.png
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    window.trustedTypes.createPolicy('default', {createHTML: (string, sink) => string});

    const formBlockHolderName = ".Qr7Oae";
    const questionHolderParentName = ".z12JJ";
    const questionHolderName = ".M7eMe";
    const optionsHolderName = ".nWQGrd.zwllIb";

    const searchEngine = "https://google.com/search?q=";

    const formBlockContainer = document.querySelectorAll(formBlockHolderName);

    formBlockContainer.forEach((element, index) => {
        attatchMenu(element);
        attatchAiBox(element);
        findAnswer(element);
    });

    function findAnswer(element) {
        fetch("https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText?key=AIzaSyCWvB0JMPgfzpdK9e3UtfDvSoTzrtDZ7ns", {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                prompt: {
                    text: "Which of the following option is correct for this question?\n" +
                    getQuestionWithOptions(element),
                },
            }),
        })
            .then(response => response.json())
            .then(data => {
            element.querySelector("#chatGPTAnswer").innerText = data?.candidates[0].output;
            autoClickAnswers(element, data?.candidates[0].output);
        })
            .catch(error => {
            element.querySelector("#chatGPTAnswer").innerText = "😢 Failed to fetch answer. ";
        });
    }

    function autoClickAnswers(destinationElement, answer) {
        const optionsHolder = destinationElement.querySelectorAll(optionsHolderName);
        optionsHolder?.forEach((element, index) => {

            if (answer.includes(element.textContent)) {
                element.querySelector(".Od2TWd.hYsg7c").click();
            }
        })
    }

    function attatchMenu(destinationElement) {
        const optionHolder = destinationElement.querySelectorAll(optionsHolderName);

        const searchButton = document.createElement("a");
        searchButton.setAttribute("target", "_blank");
        searchButton.classList.add("partofai");

        const copyButton = document.createElement("a");
        copyButton.setAttribute("target", "_blank");
        copyButton.classList.add("partofai");

        searchButton.textContent = "SEARCH";
        copyButton.textContent = "COPY";

        const searchButtonStyle = {
            color: "red",
            fontWeight: "bold",
            textDecoration: "none",
            padding: "0px",
        };

        const copyButtonStyle = {
            color: "blue",
            fontWeight: "bold",
            textDecoration: "none",
            padding: "10px",
            cursor: "pointer"
        };

        Object.assign(searchButton.style, searchButtonStyle);
        Object.assign(copyButton.style, copyButtonStyle);

        searchButton.href = searchEngine + encodeURIComponent(getQuestionWithOptions(destinationElement));

        copyButton.addEventListener("click", () => {
            navigator.clipboard.writeText(getQuestionWithOptions(destinationElement));

            copyButton.textContent = "COPIED";

            setTimeout(() => {
                copyButton.textContent = "COPY";
            }, 1000);
        });

        destinationElement.appendChild(searchButton);
        destinationElement.appendChild(copyButton);
    }

    function attatchAiBox(destinationElement) {
        const chatAnswerDiv = document.createElement('div');
        chatAnswerDiv.classList.add("partofai");

        const boldTextParagraph = document.createElement('p');
        boldTextParagraph.innerText = "👻 AI Answer:";

        const chatAnswerDivStyle = {
            backgroundColor: "rgba(139, 97, 238, 0.683)",
            padding: "5px 10px",
            borderRadius: "5px",
            marginBottom: "20px"
        };

        const boldTextParagraphStyle = {
            fontWeight: "bolder",
            padding: 0,
            margin: 0,
            color: "rgb(255, 255, 255)"
        };

        const hrElement = document.createElement('hr');
        hrElement.style.border = '1px solid white';

        const textContentParagraph = document.createElement('p');
        textContentParagraph.innerText = 'Waiting for AI to respond... 🤓';
        textContentParagraph.setAttribute("id", "chatGPTAnswer");

        const textContentParagraphStyle = {
            padding: 0,
            margin: 0,
            color: "black",
        };

        const br = document.createElement("br");
        const cr = document.createElement("br");

        Object.assign(chatAnswerDiv.style, chatAnswerDivStyle);
        Object.assign(boldTextParagraph.style, boldTextParagraphStyle);
        Object.assign(textContentParagraph.style, textContentParagraph);

        chatAnswerDiv.appendChild(boldTextParagraph);
        chatAnswerDiv.appendChild(hrElement);
        chatAnswerDiv.appendChild(textContentParagraph);
        chatAnswerDiv.prepend(br);
        chatAnswerDiv.appendChild(cr);

        destinationElement.appendChild(chatAnswerDiv);
    }

    function getQuestionWithOptions(destinationElement) {
        const questionContent = destinationElement.querySelector(questionHolderName)?.textContent;
        const optionHolders = destinationElement.querySelectorAll(optionsHolderName);

        let optionContent = "";

        optionHolders?.forEach((element, index) => {
            optionContent += element.textContent + "\n ";
        });

        let finalContent = questionContent + '\n' + (optionContent || "");

        return finalContent;
    }

    function b(element, color) {
        element.style.border = "2px solid " + color;
    }

    function doc_keyUp(e) {
        console.log(e.code);
        if (e.ctrlKey && e.code === 'AltLeft') {
            aiElements.forEach(e=>{
                e.classList.toggle('active');
                if(e.style.display == "none"){
                    e.style.display = '';
                }
            });
        }
    }

    let style = document.createElement("style");
    let aiElements = document.querySelectorAll(".partofai");
    let button = document.createElement("button");
    button.innerText = ".";

    Object.assign(button.style, {
        "position":"absolute",
        "top": "10px",
        "left": "10px",
        "border-radius": "50%",
        "height":"20px",
        "width": "20px"
    });

    button.addEventListener("click", function(){
        aiElements.forEach(e=>{
            e.classList.toggle('active');
            if(e.style.display == "none"){
                e.style.display = '';
            }
        });
    });

    document.body.appendChild(button);

    style.innerHTML = `
    .partofai.active {
    display: none;
    }
    `;

    document.body.appendChild(style);

    document.addEventListener('keyup', doc_keyUp, false);


    // Prompt user for countdown time
    var countdownTime = prompt("How many minutes do you want to serve this website?");
    var countdownSeconds = countdownTime * 60;

    // Create countdown timer element
    var timerElement = document.createElement('div');
    timerElement.id = 'countdown-timer';
    document.body.appendChild(timerElement);

    // Add inline CSS styles
    timerElement.style.position = 'fixed';
    timerElement.style.top = '10px';
    timerElement.style.right = '10px';
    timerElement.style.fontSize = '16px';
    timerElement.style.backgroundColor = '#fff';
    timerElement.style.padding = '10px';
    timerElement.style.border = '1px solid #ddd';
    timerElement.style.borderRadius = '5px';
    timerElement.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.1)';
    timerElement.style.zIndex = '9999';
    timerElement.style.cursor = 'pointer'; // Set cursor to pointer

    // Create audio element
    var audio = new Audio('https://cdn.pixabay.com/audio/2021/08/04/audio_c668156e64.mp3');

    // Flags to track the play/pause state
    var isPlaying = false;
    var isMusicPlaying = false;

    // Event listener for timer click
    timerElement.addEventListener('click', function () {
        // Check if the countdown is less than or equal to 60 seconds (alert time)
        if (countdownSeconds <= 60) {
            if (isPlaying) {
                // Pause the audio
                audio.pause();
            } else {
                // Play the audio
                audio.play();
            }

            // Toggle the play/pause state
            isPlaying = !isPlaying;
        }
    });

    // Update timer every second
    var countdownInterval = setInterval(function () {
        var minutes = Math.floor(countdownSeconds / 60);
        var seconds = countdownSeconds % 60;

        // Update timer display
        timerElement.innerHTML = 'Time Remaining: ' + minutes + 'm ' + seconds + 's';

        // Check if the countdown is less than or equal to 60 seconds (alert time)
        if (countdownSeconds <= 60) {
            // Check if the music should play automatically
            if (!isMusicPlaying) {
                // Play the audio
                audio.play();

                // Set the flag to true
                isMusicPlaying = true;
            }

            // Adjust font size and padding dynamically
            var fontSize = 16 + Math.sin(countdownSeconds * 0.1) * 4; // Adjust the multiplier for speed
            var padding = 10 + Math.sin(countdownSeconds * 0.1) * 5; // Adjust the multiplier for speed

            timerElement.style.fontSize = fontSize + 'px';
            timerElement.style.padding = padding + 'px';
        }

        // Check if the countdown reached 0
        if (countdownSeconds <= 0) {
            clearInterval(countdownInterval);

            // Stop the audio
            audio.pause();
            audio.currentTime = 0;

            // Remove the timer element
            document.body.removeChild(timerElement);
        }

        // Decrease countdown seconds
        countdownSeconds--;
    }, 1000);





})();

QingJ © 2025

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