- // ==UserScript==
- // @name [Outdated] Get Into PC - Direct Download
- // @description [Outdated] Extract the direct file download links from the redirecting pages.
- // @namespace RainSlide
- // @author RainSlide
- // @icon https://getintopc.com/wp-content/uploads/Getintopc.png
- // @version 1.0.20200629.outdated
- // @match https://getintopc.com/*
- // @grant GM_xmlhttpRequest
- // @grant GM_getValue
- // @grant GM_setValue
- // @inject-into context
- // @run-at document-end
- // ==/UserScript==
-
- "use strict";
-
- document.querySelectorAll('body .post-content > form[action]').forEach(
- form => form.addEventListener(
- "submit", event => {
-
- event.stopImmediatePropagation();
- event.preventDefault();
-
- // //
-
- form = this.form || event.target;
-
- const data = new URLSearchParams( new FormData(form) ).toString();
-
- // "URL" is for webpages, and "link" is for direct file download links
-
- const currentURL = location.origin + location.pathname;
- const middleURL = form.action || location.origin + "/wait-for-access/";
- const finalURL = GM_getValue("finalURL") || (() => {
- const temp = "https://share-knowledgee.info/please-wait-file-will-download-automatically-2/";
- GM_setValue("finalURL", temp);
- return temp;
- })();
-
- const xhr = ( url, referrer, success = null, failed = null ) =>
- GM_xmlhttpRequest({
- "url": url,
- "method": "POST",
- "responseType": "text",
- "anonymous": true,
- "headers": {
- "Content-Type" : "application/x-www-form-urlencoded",
- "Origin" : "https://getintopc.com",
- "Referrer" : referrer
- },
- "data": data,
- "onload": success,
- "onerror": failed,
- "ontimeout": failed
- });
-
- const isString = something =>
- Object.prototype.toString.call(something) === "[object String]";
-
- const sanitizeURL = rawURL => new URL(rawURL).toString();
-
- // Call String.prototype.match(), and get a capturing group from the return value of it
- const getGroupfromMatch = ( str, regex, index = 1 ) => {
- if (
- isString(str) &&
- Object.prototype.toString.call(regex) === "[object RegExp]"
- ) {
- const matchResults = String.prototype.match.call(str, regex); // str.match(regex);
- return Array.isArray(matchResults)
- && isString(matchResults[index])
- && matchResults[index];
- } else {
- return false;
- }
- };
-
- // Extract, sanitize and return the direct download link
- const getLink = response => {
- const rawLink = getGroupfromMatch( response, /"location.href = ('.+?');"/ );
- if ( rawLink ) {
- const link = JSON.parse(
- rawLink.replace( /"/g, '\\"' ).replace( /^'|'$/g, '"' )
- );
- return isString(link) && sanitizeURL(link);
- } else {
- return false;
- }
- }
-
- // submit(): form.submit()
- const submit = () => form.submit();
-
- // refreshFinalURL(): fetch the middle URL for a new final URL
- const refreshFinalURL = () => xhr(
- middleURL, currentURL, xhrEvent => {
- // 1. fetch success, try to get a new final URL from middle URL
- const newFinalURL = sanitizeURL(
- getGroupfromMatch(
- xhrEvent.responseText || xhrEvent.response,
- /<form id="gip_form" action="(.+?)" rel="nofollow" method="post">/
- )
- );
-
- if ( newFinalURL && newFinalURL !== finalURL ) {
- // 1.1. the new final URL is valid and is not the old one, test it in action
- xhr(
- newFinalURL, middleURL, xhrEvent => {
- const newLink = getLink(xhrEvent.responseText || xhrEvent.response);
- if (newLink) {
- // 1.1.1. it works, store the final URL, navgate to the link, end
- GM_setValue("finalURL", newFinalURL);
- location.href = Link;
- return undefined;
- // 1.1.2. it doesn't work, submit(), end
- } else submit();
- }
- );
- // 1.2. can't find a usable new final URL, submit(), end
- } else submit();
- submit();
- // 2. fetch failed, submit(), end
- }, submit
- );
-
- // Entry point: fetch the final URL
- xhr(
- finalURL, middleURL, xhrEvent => {
- // 1. fetch success, try to get the link from final URL
- const link = getLink(xhrEvent.responseText || xhrEvent.response);
- link
- ? location.assign(link) // 1.1. it works, just navgate to the link and end
- : refreshFinalURL(); // 1.2. something is wrong, refreshFinalURL()
- // 2. fetch failed, refreshFinalURL()
- }, refreshFinalURL
- );
-
- // //
-
- }
- )
- );