您需要先安装一个扩展,例如 篡改猴、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
- // @author Konf
- // @version 1.2.1
- // @namespace https://greasyfork.org/users/424058
- // @icon https://www.google.com/s2/favicons?domain=greasyfork.org&sz=32
- // @include /^http(s|):\/\/(sleaz|greas)yfork\.org\/[a-zA-Z_-]*\/scripts\/\d.*$/
- // @compatible Chrome
- // @compatible Opera
- // @compatible Firefox
- // @run-at document-end
- // @grant GM_addStyle
- // @noframes
- // ==/UserScript==
- /* jshint esversion: 6 */
- /* eslint-disable no-multi-spaces */
- (function() {
- 'use strict';
- const langStrings = (function() {
- const userLang = location.pathname.split('/')[1];
- const langStringsList = {
- 'en': {
- Dl: 'Download without installing',
- failedDl: 'Failed to download the script. ' +
- 'More info might be in the browser console'
- },
- 'zh-CN': {
- Dl: '下载此脚本',
- failedDl: '无法下载此脚本'
- },
- 'ru': {
- Dl: 'Скачать не устанавливая',
- failedDl: 'Не удалось скачать скрипт. ' +
- 'Больше информации может быть в консоли браузера'
- }
- };
- return function(id) {
- const userStrings = langStringsList[userLang];
- const enStrings = langStringsList.en;
- return (userStrings || enStrings)[id] || enStrings[id];
- }
- }());
- // https://img.icons8.com/pastel-glyph/64/ffffff/download.png
- // array because tampermonkey can't roll up a string in the code editor
- const downloadIcon = ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE',
- 'AAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAABgUlEQVR4nO3ZTU6DUAAE4HnE',
- 'k+jWG3TrHVwY3XoEt23cGleamtRtTbyPS3sCV0bXjptHRAIEsM/hZ76kCZRHGaZAGwDMzM',
- 'zMbJ6CasMkMwBncXYbQvhSZZEgecEf56ocmWrDAA4L00eqEMoCBsEFqAOouQB1ADUXoA6g',
- '5gLUAdRcgDqAmgtQB1BzAeoAakkLIHlN8pPkDcnWd59IBpK3cd1VyoxJkfwo3PV5KJZAcl',
- 'lYtiy8H+LY3HvKjKlPgU1h+hLAuulIiMvWcWzVZ4xL/Dbv+Nsjyax8BMSx96Wxm3jzdLwa',
- 'SliVCpjezucqzmuSfKuZJkvXi0moORKqTOebL2tRwnR3PtdQwvR3PldRgmznlc8GA4DTOP',
- 'scQqAqy6x1+X8+6Ke5yfNxIE9z6/TN1+XCM4inuQ165ZvHz04DF6AOoOYC1AHUXIA6gNpB',
- 'z/UWJK/2muTvFn1W6lvASXyNXpdTYJcsxf69th3Y5QjYAiCA485x/tcLgCd1CDMzMzMbum',
- '8+xtkWw6QCvwAAAABJRU5ErkJggg=='].join('');
- 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;
- GM_addStyle([`
- .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(${downloadIcon});
- 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;
- 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;
- transform: translateZ(0);
- animation: loading 1.1s infinite linear;
- }
- @keyframes loading {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
- }
- `][0]);
- 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;
- b.addEventListener('click', () => {
- setTimeout(() => {
- if (b === document.activeElement) b.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 || Date.now()}.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('failedDl')}: \n${e}`);
- });
- });
- // utils -------------------------------------------------------------
- function closeFetchUX() {
- fetchingDelay = false;
- bIcon.className = 'tm-dsb-downloadBtn__icon tm-dsb-downloadBtn__icon--download';
- }
- // --------------------------------------------------------------------
- })();