להורדה | סקריפט לTampermonkey שמוסיף כפתורי ai בפורום
-
שימו לב! עולה כסף!!
כנראה הייתי ממש משועמם אז יצרתי עם ai סקריפט שמוסיף 2 כפתורי עזרה מ ai

אחד עונה תשובה לפוסט, ואחד מסביר את הפוסט.
לעניות דעתי זה ממש לא נצרך אבל ביקשו ממני להעלות אז יאללה מה אכפת לי.
להתקנת הסקריפט התקינו Tampermonkey, תעברו את התהליך של לאשר, מצב מפתח, וכו וצרו סקריפט חדש עם הקוד שבספוילר, אל תשכחו להדביק את מפתח ה api שלכם מגמיני בשורה 15.
ניתן לשחק עם המודלים ולתת הנחיה יותר ברורה עם הרצונות שלכם...// ==UserScript== // @name NodeBB Gemini Pro (Summarizer + Replier) // @namespace http://tampermonkey.net/ // @version 4.0 // @description הוספת כפתורי גמיני (סיכום + ניסוח תשובה) בעיצוב קומפקטי ל-mitmachim.top // @author You // @match https://mitmachim.top/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // --- הגדרות --- // אנא הדבק כאן את המפתח שלך במקום הטקסט המופיע const API_KEY = 'YOUR_API_KEY_HERE'; // המודל שביקשת. אם תקבל שגיאה 404, נסה לשנות ל: 'gemini-1.5-flash' const MODEL = 'gemini-flash-lite-latest'; // --- עיצוב CSS (כולל גלילה ועיצוב קומפקטי) --- GM_addStyle(` /* כפתורים */ .gemini-btn-wrapper { display: inline-flex; gap: 5px; margin-left: 8px; } .gemini-btn { transition: all 0.2s; border: 1px solid transparent; } .gemini-btn:hover { background-color: rgba(0,0,0,0.05); border-radius: 4px; } /* צבעים לאייקונים */ .gemini-icon-magic { color: #8e44ad; } /* סגול לסיכום */ .gemini-icon-reply { color: #27ae60; } /* ירוק לתשובה */ /* תיבת התוצאה - קומפקטית ונגללת */ .gemini-result-box { background: var(--bs-body-bg, #ffffff); border: 1px solid #e0e0e0; border-right: 4px solid #8e44ad; border-radius: 6px; padding: 15px; margin-top: 10px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); font-size: 14px; line-height: 1.5; color: var(--bs-body-color, #333); position: relative; /* הגדרות גודל וגלילה */ max-height: 300px; /* גובה מקסימלי */ overflow-y: auto; /* פס גלילה אם הטקסט ארוך */ scrollbar-width: thin; /* פס גלילה דק */ } /* עיצוב פס הגלילה */ .gemini-result-box::-webkit-scrollbar { width: 6px; } .gemini-result-box::-webkit-scrollbar-thumb { background-color: #ccc; border-radius: 3px; } .gemini-close { position: sticky; /* נשאר למעלה בגלילה */ top: 0; float: left; cursor: pointer; color: #999; font-size: 16px; background: inherit; padding: 0 5px; margin-left: -5px; } .gemini-close:hover { color: red; } .gemini-loading { display: flex; align-items: center; gap: 8px; color: #666; font-style: italic; } /* עיצוב התוכן */ .gemini-content h3 { font-size: 1.1em; margin: 8px 0; font-weight: bold; } .gemini-content ul { padding-right: 20px; margin: 5px 0; } .gemini-content strong { font-weight: 600; } `); // --- אתחול --- function init() { setTimeout(addButtons, 1000); const observer = new MutationObserver(() => addButtons()); observer.observe(document.body, { childList: true, subtree: true }); } // --- הוספת הכפתורים --- function addButtons() { // בודק פוסטים שלא טופלו const posts = document.querySelectorAll('.post-container-parent:not(.gemini-processed)'); posts.forEach(post => { post.classList.add('gemini-processed'); const toolbar = post.querySelector('.post-tools'); if (toolbar) { // מעטפת לכפתורים const wrapper = document.createElement('span'); wrapper.className = 'gemini-btn-wrapper'; // כפתור 1: סיכום והסבר (✨) const btnExplain = createButton('fa-magic', 'gemini-icon-magic', 'סיכום והסבר', () => handleGeminiAction(post, 'explain')); // כפתור 2: יצירת תשובה (✒️) const btnReply = createButton('fa-pencil', 'gemini-icon-reply', 'נסח תשובה', () => handleGeminiAction(post, 'reply')); wrapper.appendChild(btnReply); wrapper.appendChild(btnExplain); toolbar.prepend(wrapper); } }); } function createButton(iconClass, colorClass, title, onClick) { const btn = document.createElement('a'); btn.className = 'btn btn-ghost btn-sm gemini-btn'; btn.href = '#'; btn.title = title; btn.innerHTML = `<i class="fa ${iconClass} ${colorClass}"></i>`; btn.onclick = (e) => { e.preventDefault(); onClick(); }; return btn; } // --- לוגיקה ראשית --- async function handleGeminiAction(postContainer, mode) { const contentArea = postContainer.querySelector('[component="post/content"]'); if (!contentArea) return; // סגירת חלונית קיימת אם יש const existingBox = contentArea.querySelector('.gemini-result-box'); if (existingBox) existingBox.remove(); const textToProcess = contentArea.innerText.trim(); // יצירת חלונית טעינה const resultBox = document.createElement('div'); resultBox.className = 'gemini-result-box'; const loadingText = mode === 'explain' ? 'מסכם ומסביר...' : 'מנסח תשובה...'; resultBox.innerHTML = ` <div class="gemini-loading"> <span>⚡</span><span>${loadingText}</span> </div> `; contentArea.appendChild(resultBox); try { // בחירת ההנחיה (Prompt) המתאימה let prompt = ''; if (mode === 'explain') { prompt = ` תפקידך לסייע למשתמש להבין פוסט בפורום. הטקסט: "${textToProcess}" 1. סכם את הפוסט בקיצור נמרץ. 2. הסבר מושגים טכניים או סלנג אם יש. `; } else { prompt = ` אתה משתמש מומחה בפורום מקצועי ("מתמחים טופ"). כתוב נוסח לתגובה עבור הפוסט הבא. התגובה צריכה להיות: 1. מועילה ומקצועית. 2. מנומסת ומכבדת. 3. בעברית. 4. אם זו שאלה טכנית, הצע כיוון לפתרון (אם אין מספיק מידע, תשאל שאלות מנחות). הפוסט עליו עונים: "${textToProcess}" `; } const responseText = await callGeminiAPI(prompt); const formattedHTML = formatMarkdown(responseText); // שינוי צבע המסגרת לפי סוג הפעולה (ירוק לתשובה, סגול להסבר) const borderColor = mode === 'explain' ? '#8e44ad' : '#27ae60'; resultBox.style.borderRightColor = borderColor; resultBox.innerHTML = ` <div class="gemini-close" onclick="this.parentElement.remove()">✖</div> <div class="gemini-content">${formattedHTML}</div> <div style="margin-top:10px; font-size:11px; color:#aaa;"> ${mode === 'explain' ? 'סיכום' : 'הצעת תשובה'} (מודל: ${MODEL}) </div> `; } catch (error) { console.error(error); resultBox.innerHTML = ` <div class="gemini-close" onclick="this.parentElement.remove()">✖</div> <div style="color:red">שגיאה: ${error}</div> `; } } // --- תקשורת עם גוגל --- function callGeminiAPI(promptText) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "POST", url: `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`, headers: { "Content-Type": "application/json" }, data: JSON.stringify({ contents: [{ parts: [{ text: promptText }] }] }), onload: function(response) { if (response.status >= 200 && response.status < 300) { try { const json = JSON.parse(response.responseText); // בדיקה אם המודל החזיר תוכן if (json.candidates && json.candidates[0].content) { resolve(json.candidates[0].content.parts[0].text); } else { reject("המודל לא החזיר טקסט (אולי תוכן חסום?)"); } } catch (e) { reject("שגיאה בפענוח JSON"); } } else { reject(`שגיאת שרת: ${response.status}`); } }, onerror: function(err) { reject("שגיאת חיבור"); } }); }); } function formatMarkdown(text) { return text .replace(/^### (.*$)/gim, '<h3>$1</h3>') .replace(/^## (.*$)/gim, '<h3>$1</h3>') .replace(/\*\*(.*?)\*\*/gim, '<strong>$1</strong>') .replace(/^\* (.*$)/gim, '<ul><li>$1</li></ul>') .replace(/<\/ul>\s*<ul>/gim, '') .replace(/\n/gim, '<br>'); } init(); })();מוקדש ל @יאיר-דניאל וכל שוכני השרשור הזה
דוגמה קטנה של סיכום הפוסט (לא רואים הכול כי זה חלונית נגללת)

-
למה עולה כסף? יש API חינמי
-
שימו לב! עולה כסף!!
כנראה הייתי ממש משועמם אז יצרתי עם ai סקריפט שמוסיף 2 כפתורי עזרה מ ai

אחד עונה תשובה לפוסט, ואחד מסביר את הפוסט.
לעניות דעתי זה ממש לא נצרך אבל ביקשו ממני להעלות אז יאללה מה אכפת לי.
להתקנת הסקריפט התקינו Tampermonkey, תעברו את התהליך של לאשר, מצב מפתח, וכו וצרו סקריפט חדש עם הקוד שבספוילר, אל תשכחו להדביק את מפתח ה api שלכם מגמיני בשורה 15.
ניתן לשחק עם המודלים ולתת הנחיה יותר ברורה עם הרצונות שלכם...// ==UserScript== // @name NodeBB Gemini Pro (Summarizer + Replier) // @namespace http://tampermonkey.net/ // @version 4.0 // @description הוספת כפתורי גמיני (סיכום + ניסוח תשובה) בעיצוב קומפקטי ל-mitmachim.top // @author You // @match https://mitmachim.top/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // --- הגדרות --- // אנא הדבק כאן את המפתח שלך במקום הטקסט המופיע const API_KEY = 'YOUR_API_KEY_HERE'; // המודל שביקשת. אם תקבל שגיאה 404, נסה לשנות ל: 'gemini-1.5-flash' const MODEL = 'gemini-flash-lite-latest'; // --- עיצוב CSS (כולל גלילה ועיצוב קומפקטי) --- GM_addStyle(` /* כפתורים */ .gemini-btn-wrapper { display: inline-flex; gap: 5px; margin-left: 8px; } .gemini-btn { transition: all 0.2s; border: 1px solid transparent; } .gemini-btn:hover { background-color: rgba(0,0,0,0.05); border-radius: 4px; } /* צבעים לאייקונים */ .gemini-icon-magic { color: #8e44ad; } /* סגול לסיכום */ .gemini-icon-reply { color: #27ae60; } /* ירוק לתשובה */ /* תיבת התוצאה - קומפקטית ונגללת */ .gemini-result-box { background: var(--bs-body-bg, #ffffff); border: 1px solid #e0e0e0; border-right: 4px solid #8e44ad; border-radius: 6px; padding: 15px; margin-top: 10px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); font-size: 14px; line-height: 1.5; color: var(--bs-body-color, #333); position: relative; /* הגדרות גודל וגלילה */ max-height: 300px; /* גובה מקסימלי */ overflow-y: auto; /* פס גלילה אם הטקסט ארוך */ scrollbar-width: thin; /* פס גלילה דק */ } /* עיצוב פס הגלילה */ .gemini-result-box::-webkit-scrollbar { width: 6px; } .gemini-result-box::-webkit-scrollbar-thumb { background-color: #ccc; border-radius: 3px; } .gemini-close { position: sticky; /* נשאר למעלה בגלילה */ top: 0; float: left; cursor: pointer; color: #999; font-size: 16px; background: inherit; padding: 0 5px; margin-left: -5px; } .gemini-close:hover { color: red; } .gemini-loading { display: flex; align-items: center; gap: 8px; color: #666; font-style: italic; } /* עיצוב התוכן */ .gemini-content h3 { font-size: 1.1em; margin: 8px 0; font-weight: bold; } .gemini-content ul { padding-right: 20px; margin: 5px 0; } .gemini-content strong { font-weight: 600; } `); // --- אתחול --- function init() { setTimeout(addButtons, 1000); const observer = new MutationObserver(() => addButtons()); observer.observe(document.body, { childList: true, subtree: true }); } // --- הוספת הכפתורים --- function addButtons() { // בודק פוסטים שלא טופלו const posts = document.querySelectorAll('.post-container-parent:not(.gemini-processed)'); posts.forEach(post => { post.classList.add('gemini-processed'); const toolbar = post.querySelector('.post-tools'); if (toolbar) { // מעטפת לכפתורים const wrapper = document.createElement('span'); wrapper.className = 'gemini-btn-wrapper'; // כפתור 1: סיכום והסבר (✨) const btnExplain = createButton('fa-magic', 'gemini-icon-magic', 'סיכום והסבר', () => handleGeminiAction(post, 'explain')); // כפתור 2: יצירת תשובה (✒️) const btnReply = createButton('fa-pencil', 'gemini-icon-reply', 'נסח תשובה', () => handleGeminiAction(post, 'reply')); wrapper.appendChild(btnReply); wrapper.appendChild(btnExplain); toolbar.prepend(wrapper); } }); } function createButton(iconClass, colorClass, title, onClick) { const btn = document.createElement('a'); btn.className = 'btn btn-ghost btn-sm gemini-btn'; btn.href = '#'; btn.title = title; btn.innerHTML = `<i class="fa ${iconClass} ${colorClass}"></i>`; btn.onclick = (e) => { e.preventDefault(); onClick(); }; return btn; } // --- לוגיקה ראשית --- async function handleGeminiAction(postContainer, mode) { const contentArea = postContainer.querySelector('[component="post/content"]'); if (!contentArea) return; // סגירת חלונית קיימת אם יש const existingBox = contentArea.querySelector('.gemini-result-box'); if (existingBox) existingBox.remove(); const textToProcess = contentArea.innerText.trim(); // יצירת חלונית טעינה const resultBox = document.createElement('div'); resultBox.className = 'gemini-result-box'; const loadingText = mode === 'explain' ? 'מסכם ומסביר...' : 'מנסח תשובה...'; resultBox.innerHTML = ` <div class="gemini-loading"> <span>⚡</span><span>${loadingText}</span> </div> `; contentArea.appendChild(resultBox); try { // בחירת ההנחיה (Prompt) המתאימה let prompt = ''; if (mode === 'explain') { prompt = ` תפקידך לסייע למשתמש להבין פוסט בפורום. הטקסט: "${textToProcess}" 1. סכם את הפוסט בקיצור נמרץ. 2. הסבר מושגים טכניים או סלנג אם יש. `; } else { prompt = ` אתה משתמש מומחה בפורום מקצועי ("מתמחים טופ"). כתוב נוסח לתגובה עבור הפוסט הבא. התגובה צריכה להיות: 1. מועילה ומקצועית. 2. מנומסת ומכבדת. 3. בעברית. 4. אם זו שאלה טכנית, הצע כיוון לפתרון (אם אין מספיק מידע, תשאל שאלות מנחות). הפוסט עליו עונים: "${textToProcess}" `; } const responseText = await callGeminiAPI(prompt); const formattedHTML = formatMarkdown(responseText); // שינוי צבע המסגרת לפי סוג הפעולה (ירוק לתשובה, סגול להסבר) const borderColor = mode === 'explain' ? '#8e44ad' : '#27ae60'; resultBox.style.borderRightColor = borderColor; resultBox.innerHTML = ` <div class="gemini-close" onclick="this.parentElement.remove()">✖</div> <div class="gemini-content">${formattedHTML}</div> <div style="margin-top:10px; font-size:11px; color:#aaa;"> ${mode === 'explain' ? 'סיכום' : 'הצעת תשובה'} (מודל: ${MODEL}) </div> `; } catch (error) { console.error(error); resultBox.innerHTML = ` <div class="gemini-close" onclick="this.parentElement.remove()">✖</div> <div style="color:red">שגיאה: ${error}</div> `; } } // --- תקשורת עם גוגל --- function callGeminiAPI(promptText) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "POST", url: `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`, headers: { "Content-Type": "application/json" }, data: JSON.stringify({ contents: [{ parts: [{ text: promptText }] }] }), onload: function(response) { if (response.status >= 200 && response.status < 300) { try { const json = JSON.parse(response.responseText); // בדיקה אם המודל החזיר תוכן if (json.candidates && json.candidates[0].content) { resolve(json.candidates[0].content.parts[0].text); } else { reject("המודל לא החזיר טקסט (אולי תוכן חסום?)"); } } catch (e) { reject("שגיאה בפענוח JSON"); } } else { reject(`שגיאת שרת: ${response.status}`); } }, onerror: function(err) { reject("שגיאת חיבור"); } }); }); } function formatMarkdown(text) { return text .replace(/^### (.*$)/gim, '<h3>$1</h3>') .replace(/^## (.*$)/gim, '<h3>$1</h3>') .replace(/\*\*(.*?)\*\*/gim, '<strong>$1</strong>') .replace(/^\* (.*$)/gim, '<ul><li>$1</li></ul>') .replace(/<\/ul>\s*<ul>/gim, '') .replace(/\n/gim, '<br>'); } init(); })();מוקדש ל @יאיר-דניאל וכל שוכני השרשור הזה
דוגמה קטנה של סיכום הפוסט (לא רואים הכול כי זה חלונית נגללת)

@איש-אמת אתה יכול להעלות את הסקריפט לגיטהב וכך כל אחד שיש לו Tampermonkey יוכל להוסיף את זה אוטומטי מבלי להעתיק את הקוד...
כמובן שאם אתה רוצה לשדרג את זה קצת אתה יכול ג"כ להוסיף פונקציה ממשקית להוספת ה API כך שלא יצטרכו להתעסק עם הקוד...
סתם סקרון על איזה מודל הוא יושב? -
@איש-אמת אתה יכול להעלות את הסקריפט לגיטהב וכך כל אחד שיש לו Tampermonkey יוכל להוסיף את זה אוטומטי מבלי להעתיק את הקוד...
כמובן שאם אתה רוצה לשדרג את זה קצת אתה יכול ג"כ להוסיף פונקציה ממשקית להוספת ה API כך שלא יצטרכו להתעסק עם הקוד...
סתם סקרון על איזה מודל הוא יושב?@פרוזי gemini-flash-lite-latest
אגב עדיף מאוד לשדרג... זה לכא' ישאר חינמי/מחיר אפסי גם במודל ההכי יקר שקיים -
שימו לב! עולה כסף!!
כנראה הייתי ממש משועמם אז יצרתי עם ai סקריפט שמוסיף 2 כפתורי עזרה מ ai

אחד עונה תשובה לפוסט, ואחד מסביר את הפוסט.
לעניות דעתי זה ממש לא נצרך אבל ביקשו ממני להעלות אז יאללה מה אכפת לי.
להתקנת הסקריפט התקינו Tampermonkey, תעברו את התהליך של לאשר, מצב מפתח, וכו וצרו סקריפט חדש עם הקוד שבספוילר, אל תשכחו להדביק את מפתח ה api שלכם מגמיני בשורה 15.
ניתן לשחק עם המודלים ולתת הנחיה יותר ברורה עם הרצונות שלכם...// ==UserScript== // @name NodeBB Gemini Pro (Summarizer + Replier) // @namespace http://tampermonkey.net/ // @version 4.0 // @description הוספת כפתורי גמיני (סיכום + ניסוח תשובה) בעיצוב קומפקטי ל-mitmachim.top // @author You // @match https://mitmachim.top/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // --- הגדרות --- // אנא הדבק כאן את המפתח שלך במקום הטקסט המופיע const API_KEY = 'YOUR_API_KEY_HERE'; // המודל שביקשת. אם תקבל שגיאה 404, נסה לשנות ל: 'gemini-1.5-flash' const MODEL = 'gemini-flash-lite-latest'; // --- עיצוב CSS (כולל גלילה ועיצוב קומפקטי) --- GM_addStyle(` /* כפתורים */ .gemini-btn-wrapper { display: inline-flex; gap: 5px; margin-left: 8px; } .gemini-btn { transition: all 0.2s; border: 1px solid transparent; } .gemini-btn:hover { background-color: rgba(0,0,0,0.05); border-radius: 4px; } /* צבעים לאייקונים */ .gemini-icon-magic { color: #8e44ad; } /* סגול לסיכום */ .gemini-icon-reply { color: #27ae60; } /* ירוק לתשובה */ /* תיבת התוצאה - קומפקטית ונגללת */ .gemini-result-box { background: var(--bs-body-bg, #ffffff); border: 1px solid #e0e0e0; border-right: 4px solid #8e44ad; border-radius: 6px; padding: 15px; margin-top: 10px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); font-size: 14px; line-height: 1.5; color: var(--bs-body-color, #333); position: relative; /* הגדרות גודל וגלילה */ max-height: 300px; /* גובה מקסימלי */ overflow-y: auto; /* פס גלילה אם הטקסט ארוך */ scrollbar-width: thin; /* פס גלילה דק */ } /* עיצוב פס הגלילה */ .gemini-result-box::-webkit-scrollbar { width: 6px; } .gemini-result-box::-webkit-scrollbar-thumb { background-color: #ccc; border-radius: 3px; } .gemini-close { position: sticky; /* נשאר למעלה בגלילה */ top: 0; float: left; cursor: pointer; color: #999; font-size: 16px; background: inherit; padding: 0 5px; margin-left: -5px; } .gemini-close:hover { color: red; } .gemini-loading { display: flex; align-items: center; gap: 8px; color: #666; font-style: italic; } /* עיצוב התוכן */ .gemini-content h3 { font-size: 1.1em; margin: 8px 0; font-weight: bold; } .gemini-content ul { padding-right: 20px; margin: 5px 0; } .gemini-content strong { font-weight: 600; } `); // --- אתחול --- function init() { setTimeout(addButtons, 1000); const observer = new MutationObserver(() => addButtons()); observer.observe(document.body, { childList: true, subtree: true }); } // --- הוספת הכפתורים --- function addButtons() { // בודק פוסטים שלא טופלו const posts = document.querySelectorAll('.post-container-parent:not(.gemini-processed)'); posts.forEach(post => { post.classList.add('gemini-processed'); const toolbar = post.querySelector('.post-tools'); if (toolbar) { // מעטפת לכפתורים const wrapper = document.createElement('span'); wrapper.className = 'gemini-btn-wrapper'; // כפתור 1: סיכום והסבר (✨) const btnExplain = createButton('fa-magic', 'gemini-icon-magic', 'סיכום והסבר', () => handleGeminiAction(post, 'explain')); // כפתור 2: יצירת תשובה (✒️) const btnReply = createButton('fa-pencil', 'gemini-icon-reply', 'נסח תשובה', () => handleGeminiAction(post, 'reply')); wrapper.appendChild(btnReply); wrapper.appendChild(btnExplain); toolbar.prepend(wrapper); } }); } function createButton(iconClass, colorClass, title, onClick) { const btn = document.createElement('a'); btn.className = 'btn btn-ghost btn-sm gemini-btn'; btn.href = '#'; btn.title = title; btn.innerHTML = `<i class="fa ${iconClass} ${colorClass}"></i>`; btn.onclick = (e) => { e.preventDefault(); onClick(); }; return btn; } // --- לוגיקה ראשית --- async function handleGeminiAction(postContainer, mode) { const contentArea = postContainer.querySelector('[component="post/content"]'); if (!contentArea) return; // סגירת חלונית קיימת אם יש const existingBox = contentArea.querySelector('.gemini-result-box'); if (existingBox) existingBox.remove(); const textToProcess = contentArea.innerText.trim(); // יצירת חלונית טעינה const resultBox = document.createElement('div'); resultBox.className = 'gemini-result-box'; const loadingText = mode === 'explain' ? 'מסכם ומסביר...' : 'מנסח תשובה...'; resultBox.innerHTML = ` <div class="gemini-loading"> <span>⚡</span><span>${loadingText}</span> </div> `; contentArea.appendChild(resultBox); try { // בחירת ההנחיה (Prompt) המתאימה let prompt = ''; if (mode === 'explain') { prompt = ` תפקידך לסייע למשתמש להבין פוסט בפורום. הטקסט: "${textToProcess}" 1. סכם את הפוסט בקיצור נמרץ. 2. הסבר מושגים טכניים או סלנג אם יש. `; } else { prompt = ` אתה משתמש מומחה בפורום מקצועי ("מתמחים טופ"). כתוב נוסח לתגובה עבור הפוסט הבא. התגובה צריכה להיות: 1. מועילה ומקצועית. 2. מנומסת ומכבדת. 3. בעברית. 4. אם זו שאלה טכנית, הצע כיוון לפתרון (אם אין מספיק מידע, תשאל שאלות מנחות). הפוסט עליו עונים: "${textToProcess}" `; } const responseText = await callGeminiAPI(prompt); const formattedHTML = formatMarkdown(responseText); // שינוי צבע המסגרת לפי סוג הפעולה (ירוק לתשובה, סגול להסבר) const borderColor = mode === 'explain' ? '#8e44ad' : '#27ae60'; resultBox.style.borderRightColor = borderColor; resultBox.innerHTML = ` <div class="gemini-close" onclick="this.parentElement.remove()">✖</div> <div class="gemini-content">${formattedHTML}</div> <div style="margin-top:10px; font-size:11px; color:#aaa;"> ${mode === 'explain' ? 'סיכום' : 'הצעת תשובה'} (מודל: ${MODEL}) </div> `; } catch (error) { console.error(error); resultBox.innerHTML = ` <div class="gemini-close" onclick="this.parentElement.remove()">✖</div> <div style="color:red">שגיאה: ${error}</div> `; } } // --- תקשורת עם גוגל --- function callGeminiAPI(promptText) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "POST", url: `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`, headers: { "Content-Type": "application/json" }, data: JSON.stringify({ contents: [{ parts: [{ text: promptText }] }] }), onload: function(response) { if (response.status >= 200 && response.status < 300) { try { const json = JSON.parse(response.responseText); // בדיקה אם המודל החזיר תוכן if (json.candidates && json.candidates[0].content) { resolve(json.candidates[0].content.parts[0].text); } else { reject("המודל לא החזיר טקסט (אולי תוכן חסום?)"); } } catch (e) { reject("שגיאה בפענוח JSON"); } } else { reject(`שגיאת שרת: ${response.status}`); } }, onerror: function(err) { reject("שגיאת חיבור"); } }); }); } function formatMarkdown(text) { return text .replace(/^### (.*$)/gim, '<h3>$1</h3>') .replace(/^## (.*$)/gim, '<h3>$1</h3>') .replace(/\*\*(.*?)\*\*/gim, '<strong>$1</strong>') .replace(/^\* (.*$)/gim, '<ul><li>$1</li></ul>') .replace(/<\/ul>\s*<ul>/gim, '') .replace(/\n/gim, '<br>'); } init(); })();מוקדש ל @יאיר-דניאל וכל שוכני השרשור הזה
דוגמה קטנה של סיכום הפוסט (לא רואים הכול כי זה חלונית נגללת)

-
@איש-אמת
אני חושב שהיה את זה בפורום, וההנהלה מחקה, כי זה יגרום להספמה.איך היית משועמם? משרשור אחר אני מבין שיש לך מספיק קווים להאזין להם...
-
י יאיר דניאל התייחס לנושא זה