您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Help you to download the pytorch.
// ==UserScript== // @name Download_Pytorch // @namespace http://tampermonkey.net/ // @version 0.2 // @description Help you to download the pytorch. // @author YuhangTian // @match https://pytorch.org/get-started/previous-versions/ // @icon https://www.google.com/s2/favicons?sz=64&domain=pytorch.org // @grant GM_xmlhttpRequest // @connect * // @license MIT // ==/UserScript== (async() => { 'use strict'; console.log("test damn"); // Your code here... var all_text; //console.log(all_text); function fetchTextFromURL(url, callback) { GM_xmlhttpRequest({ method: "GET", url: url, headers: { "Content-Type": "application/json" }, onload: function(response) { callback(response.responseText); } }); } fetchTextFromURL("https://download.pytorch.org/whl/torch_stable.html", function(all_text) { // 查找所有具有以 "wheel" 开头的ID的元素 var wheelElements = document.querySelectorAll('[id^="wheel"]'); // 遍历每个匹配的 "wheel" 元素 wheelElements.forEach(function(targetElement) { // 创建按钮元素 var downloadButton = document.createElement("button"); downloadButton.textContent = "Download"; // 将按钮添加到页面(放在目标元素的后面) targetElement.parentNode.insertBefore(downloadButton, targetElement.nextSibling); // 添加按钮的点击事件监听器 downloadButton.addEventListener("click", function() { var linuxAndWindowsElement = targetElement.nextElementSibling; // 查找该元素后面的第一个具有 "class" 为 "language-plaintext highlighter-rouge" 的文本块 var codeBlock = findCodeBlock(linuxAndWindowsElement); //console.log(codeBlock.textContent); if (codeBlock) { // 提取文本块中的文本 var text = codeBlock.textContent; var textSegments = text.split("#"); var pattern = /(\btorch|torchvision|torchaudio)==([^ ]+)/g; var versions = {}; // 使用正则表达式匹配并提取版本信息 for (var i = 1; i < textSegments.length; i++) { console.log(textSegments[i]); var segment = textSegments[i]; var matches; while ((matches = pattern.exec(segment)) !== null) { if (matches) { if (!versions[i]) { versions[i] = {}; } versions[i][matches[1]] = matches[2]; } } } var links=[]; for(var j=1;j<textSegments.length;j++) { if(versions[j]['torch'].includes("+")) { //console.log(1); var cuda_version=versions[j]['torch'].split('+')[1]; var torch_version=versions[j]['torch'].split('+')[0]; } else { torch_version=versions[j]['torch']; cuda_version=textSegments[j].split('\n')[0]; if(cuda_version.includes("ROCM")) { cuda_version=cuda_version.replace(/[^a-zA-Z0-9.]+/g, '').toLowerCase(); var regex = /rocm\d+\.\d+\.\d+/i; const match=cuda_version.match(regex); cuda_version=match[0]; } else if(cuda_version.includes("CUDA")) { const regex = /CUDA (\d+\.\d+)/; const match = cuda_version.match(regex); cuda_version = "cu" + match[1].replace('.', ''); } else { cuda_version="cpu"; } } //console.log(cuda_version); var pattern1 = new RegExp(`href="${cuda_version}/torch-${torch_version}.*`, 'g'); var foundSections = []; links.push("cuda_version:"+cuda_version+"\n"); links.push("torch:\n"); while ((matches = pattern1.exec(all_text)) !== null) { var pattern_ = /href="([^"]*)"/g; var link = pattern_.exec(matches[0]); link="https://download.pytorch.org/whl/"+link[1]; links.push(link); } links.push("\n"); links.push("torchaudio:\n"); var torchaudio_version=versions[j]['torchaudio']; pattern1 = new RegExp(`href="${cuda_version}/torchaudio-${torchaudio_version}.*`, 'g'); while ((matches = pattern1.exec(all_text)) !== null) { pattern_ = /href="([^"]*)"/g; link = pattern_.exec(matches[0]); link="https://download.pytorch.org/whl/"+link[1]; links.push(link); } links.push("\n"); links.push("torchvision:\n"); var torchvision_version=versions[j]['torchvision'].split('+')[0]; pattern1 = new RegExp(`href="${cuda_version}/torchvision-${torchvision_version}.*`, 'g'); while ((matches = pattern1.exec(all_text)) !== null) { pattern_ = /href="([^"]*)"/g; link = pattern_.exec(matches[0]); link="https://download.pytorch.org/whl/"+link[1]; links.push(link); } links.push("\n"); } console.log(links); var textarea = document.createElement("textarea"); textarea.rows = 20; // 设置文本框的行数 textarea.cols = 100; // 设置文本框的列数 // 将检索到的链接信息填充到文本框中 textarea.value = links.join("\n"); // 创建一个模态框(弹出框)来显示文本框 var modal = document.createElement("div"); modal.style.position = "fixed"; modal.style.top = "0"; modal.style.left = "0"; modal.style.width = "100%"; modal.style.height = "100%"; modal.style.backgroundColor = "rgba(0, 0, 0, 0.7)"; modal.style.display = "flex"; modal.style.justifyContent = "center"; modal.style.alignItems = "center"; // 将文本框添加到模态框中 modal.appendChild(textarea); // 添加模态框到页面 document.body.appendChild(modal); // 添加关闭按钮以关闭模态框 var closeButton = document.createElement("button"); closeButton.textContent = "Close"; closeButton.addEventListener("click", function() { document.body.removeChild(modal); }); modal.appendChild(closeButton); } else { console.log("Could not find code block with the specified class."); } }); }); // 查找指定元素后面的第二个具有指定 class 的文本块 function findCodeBlock(startingElement) { var currentElement = startingElement.nextElementSibling; var count = 0; while (currentElement) { if (currentElement.classList.contains("language-plaintext") && currentElement.classList.contains("highlighter-rouge")) { count++; if (count === 2) { return currentElement; } } currentElement = currentElement.nextElementSibling; } return null; // 未找到匹配的文本块 } }); })();