您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A small script to skip the silly countdown of One Piece Ex website
- // ==UserScript==
- // @name OpEx Countdown Skip
- // @name:pt-BR OpEx Pula Tempo de Espera
- // @autor SecretX
- // @namespace namespace_secretx
- // @description A small script to skip the silly countdown of One Piece Ex website
- // @description:pt-br Um pequeno script para pular o contador irritante do site OpEx
- // @version 2022.11.16
- // @match *://onepiecex.*/download/?*
- // @match *://onepieceex.*/download/?*
- // @match *://onepiecex.*/dw/*/*/*/*
- // @match *://onepieceex.*/dw/*/*/*/*
- // @run-at document-start
- // @grant GM.xmlHttpRequest
- // @icon https://onepieceex.net/favicon/favicon-32x32.png
- // @license GNU LGPLv3
- // ==/UserScript==
- const opexTorrentRegex = /^\w+:\/\/onepiecee?x\.\w+\/download\/\?\d+$/i;
- const opexServerRegex = /^\w+:\/\/onepiecee?x\.\w+\/dw\/(?:\d+\/?)+$/i;
- Object.defineProperty(Array.prototype, "firstNotNull", {
- value: function firstNotNull() {
- for (const element of this) if (element != null) return element;
- throw new Error("Array contains no non null element.");
- },
- writable: true,
- configurable: true
- });
- function isDownloadFromOpexServer() {
- const url = window.location.href;
- return opexServerRegex.test(url);
- }
- function isDownloadFromTorrentServer() {
- const url = window.location.href;
- return opexTorrentRegex.test(url);
- }
- // Torrent protector bypass methods
- const countElem = () => document.getElementById("contador");
- const awaitElem = () => document.getElementById("aguarde");
- const countdownScript = () => document.querySelector("body > script:nth-child(4)").innerText;
- function firstScriptLineThatMatches(regex) {
- return countdownScript().split("\n")
- .map(line => line.trim().match(regex))
- .firstNotNull();
- }
- function bypassTorrentProtector() {
- const magnetLinkRegex = /^.+?href="(magnet[^"]+)".*$/i;
- try {
- const magnetLink = firstScriptLineThatMatches(magnetLinkRegex)[1];
- console.info(`Automatically redirecting you to the extracted magnet link from this page: ${magnetLink}`);
- haltAllPageIntervals();
- try {
- countElem().remove();
- awaitElem().innerText = "Protetor desativado =)";
- } catch (e) {}
- window.location.replace(magnetLink);
- } catch (e) {
- console.error(`Oops, this script was not able to automatically grab the magnet link from this page because of an error. Using fallback that set the countdown to 1. ${e}`);
- countElem().innerHTML = 1;
- }
- }
- // Opex protector bypass methods
- function doRequest(httpMethod, url) {
- const hostRegex = /\w+:\/\/((?:\w+\.?)+)/;
- return new Promise((resolve, reject) => {
- GM.xmlHttpRequest({
- method: httpMethod.toUpperCase(),
- url: url,
- onload: resolve,
- onerror: reject,
- responseType: "text",
- timeout: 6000,
- headers: {
- "Accept": "application/json, text/javascript, */*; q=0.01",
- "Accept-Encoding": "gzip, deflate, br",
- "Accept-Language": "en-US,en;q=0.5",
- "Cache-Control": "no-cache",
- "Connection": "keep-alive",
- "DNT": "1",
- "Host": url.match(hostRegex)[1],
- "Origin": window.location.origin,
- "Referer": window.location.origin,
- "Pragma": "no-cache",
- "Sec-Fetch-Dest": "empty",
- "Sec-Fetch-Mode": "cors",
- "Sec-Fetch-Site": "cross-site",
- }
- });
- });
- }
- function haltAllPageIntervals() {
- // Get a reference to the last interval + 1
- const interval_id = window.setInterval(function(){}, Number.MAX_SAFE_INTEGER);
- // Clear any timeout/interval up to that id
- for (let i = 1; i < interval_id; i++) {
- window.clearInterval(i);
- }
- }
- function bypassOpexServerProtector() {
- const scriptRegex = /https?:\/\/(?:\w+\.?)+\/\?code=[^'"]+/i;
- const requestUrl = Array.from(document.querySelector("head").children)
- .filter(node => node.nodeName === "SCRIPT")
- .map(node => node.innerText)
- .filter(script => script != null && script.length > 0)
- .map(script => script.match(scriptRegex))
- .firstNotNull()[0];
- if (requestUrl == null || typeof requestUrl !== "string") {
- console.error("Oops, this script was not able to automatically grab the request URL from the header.");
- return;
- }
- doRequest("GET", requestUrl)
- .then(response => {
- try {
- const downloadLink = JSON.parse(response.responseText).link;
- haltAllPageIntervals();
- const loadingDiv = document.getElementById("andamento");
- loadingDiv.setAttribute("style", "width: 100%; background: rgba(65, 26, 26, 0.9) none repeat scroll 0% 0%; display: block !important;");
- const messageButton = document.getElementById("mensagem");
- messageButton.innerText = "Protetor desativado =)"
- const downloadButton = document.getElementById("link");
- downloadButton.href = downloadLink;
- downloadButton.innerText = "Baixar";
- downloadButton.setAttribute("style", "display: inline !important;");
- } catch (e) {
- console.error(`Could not bypass page. Requested URL ${requestUrl}. Status code: ${response.status}. Server response: ${response.responseText}`, e);
- }
- })
- .catch(e => console.error(`Could not bypass page. Requested URL ${requestUrl}`, e));
- }
- window.addEventListener("DOMContentLoaded", function() {
- 'use strict';
- if (isDownloadFromTorrentServer()) {
- bypassTorrentProtector();
- } else if (isDownloadFromOpexServer()) {
- bypassOpexServerProtector();
- }
- }, false);