您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
If you have a script manager and you want to download some script without installing it, this script will help
当前为
- // ==UserScript==
- // @name GreasyFork: download script button
- // @description If you have a script manager and you want to download some script without installing it, this script will help
- // @namespace https://greasyfork.org/users/424058
- // @version 1.1.1
- // @author Konf
- // @match https://greasyfork.org
- // @include /^http(s|):\/\/greasyfork.org\/[a-zA-Z_-]*\/scripts\/\d.*$/
- // @run-at document-end
- // @resource iconDownload https://img.icons8.com/pastel-glyph/64/ffffff/download.png
- // @compatible Chrome
- // @compatible Opera
- // @compatible Firefox
- // @grant GM_getResourceUrl
- // @grant GM.getResourceUrl
- // @noframes
- // ==/UserScript==
- /* jshint esversion: 6 */
- /* eslint-disable no-multi-spaces */
- (function() {
- 'use strict';
- const userLang = location.pathname.split('/')[1];
- const langStringsList = {
- 'en': {
- Dl: 'Download without installing',
- unableDl: 'Unable to download the script'
- },
- 'zh-CN': {
- Dl: '下载此脚本',
- unableDl: '无法下载此脚本'
- },
- 'ru': {
- Dl: 'Скачать не устанавливая',
- unableDl: 'Не удалось скачать скрипт'
- }
- };
- const langStrings = langStringsList[userLang] || langStringsList.en;
- const b = document.createElement('button'); // downloadBtn
- const bIcon = document.createElement('div');
- const bParent = document.body.querySelector('div#install-area');
- const bNeighbour = document.body.querySelector('a.install-help-link');
- const installBtn = document.body.querySelector('a.install-link');
- if (!bParent || !bNeighbour || !installBtn) return;
- b.title = langStrings.Dl;
- b.className = 'tm-dsb-downloadBtn';
- bIcon.className = 'tm-dsb-downloadBtn__icon tm-dsb-downloadBtn__icon--download';
- bNeighbour.style.position = 'relative'; // shadow bugfix
- bParent.insertBefore(b, bNeighbour);
- b.appendChild(bIcon);
- let fetchingDelay = false;
- (GM.getResourceUrl || GM_getResourceUrl)('iconDownload')
- .then(downloadIconUrl => {
- addCSS(`
- .tm-dsb-downloadBtn {
- width: 43px;
- height: 38px;
- position: relative;
- padding: 0;
- vertical-align: bottom;
- cursor: pointer;
- border: none;
- outline: none;
- background: #0F750F;
- transition: box-shadow 0.2s;
- }
- .tm-dsb-downloadBtn:hover,
- .tm-dsb-downloadBtn:focus {
- box-shadow: 0 8px 16px 0 rgb(0 0 0 / 20%), 0 6px 20px 0 rgb(0 0 0 / 19%);
- }
- .tm-dsb-downloadBtn__icon {
- position: absolute;
- }
- .tm-dsb-downloadBtn__icon--download {
- width: 35px;
- height: 35px;
- top: 1px;
- left: 4px;
- background: url(${downloadIconUrl});
- background-size: contain;
- }
- .tm-dsb-downloadBtn__icon--loading,
- .tm-dsb-downloadBtn__icon--loading:after {
- border-radius: 50%;
- width: 16px;
- height: 16px;
- }
- .tm-dsb-downloadBtn__icon--loading {
- top: 6px;
- left: 8px;
- text-indent: -9999em;
- border-top: 5px solid rgba(255, 255, 255, 0.2);
- border-right: 5px solid rgba(255, 255, 255, 0.2);
- border-bottom: 5px solid rgba(255, 255, 255, 0.2);
- border-left: 5px solid #ffffff;
- -webkit-transform: translateZ(0);
- -ms-transform: translateZ(0);
- transform: translateZ(0);
- -webkit-animation: loading 1.1s infinite linear;
- animation: loading 1.1s infinite linear;
- }
- @-webkit-keyframes loading {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
- }
- @keyframes loading {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
- }
- `);
- });
- b.addEventListener('click', () => {
- setTimeout(() => {
- if (b === document.activeElement) document.activeElement.blur();
- }, 250);
- if (fetchingDelay) return;
- fetchingDelay = true;
- bIcon.className = 'tm-dsb-downloadBtn__icon tm-dsb-downloadBtn__icon--loading';
- fetch(installBtn.href)
- .then(res => res.blob())
- .then(blob => {
- const url = window.URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = `${installBtn.dataset.scriptName}.user.js`;
- document.body.appendChild(a); // needed due to firefox bug
- a.click();
- a.remove();
- setTimeout(closeFetchUX, 300);
- window.URL.revokeObjectURL(url);
- })
- .catch(e => {
- setTimeout(closeFetchUX, 300);
- alert(`${langStrings.unableDl}: \n${e}`);
- });
- });
- // utils -------------------------------------------------------------
- function closeFetchUX() {
- fetchingDelay = false;
- bIcon.className = 'tm-dsb-downloadBtn__icon tm-dsb-downloadBtn__icon--download';
- }
- function addCSS(cssCode) {
- const styleEl = document.createElement("style");
- styleEl.type = "text/css";
- if (styleEl.styleSheet) {
- styleEl.styleSheet.cssText = cssCode;
- } else {
- styleEl.appendChild(document.createTextNode(cssCode));
- }
- document.getElementsByTagName("head")[0].appendChild(styleEl);
- return styleEl;
- }
- // --------------------------------------------------------------------
- })();