您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button to Scratch Forum posts to upload an image to CubeUpload and insert it as [img] BBCode.
// ==UserScript== // @name Scratch Forums CubeUpload Image Inserter // @namespace http://tampermonkey.net/ // @version 1.13 // @description Adds a button to Scratch Forum posts to upload an image to CubeUpload and insert it as [img] BBCode. // @match https://scratch.mit.edu/discuss/* // @match https://cubeupload.com/* // @grant none // @author 09878901234321 // @license MIT // ==/UserScript== /* * MIT License * * Copyright (c) 2025 09878901234321 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following condition: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ (function () { 'use strict'; function insertBBCode(url) { const bbcode = `[img]${url}[/img]`; const textBox = document.querySelector('.markItUpEditor') || document.querySelector('textarea') || document.activeElement; if (textBox && (textBox.tagName === 'TEXTAREA' || textBox.tagName === 'INPUT')) { const start = textBox.selectionStart; const end = textBox.selectionEnd; const v = textBox.value; textBox.value = v.slice(0, start) + bbcode + v.slice(end); textBox.selectionStart = textBox.selectionEnd = start + bbcode.length; textBox.focus(); console.log('[Main] BBCode inserted at cursor.'); } else { prompt('Image uploaded! Copy this BBCode:', bbcode); console.log('[Main] No input field; showing prompt instead.'); } } // ——— MAIN PAGE (Scratch Forums) ——— if (!location.hostname.includes('cubeupload.com')) { window.addEventListener('message', e => { if (e.origin.includes('cubeupload.com') && e.data.uploadedUrl) { console.log('[Main] Received uploaded URL:', e.data.uploadedUrl); insertBBCode(e.data.uploadedUrl); } }); window.addEventListener('load', () => { const toolbar = document.querySelector('#markItUpId_body .markItUpHeader > ul'); if (!toolbar || toolbar.querySelector('.cubeupload-btn')) return; const li = document.createElement('li'); li.className = 'cubeupload-btn'; const a = document.createElement('a'); a.href = 'javascript:void(0)'; a.title = 'Upload an image to CubeUpload and insert BBCode'; a.innerText = ' CubeUpload'; a.style.display = 'inline-block'; a.style.backgroundImage = 'url(https://u.cubeupload.com/09878901234321/cubeuploadlogo.png)'; a.style.backgroundRepeat = 'no-repeat'; a.style.backgroundSize = '16px 16px'; li.appendChild(a); toolbar.insertBefore(li, toolbar.children[5] || null); console.log('[Main] CubeUpload button added to Scratch forum toolbar.'); a.addEventListener('click', () => { console.log('[Main] Opening CubeUpload popup...'); window.open('https://cubeupload.com/', 'cubeupload_popup', 'width=800,height=600'); }); }); return; } // ——— CUBEUPLOAD POPUP ——— if (location.hostname.includes('cubeupload.com') && window.opener) { window.addEventListener('load', () => { console.log('[Popup] Loaded. Looking for pick/upload controls…'); const pickBtn = document.querySelector('#pickfiles'); const uploadBtn = document.querySelector('#uploadfiles'); if (!pickBtn || !uploadBtn) { console.error('[Popup] ❌ #pickfiles or #uploadfiles not found.'); return; } console.log('[Popup] Found pick & upload elements. Clicking pickfiles…'); pickBtn.click(); // Click selectfiles button const input = document.querySelector('input[type="file"]'); if (input) { input.addEventListener('change', () => { console.log('[Popup] File selected. Clicking uploadfiles…'); uploadBtn.click(); // Trigger uploadfiles button }); } else { console.warn('[Popup] File input not found.'); } const watcher = setInterval(() => { const linkInput = document.querySelector('input.fastCodes'); const thumbImg = document.querySelector('.uploaded .image img'); let url = null; if (linkInput && linkInput.value && !linkInput.value.includes('Error')) { url = linkInput.value; } else if (thumbImg && thumbImg.src) { url = thumbImg.src; } if (url) { clearInterval(watcher); console.log('[Popup] ✅ Detected URL:', url); window.opener.postMessage({ uploadedUrl: url }, '*'); window.close(); } }, 1000); }); } })();