// ==UserScript== // @name מסיר ומוסיף כוכב*ות - מטען נייד // @namespace http://tampermonkey.net/ // @version 1.1 // @description מוסיף כוכביות לקישורים לדרייב, לג'מבו מייל ול-send.magicode.me בשליחת פוסט במתמחים טופ, ומסיר אותן בקריאה ובלחיצה // @match https://mitmachim.top/* // @match https://*.mitmachim.top/* // @match https://drive.google.com/* // @match https://jumbomail.me/* // @match https://*.jumbomail.me/* // @match https://send.magicode.me/* // @icon data:image/png;base64,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 // @homepageURL https://github.com/matennayad/Download-from-YouTube-to-Drive // @downloadURL https://raw.githubusercontent.com/matennayad/Download-from-YouTube-to-Drive/main/Mitmachim%20Star%20Links.user.js // @updateURL https://raw.githubusercontent.com/matennayad/Download-from-YouTube-to-Drive/main/Mitmachim%20Star%20Links.user.js // @run-at document-start // @sandbox JavaScript // @noframes // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM_addValueChangeListener // @grant GM_registerMenuCommand // ==/UserScript== (function () { 'use strict'; const page = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; const DEFAULTS = { unbreakLinks: true, breakLinks: true }; function loadSettings() { const stored = {}; for (const [key, value] of Object.entries(DEFAULTS)) stored[key] = GM_getValue(key, value); return stored; } let settings = loadSettings(); // כוכביות בקישורים: השרת של מתמחים לא שומר קישורים לדרייב, לג'מבו מייל ול-send.magicode.me, // אז מכניסים לתוך הקישור רצף כוכביות - והוא נשמר כקישור "שבור". // מי שבלי התוסף מוחק את הכוכביות מהכתובת בעצמו, ומי שעם התוסף מקבל את הקישור המתוקן. const MfStars = (() => { const HOSTS = /^(?:[\w-]+\.)*(?:drive\.google\.com|jumbomail\.me|send\.magicode\.me)$/i; const MARKS = "*".repeat(10); // רצף סימונים: כל רצף שיש בו כוכבית, או שניים ומעלה מ-# @ & ברצף (# בודד יכול להיות חלק מקישור תקין) const MARK_RUN = /[*#@&]*\*[*#@&]*|[#@&]{2,}/g; const URL_PARTS = /^(https?:\/\/)([^/?]*)(.*)$/i; const HOST_WORD = "(?:[\\w-]+\\.)*(?:drive\\.google\\.com|jumbomail\\.me|send\\.magicode\\.me)"; // הכתובת בלי הסימונים, רק לאתרים שהשרת חוסם function clean(href) { const m = String(href).replace(/%2a/gi, "*").match(URL_PARTS); if (!m) return href; const host = m[2].replace(MARK_RUN, ""); if (!HOSTS.test(host)) return href; const fixed = m[1] + host + m[3].replace(MARK_RUN, ""); return fixed === m[0] ? href : fixed; } const isBroken = (href) => clean(href) !== href; // רצף כוכביות באמצע המזהה של הקובץ (הקטע הארוך ביותר בכתובת) function breakUrl(href) { const m = href.match(URL_PARTS); if (!m || !HOSTS.test(m[2]) || /[*]/.test(m[3])) return href; let best = null; for (const part of m[3].matchAll(/[\w-]{4,}/g)) { if (!best || part[0].length > best[0].length) best = part; } if (!best) return href; const at = best.index + Math.floor(best[0].length / 2); return m[1] + m[2] + m[3].slice(0, at) + MARKS + m[3].slice(at); } // שובר את כל הקישורים לאתרים החסומים בטקסט של הפוסט (Markdown) const URL_IN_TEXT = new RegExp(`(?:https?:\\/\\/)?${HOST_WORD}\\/[^\\s<>()\\[\\]"'\`]*`, "gi"); function breakText(text) { return String(text).replace(URL_IN_TEXT, (url, offset, all) => { // תווים שנחשבים לסוף משפט ולא לחלק מהקישור const tail = (url.match(/[.,;:!?]+$/) || [""])[0]; const body = tail ? url.slice(0, -tail.length) : url; const before = all[offset - 1] || ""; if (before && /[\w./@-]/.test(before)) return url; const full = /^https?:/i.test(body) ? body : "https://" + body; const broken = breakUrl(full); if (broken === full) return url; // [טקסט](כתובת) או <כתובת> - הכוכביות בתוך הכתובת לא נחשבות להדגשה if ((before === "(" && all[offset - 2] === "]") || (before === "<" && all[offset + body.length] === ">")) { return (full === body ? broken : broken.replace(/^https:\/\//, "")) + tail; } // בתוך הטקסט של קישור - כוכביות עם \ לפניהן, כדי שיוצגו כמו שהן if (before === "[") return broken.replace(/\*/g, "\\*") + tail; // כתובת חופשית - עוטפים ב-<> כדי ששני קישורים באותו פוסט לא יהפכו את מה שביניהם להדגשה return `<${broken}>${tail}`; }); } // כתובות שבורות בתוך טקסט שמוצג על המסך const BROKEN_IN_TEXT = new RegExp(`(?:https?:\\/\\/)?${HOST_WORD}[^\\s<>"']*`, "gi"); function cleanText(text) { return String(text).replace(BROKEN_IN_TEXT, (url) => { if (!/[*#@&]/.test(url)) return url; const full = /^https?:/i.test(url) ? url : "https://" + url; const fixed = clean(full); return full === url ? fixed : fixed.replace(/^https:\/\//, ""); }); } // קישור בדף: רק הטקסט שלו מוצג בלי הסימונים. הכתובת עצמה נשארת שבורה, כדי שבמתמחים לא יהיה // סימן לקישור המלא - הלחיצה עוברת לקישור השבור, ורק שם הוא מתקן את עצמו. // מחזיר true אם הקישור שונה const originals = new WeakMap(); const SELECTOR = 'a[href*="drive.google" i], a[href*="jumbomail" i], a[href*="magicode" i]'; function fixLink(link) { if (originals.has(link)) return false; const raw = link.getAttribute("href"); if (!raw || !isBroken(raw)) return false; originals.set(link, { html: link.innerHTML }); const walker = document.createTreeWalker(link, NodeFilter.SHOW_TEXT); while (walker.nextNode()) { const node = walker.currentNode; const fixed = cleanText(node.nodeValue); if (fixed !== node.nodeValue) node.nodeValue = fixed; } return true; } function restoreLink(link) { const orig = originals.get(link); if (!orig) return false; originals.delete(link); link.innerHTML = orig.html; return true; } function fixAll(root = document) { for (const link of root.querySelectorAll(SELECTOR)) fixLink(link); } function restoreAll(root = document) { for (const link of root.querySelectorAll(SELECTOR)) restoreLink(link); } const isOriginalLink = (link) => originals.has(link); const originalHtml = (link) => originals.get(link)?.html; return { HOSTS, SELECTOR, clean, isBroken, breakUrl, breakText, cleanText, fixLink, restoreLink, fixAll, restoreAll, isOriginalLink, originalHtml }; })(); // דף שנפתח מקישור שבור (בדרייב, בג'מבו מייל או ב-magicode) - עוברים מיד לכתובת בלי הכוכביות. // באתרים האלה הסקריפט לא עושה שום דבר אחר if (!/(^|\.)mitmachim\.top$/i.test(location.hostname)) { const fixed = MfStars.clean(location.href); if (fixed !== location.href && settings.unbreakLinks) location.replace(fixed); return; } // ===================================================================== // שליחת פוסט: הקישורים נשלחים לשרת עם כוכביות // ===================================================================== // הקוד הזה צריך לרוץ בהקשר של הדף עצמו (@sandbox JavaScript) ולפני שהאתר נטען (@run-at document-start). const POST_API = /\/api\/v3\/(topics|posts|chats)\b/; function showToast(text) { if (!document.body) return; const toast = document.createElement("div"); toast.className = "mf-toast"; toast.textContent = text; toast.dir = "rtl"; document.body.appendChild(toast); setTimeout(() => { toast.style.opacity = "0"; }, 3500); setTimeout(() => toast.remove(), 3900); } function breakLinks(url, body) { if (typeof body !== "string" || !settings.breakLinks || !POST_API.test(String(url))) return body; let data; try { data = JSON.parse(body); } catch (e) { return body; } if (!data || typeof data !== "object") return body; let changed = false; for (const key of ["content", "message"]) { if (typeof data[key] !== "string") continue; const broken = MfStars.breakText(data[key]); if (broken !== data[key]) { data[key] = broken; changed = true; } } if (!changed) return body; console.info("[מסיר ומוסיף כוכב*ות] נוספו כוכביות לקישורים, כדי שהשרת ישמור אותם"); showToast("✓ הקישור נשמר עם כוכביות - מי שיש לו את הסקריפט יקבל אותו מתוקן"); return JSON.stringify(data); } const origOpen = page.XMLHttpRequest.prototype.open; page.XMLHttpRequest.prototype.open = function (method, url) { this.__mfUrl = url; return origOpen.apply(this, arguments); }; const origSend = page.XMLHttpRequest.prototype.send; page.XMLHttpRequest.prototype.send = function (body) { return origSend.call(this, breakLinks(this.__mfUrl, body)); }; const origFetch = page.fetch; page.fetch = function (input, init) { if (init && typeof init.body === "string") { const body = breakLinks(typeof input === "string" ? input : input?.url || String(input), init.body); if (body !== init.body) init = { ...init, body }; } return origFetch.call(this, input, init); }; // ===================================================================== // קריאה: קישורים שנשמרו עם כוכביות מוצגים ונפתחים בלי הכוכביות // ===================================================================== function scan() { if (settings.unbreakLinks) MfStars.fixAll(); else MfStars.restoreAll(); } // ===================================================================== // חלון הגדרות (נפתח מתפריט Tampermonkey) // ===================================================================== const PROFILE_URL = "https://mitmachim.top/user/%D7%9E%D7%98%D7%A2%D7%9F-%D7%A0%D7%99%D7%99%D7%93"; const FULL_POST_URL = "https://mitmachim.top/post/1270728"; const SETTINGS_HTML = `
קישורים לדרייב, לג'מבו מייל ול-send.magicode.me במתמחים טופ