您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Скачивание с нексуса в 1 клик
当前为
- // ==UserScript==
- // @name Nexus One Click Download
- // @description:ru-RU Скачивание с нексуса в 1 клик
- // @description:en-EN Nexus One Click Download
- // @namespace Violentmonkey Scripts
- // @match https://www.nexusmods.com/*/mods/*
- // @grant GM.xmlHttpRequest
- // @version 1.1
- // @license MIT
- // @description Скачивание с нексуса в 1 клик
- // ==/UserScript==
- (async function () {
- const lang = navigator.language.startsWith('ru') ? 'ru' : 'en';
- const messages = {
- ru: { error: 'ОШИБКА', loading: 'ЗАГРУЗКА...', wait: 'ОЖИДАНИЕ...', success: 'УСПЕШНО', alert: 'Ошибка при загрузке:\n' },
- en: { error: 'ERROR', loading: 'LOADING...', wait: 'WAITING...', success: 'SUCCESS', alert: 'Error occurred while downloading:\n' }
- };
- const ajax = async ({ url, method = 'GET', data = null, headers = {} }) => {
- try {
- const res = await fetch(url, { method, body: data, headers: { ...headers, 'X-Requested-With': 'XMLHttpRequest' } });
- if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`);
- return await res.text();
- } catch (e) {
- console.error(e);
- throw e;
- }
- };
- const setButtonState = (btn, state) => {
- btn.style.backgroundColor = { error: 'red', loading: 'black', wait: 'yellow', success: 'green' }[state];
- btn.innerText = messages[lang][state];
- };
- const handleClick = async (e) => {
- const href = e.currentTarget.href || window.location.href;
- const params = new URL(href).searchParams;
- if (!params.get('file_id')) return;
- e.preventDefault();
- const btn = e.currentTarget;
- setButtonState(btn, 'wait');
- try {
- const gameId = document.getElementById('section')?.dataset.gameId || window.current_game_id;
- const fileId = params.get('file_id') || params.get('id');
- const nmmParam = params.get('nmm');
- if (!fileId || !gameId) throw new Error('Missing parameters');
- let downloadUrl;
- if (!nmmParam) {
- const resText = await ajax({
- url: '/Core/Libs/Common/Managers/Downloads?GenerateDownloadUrl',
- method: 'POST',
- data: `fid=${fileId}&game_id=${gameId}`,
- headers: { Origin: href, Referer: href, 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }
- });
- downloadUrl = JSON.parse(resText)?.url;
- } else {
- const resText = await ajax({ url: href, headers: { Origin: href, Referer: document.location.href } });
- downloadUrl = new DOMParser().parseFromString(resText, 'text/html').querySelector('#slowDownloadButton')?.dataset.downloadUrl;
- }
- if (downloadUrl) {
- setButtonState(btn, 'loading');
- setTimeout(() => (window.location.href = downloadUrl), 1000);
- setButtonState(btn, 'success');
- } else throw new Error('Download URL not found');
- } catch (err) {
- setButtonState(btn, 'error');
- alert(messages[lang].alert + err.message);
- }
- };
- const addListenersToButtons = () => {
- document.querySelectorAll('a.btn:not([data-listener])').forEach((btn) => {
- btn.addEventListener('click', handleClick);
- btn.setAttribute('data-listener', true);
- });
- };
- new MutationObserver(() => addListenersToButtons()).observe(document.body, { childList: true, subtree: true });
- addListenersToButtons();
- })();