// ==UserScript== // @name Aptoide下载器 // @namespace Violentmonkey Scripts // @match *://*.aptoide.com/* // @grant none // @version 1.0 // @author heham // @description Aptoide网站直接下载APK // @downloadURL none // ==/UserScript== function displayButton(apkUrl) { let a = document.createElement('a'); a.href = apkUrl; a.className = "gradient-button__GradientButton-gcc0dg-0 fGvaKr"; let div = document.createElement('div'); a.appendChild(div); let span = document.createElement('span'); span.appendChild(document.createTextNode('直接下载APK')); div.appendChild(span); let prevButton = document.getElementsByClassName('gradient-button__GradientButton-gcc0dg-0 fGvaKr')[0]; prevButton.parentNode.insertBefore(a, prevButton.nextElementSibling); } function displayObbButton(fileUrl, label) { let a = document.createElement('a'); a.href = fileUrl; a.className = "aptweb-button--app"; let div = document.createElement('div'); div.className = "aptweb-button aptweb-button--big aptweb-button--red"; a.appendChild(div); let span = document.createElement('span'); span.appendChild( document.createTextNode( 'Download OBB ' + label.replace(/(^| )(\w)/g, String.toUpperCase) ) ); div.appendChild(span); let prevButton = Array.from(document.getElementsByClassName('aptweb-button--app')).pop(); prevButton.parentNode.insertBefore(a, prevButton.nextElementSibling); prevButton.parentNode.insertBefore(document.createElement('p'), prevButton.nextElementSibling); } (function () { if (!document.querySelector('script[id="__NEXT_DATA__"]')) { // package not found return; } var txt = document.querySelector('script[id="__NEXT_DATA__"]').textContent; //var json = eval("(" + txt + ")"); var json = JSON.parse(txt); //var json = (new Function("return " + txt))(); let apkPackage = json.props.pageProps.app.package; let xhr = new XMLHttpRequest(); // API v7 let url = 'https://ws2.aptoide.com/api/7/app/getMeta/package_name=' + apkPackage; xhr.responseText = 'text'; xhr.open('GET', url); xhr.onload = function () { if (xhr.status === 200) { let responseData = JSON.parse(xhr.responseText); //alert(responseData.data.file.path); displayButton(responseData.data.file.path); try { for (let okey of Object.keys(responseData.data.obb)) { console.log(responseData, okey); displayObbButton(responseData.data.obb[okey].path, okey); } } catch (error) { console.log(error); } } else { console.log('Incomplete status during request to ' + url, xhr.statusText); } }; xhr.onerror = function () { console.log('Error during request to ' + url, xhr.statusText); }; xhr.send(); })();