您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Direct download link buttons
- // ==UserScript==
- // @name JetBrainsDirectLink
- // @namespace https://www.jetbrains.com/
- // @version 1.0
- // @description Direct download link buttons
- // @author You
- // @match https://www.jetbrains.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=jetbrains.com
- // @grant none
- // @run-at document-start
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- const path = window.location.pathname.split("/").filter(p => p.length > 0);
- if (path.length !== 2 || path[1] !== "download") return;
- const systems = ["windows", "macos", "linux"];
- let processDownloads = (downloads) => {
- const buttons = systems.reduce((map, name) => (map[name] = document.querySelector(`a[href*="download-thanks.html?platform=${name.substr(0, 3)}"]`), map), {});
- const elements = systems.reduce((map, name) => (map[name] = [document.createElement('br')], map), {});
- for (const target in downloads) {
- const system = systems.find(system => target.startsWith(system.substr(0, 3)));
- if (!system) continue;
- const button = document.createElement('a');
- button.setAttribute('href', downloads[target].link);
- button.text = `Download (${target})`;
- elements[system].push(button);
- elements[system].push(document.createElement('br'));
- }
- for (const system of systems) {
- const elementArray = elements[system];
- if (elementArray.length < 2) continue;
- let nextElement = buttons[system];
- while (!nextElement.parentNode.className.includes('__block'))
- nextElement = nextElement.parentNode;
- for (const element of elementArray) {
- nextElement.parentNode.insertBefore(element, nextElement);
- nextElement = element;
- }
- }
- }
- const openFn = XMLHttpRequest.prototype.open;
- XMLHttpRequest.prototype.open = function (...args) {
- if (args.length > 1 && typeof args[1] === "string" &&
- args[1].startsWith("https://data.services.jetbrains.com/products/releases")) {
- XMLHttpRequest.prototype.open = openFn;
- fetch(args[1]).then(response => response.json().then(json => {
- const process = processDownloads;
- if (process != null) {
- processDownloads = null;
- process(json[Object.keys(json)[0]][0].downloads);
- }
- }));
- }
- return openFn.apply(this, args);
- }
- })();