☰

AutoAlura

Ninguem aguenta mais o alura 😃

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         AutoAlura
// @namespace    http://tampermonkey.net/
// @version      13
// @description  Ninguem aguenta mais o alura 😃
// @author       Alfinhoz
// @match        https://cursos.alura.com.br/*
// @license GNU GPLv3
// @icon https://imgs.search.brave.com/q-X8zxRbD9z64iH9Hr2d2LpfwG1L1kDsjKs1SUzyjNI/rs:fit:500:0:0:0/g:ce/aHR0cHM6Ly9hdHRh/Y2htZW50cy5ndXB5/LmlvL3Byb2R1Y3Rp/b24vY29tcGFuaWVz/Lzg4ODEvY2FyZWVy/LzIwNjAyL2ltYWdl/cy8yMDI0LTA3LTEy/XzE1LTEzX2NvbXBh/bnlMb2dvVXJsLmpw/Zw
// ==/UserScript==

(function () {
  "use strict";

  let isScriptActive = JSON.parse(localStorage.getItem("scriptAtivo"));
  if (isScriptActive === null) {
    isScriptActive === true;

    localStorage.setItem("scriptAtivo", JSON.stringify(isScriptActive));
  }
  let blockClickDelay = 1000;

  function createLogContainer() {
    let logContainer = document.getElementById("autoAluraLogContainer");
    if (!logContainer) {
      logContainer = document.createElement("div");
      logContainer.id = "autoAluraLogContainer";
      logContainer.style.position = "fixed";
      logContainer.style.bottom = "10px";
      logContainer.style.right = "10px";
      logContainer.style.maxHeight = "200px";
      logContainer.style.width = "300px";
      logContainer.style.overflow = "hidden";
      logContainer.style.padding = "10px";
      logContainer.style.zIndex = "999";
      logContainer.style.display = "flex";
      logContainer.style.flexDirection = "column-reverse";

      document.body.appendChild(logContainer);
    }
    return logContainer;
  }

  function logToScreen(message) {
    const logContainer = createLogContainer();
    const logMessage = document.createElement("div");

    logMessage.textContent = message;
    logMessage.style.background = "rgba(0, 0, 0, 0.7)";
    logMessage.style.color = "#fff";
    logMessage.style.padding = "8px";
    logMessage.style.margin = "5px 0";
    logMessage.style.borderRadius = "5px";
    logMessage.style.fontSize = "14px";
    logMessage.style.opacity = "1";
    logMessage.style.transition =
      "opacity .5s ease-out, transform .5s ease-out";

    logContainer.appendChild(logMessage);

    setTimeout(() => {
      logMessage.style.opacity = "1";
      logMessage.style.transform = "translateY(0)";
    }, 10);

    setTimeout(() => {
      logMessage.style.opacity = "0";
      logMessage.style.transform = "translateY(-15px)";
      setTimeout(() => logMessage.remove(), 500);
    }, 3000);
  }
  const water_mark = document.querySelector(".formattedText");
  if (water_mark) {
    water_mark.innerHTML = "É o Alfinhoz ✯";
  }

  async function autoPlayVideo() {
    const video = document.querySelector("video");
    if (video && video.paused) {
      logToScreen("Vídeo encontrado, iniciando...");
      video.play();
      await new Promise((resolve) => {
        video.onplay = resolve;
      });
      logToScreen("Vídeo reproduzido.");
      return true;
    }
    return false;
  }

  function clickCorrectAlternative() {
    let correctAlternatives = document.querySelectorAll(
      'ul.alternativeList li[data-correct="true"]'
    );
    if (correctAlternatives.length > 0) {
      correctAlternatives.forEach((li) => {
        const radioInput = li.querySelector('input[type="radio"]');
        if (radioInput && !li.classList.contains("clicked")) {
          radioInput.click();
          logToScreen("Clicando na alternativa correta: " + li.innerText);
          const event = new Event("change", {
            bubbles: true,
            cancelable: true,
          });
          radioInput.dispatchEvent(event);
          li.classList.add("clicked");
        }
      });
      return true;
    }
    return false;
  }

  async function clickMultitaskAlternatives() {
    const multitaskSections = document.querySelectorAll(
      "section.task.class-page-for-MULTIPLE_CHOICE"
    );
    let alternativesClicked = false;

    logToScreen("Verificando as seções MULTIPLE_CHOICE.");

    for (let section of multitaskSections) {
      const taskBody = section.querySelector(".task-body");
      if (taskBody) {
        const taskWrapper = taskBody.querySelector(".task-body__wrapper");
        if (taskWrapper) {
          const mainContainer = taskWrapper.querySelector(
            ".task-body-main.container"
          );
          if (mainContainer) {
            const multipleChoiceSection = mainContainer.querySelector(
              ".multipleChoice#task-content"
            );
            if (multipleChoiceSection) {
              const container =
                multipleChoiceSection.querySelector("div.container");
              if (container) {
                const alternativeList =
                  container.querySelector("ul.alternativeList");
                if (alternativeList) {
                  const form = alternativeList.querySelector("form");
                  if (form) {
                    const correctAlternatives = form.querySelectorAll(
                      'li[data-correct="true"]'
                    );

                    if (correctAlternatives.length > 0) {
                      logToScreen("Alternativas corretas encontradas.");
                      correctAlternatives.forEach((li) => {
                        const checkboxInput = li.querySelector(
                          'input[type="checkbox"]'
                        );
                        if (checkboxInput) {
                          if (!li.classList.contains("clicked")) {
                            checkboxInput.click();
                            logToScreen(
                              "Clicando na alternativa correta (checkbox): " +
                                li.querySelector(
                                  ".alternativeList-item-alternative"
                                ).textContent
                            );
                            const event = new Event("change", {
                              bubbles: true,
                              cancelable: true,
                            });
                            checkboxInput.dispatchEvent(event);
                            li.classList.add("clicked");
                            alternativesClicked = true;
                          }
                        }
                      });
                    } else {
                      logToScreen("Nenhuma alternativa correta encontrada.");
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    return alternativesClicked;
  }

  function decodeBase64(encoded) {
    const decoded = atob(encoded);
    return decoded;
  }

  async function clickBlocksInOrder() {
    logToScreen("Iniciando a função clickBlocksInOrder.");
    const blocksContainer = document.querySelector(".blocks");
    if (blocksContainer) {
      const correctOrder = blocksContainer.dataset.correctOrder;
      const firstDecoding = decodeBase64(correctOrder);
      const secondDecoding = decodeBase64(firstDecoding);
      let decodedTexts = decodeURIComponent(escape(secondDecoding))
        .split(",")
        .map((text) => text.trim());
      logToScreen("Textos decodificados:", decodedTexts);
      let blockButtons = Array.from(blocksContainer.querySelectorAll(".block")); // Alterado para let
      logToScreen("Total de botões disponíveis:", blockButtons.length);

      for (const text of decodedTexts) {
        let blockButton;
        let attempts = 0;

        while (attempts < 5) {
          blockButton = blockButtons.find(
            (button) => button.textContent.trim() === text
          );
          if (blockButton && !blockButton.classList.contains("clicked")) {
            try {
              blockButton.click();
              logToScreen("Clicando no bloco: " + text);
              blockButton.classList.add("clicked");
              await new Promise((resolve) =>
                setTimeout(resolve, blockClickDelay)
              );
              break;
            } catch (error) {
              console.error("Erro ao clicar no bloco: ", error);
            }
          } else {
            logToScreen(
              "Tentativa " +
                (attempts + 1) +
                ": Botão não encontrado ou já clicado para o texto: " +
                text
            );
          }
          attempts++;
          await new Promise((resolve) => setTimeout(resolve, 500));
        }

        blockButtons = blockButtons.filter(
          (button) => !button.classList.contains("clicked")
        );
      }

      await submitAnswer();

      await new Promise((resolve) => setTimeout(resolve, 3000));

      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        logToScreen("Avançando para a próxima página após clicar nos blocos.");
      }
    } else {
      logToScreen("Container de blocos não encontrado.");
    }
  }

  function submitAnswer() {
    let submitButton = document.querySelector("#submitBlocks");
    if (submitButton) {
      submitButton.click();
      logToScreen("Clicando em 'Submeter resposta'.");
    }
  }

  async function handlePageActivity() {
    logToScreen("Verificando atividade na página.");

    const videoPlayed = await autoPlayVideo();
    if (videoPlayed) {
      logToScreen("Avançando para a próxima página após o vídeo.");
      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        return;
      }
    }

    // Verificando uma escolha
    const alternativesClicked = clickCorrectAlternative();
    if (alternativesClicked) {
      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        logToScreen(
          "Avançando para a próxima página após clicar na alternativa correta."
        );
      }
      return;
    }

    // Verificando multitask
    const multitaskClicked = await clickMultitaskAlternatives();
    if (multitaskClicked) {
      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        logToScreen(
          "Avançando para a próxima página após clicar na alternativa multitask."
        );
      }
      return;
    }

    await clickBlocksInOrder();

    let nextButton = document.querySelector(
      "button.next, " +
        "a.next, " +
        'input[type="submit"].next, ' +
        ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
        ".bootcamp-next-button, " +
        ".bootcamp-primary-button-theme"
    );
    if (nextButton) {
      nextButton.click();
      logToScreen("Avançando para a próxima página.");
    }
  }

  function monitorPage() {
    let interval = setInterval(async () => {
      if (!isScriptActive) return;

      await handlePageActivity();
    }, 3000);
  }

  function init() {
    monitorPage();
  }

  const controlButton = document.createElement("button");
  controlButton.textContent = isScriptActive
    ? "Desativar Script"
    : "Ativar Script";
  controlButton.style.position = "fixed";
  controlButton.style.top = "10px";
  controlButton.style.right = "10px";
  controlButton.style.padding = "10px";
  controlButton.style.zIndex = "999";
  controlButton.style.backgroundColor = "#00ff1f";
  controlButton.style.color = "white";
  controlButton.style.border = "none";
  controlButton.style.borderRadius = "5px";
  controlButton.style.cursor = "pointer";
  document.body.appendChild(controlButton);

  controlButton.addEventListener("click", () => {
    isScriptActive = !isScriptActive;
    localStorage.setItem("scriptAtivo", JSON.stringify("isScriptActive"));
    controlButton.innerText = isScriptActive
      ? "Desativar Script"
      : "Ativar Script";
    controlButton.style.backgroundColor = isScriptActive
      ? "#ff0000"
      : "#00ff1f";
    logToScreen(isScriptActive ? "Script Ativado" : "Script Desativado");
  });

  init();
})();