מדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק
-
שלום לכל חברי הפורום היקרים!
ייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק
הקוד עודכן ב- 21/06/2026
מי מאיתנו לא מצא את עצמו מנהל שיחה ארוכה ומחכימה עם ה-AI (ג'מיני או צ'אט GPT) ורוצה לשמור את כל התוכן אצלו במחשב בצורה מסודרת? הכנתי סקריפט קטן וחכם שעושה את העבודה בשבילכם.
הסקריפט יוסיף לכם אייקון פינתי קטן לשמירת השרשור, בלחיצה על האייקון, הסקריפט יסרוק עבורכם את כל ההודעות בשיחה, ויוריד לכם אוטומטית את כל השרשור בקובץ טקסט בסיסי מסודר למחשב.
את הסקריפט הכנתי (בסיוע AI כמובן) לא מזמן עבורי ועבור חבר קרוב, ואני שמח לשתף אותו איתכם, תהנו גם אתם.
הוראות התקנה
-
יש להתקין את Tampermonkey – תוסף פופולארי לדפדפני כרום (ודומיהם), שמאפשר להריץ סקריפטים מותאמים אישית באתרים שונים. (@עדלאידע כתב כאן מדריך ברור ומפורט לתוסף).
-
לאחר התקנת התוסף:
- היכנסו לרשימת התוספים של הדפדפן.
- לחצו קליק ימני על סמל תוסף Tampermonkey ובחרו: "Create a new script..." - ייפתח עורך הסקריפטים.
- מחקו את כל התוכן הקיים.
- הדביקו שם את הקוד המצורף.
- שמרו את הסקריפט (Ctrl+S או דרך התפריט: קובץ > Save).
כעת ברגע שתיכנסו לצ'אט, יופיע לכם כפתור
קטן בפינה השמאלית למטה.
הבהרות
- הסקריפט פועל על בסיס מבנה האתרים (HTML), אם גוגל או OpenAI ישנו משמעותית את עיצוב האתר, ייתכן שיידרש עדכון לקוד.
- ניסיתי את הסקריפט על שרשורים בני מאות הודעות וזה עבד מעולה. עם זאת, בשרשורים של אלפי הודעות היו קצת באגים, והיה צריך להפעיל אותו כמה פעמים עד שהוא הצליח לסרוק את כל השרשור מהתחלה. לא היה לי פנאי ואפשרות לסדר את זה כרגע...
הקוד המלא
// ==UserScript== // @name ייצוא שרשורים מג'מיני וצ'אט GPT // @namespace http://tampermonkey.net/ // @version 1.1 // @description ייצוא שרשורי שיחות מ-ChatGPT ו-Gemini לקובץ טקסט מסודר וקריא // @author I believe (https://mitmachim.top/user/i-believe) // @match *://chatgpt.com/* // @match *://gemini.google.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com // @grant GM_addStyle // @run-at document-idle // @license MIT // ==/UserScript== (function() { 'use strict'; const CONFIG = { btnId: 'ai-universal-export-btn', statusId: 'ai-export-status-window', overlayId: 'ai-export-overlay', forbiddenPhrases: [ "Gemini אמר", "אמרת", "העתקה", "share", "Share", "Like", "Dislike", "הצגת תשובות נוספות", "דווח על בעיה משפטית", "Report", "Copy code", "Regenerate", "volume_up", "thumb_up", "thumb_down", "more_vert", "עריכה", "הקשבה", "טוב לדעת שזה עזר!", "שמירה ב-Drive", "You", "ChatGPT" ] }; function injectCSS() { const styleId = 'ai-capturer-style-v15-0'; if (document.getElementById(styleId)) return; const css = ` #${CONFIG.btnId} { position: fixed !important; bottom: 25px !important; left: 25px !important; z-index: 999999 !important; width: 50px !important; height: 50px !important; display: flex !important; align-items: center !important; justify-content: center !important; background-color: #7dd3fc !important; color: #1d4ed8 !important; border: 1px solid #bae6fd !important; border-radius: 12px !important; cursor: pointer !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important; font-size: 28px !important; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; } #${CONFIG.btnId}:hover { transform: scale(1.1); box-shadow: 0 6px 20px rgba(37, 99, 235, 0.5) !important; } #${CONFIG.overlayId} { position: fixed !important; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7) !important; z-index: 1000000 !important; display: none; align-items: center; justify-content: center; backdrop-filter: blur(2px); } #${CONFIG.statusId} { background: #ffffff !important; color: #1f2937 !important; padding: 30px !important; border-radius: 15px !important; width: 350px !important; text-align: center !important; direction: rtl !important; font-family: system-ui, -apple-system, sans-serif !important; box-shadow: 0 25px 50px -12px rgba(0,0,0,0.5) !important; } .ai-spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3b82f6; border-radius: 50%; width: 40px; height: 40px; animation: ai-spin 1s linear infinite; margin: 0 auto 20px; } @keyframes ai-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `; const style = document.createElement('style'); style.id = styleId; style.textContent = css; document.head.appendChild(style); } function updateStatus(msg, isFinal = false) { let overlay = document.getElementById(CONFIG.overlayId); if (!overlay) { overlay = document.createElement('div'); overlay.id = CONFIG.overlayId; const win = document.createElement('div'); win.id = CONFIG.statusId; overlay.appendChild(win); document.body.appendChild(overlay); } overlay.style.display = 'flex'; const win = document.getElementById(CONFIG.statusId); while (win.firstChild) win.removeChild(win.firstChild); if (!isFinal) { const spinner = document.createElement('div'); spinner.className = 'ai-spinner'; win.appendChild(spinner); } else { const check = document.createElement('div'); check.textContent = '✅'; check.style.fontSize = '40px'; check.style.marginBottom = '15px'; win.appendChild(check); } const title = document.createElement('div'); title.style.fontWeight = 'bold'; title.style.fontSize = '18px'; title.style.marginBottom = '10px'; title.textContent = isFinal ? 'ייצוא קובץ' : 'ריענון היסטוריה'; win.appendChild(title); const content = document.createElement('div'); content.style.fontSize = '15px'; content.style.color = '#4b5553'; content.textContent = msg; win.appendChild(content); } function cleanAndFormatContent(el) { let text = el.innerText; if (!text) return ""; const listItems = el.querySelectorAll('li'); listItems.forEach(li => { const liText = li.innerText.trim(); if (liText && !liText.startsWith('*')) { text = text.replace(liText, `* ${liText}`); } }); return text.split('\n') .map(line => line.trim()) .filter(line => { if (!line) return false; return !CONFIG.forbiddenPhrases.some(phrase => line === phrase || line.includes(phrase)); }) .join('\n'); } // ============================================================ // getSmartTitle — השיטה הכי בטוחה, מנסה כל האופציות לפי סדר // ============================================================ function getSmartTitle() { const isGemini = location.hostname.includes('gemini'); let title = ""; if (isGemini) { // --- שיטה 1: aria-selected או aria-current (הכי עמיד לשינויים) --- const ariaSelectors = [ '[aria-selected="true"]', '[aria-current="true"]', '[aria-current="page"]', ]; for (const sel of ariaSelectors) { const el = document.querySelector(sel); if (el) { // לוקחים רק את השורה הראשונה של הטקסט title = el.innerText?.split('\n')[0]?.trim() || ""; if (title.length > 2) break; } } // --- שיטה 2: class names נפוצים של ג'מיני (מתעדכן כשהם משנים) --- if (!title || title.length < 2) { const classSelectors = [ '.gds-selected', '[class*="selected"] [class*="title"]', '[class*="selected"] [class*="label"]', '[class*="active"] [class*="title"]', '[class*="active"] [class*="label"]', '[class*="ConversationItem"][class*="active"]', '[class*="conversation-item"][class*="selected"]', 'side-navigation-item[active]', 'side-navigation-item.selected', ]; for (const sel of classSelectors) { try { const el = document.querySelector(sel); if (el) { title = el.innerText?.split('\n')[0]?.trim() || ""; if (title.length > 2) break; } } catch(e) {} } } // --- שיטה 3: סריקה חכמה — מוצא את כל פריטי הרשימה בסיידבר ובוחר את הפעיל --- if (!title || title.length < 2) { const allNavItems = document.querySelectorAll( 'nav a, nav li, nav [role="listitem"], nav [role="option"], ' + 'aside a, aside li, aside [role="listitem"], ' + '[role="navigation"] a, [role="navigation"] li' ); for (const item of allNavItems) { const isActive = item.getAttribute('aria-selected') === 'true' || item.getAttribute('aria-current') !== null || item.classList.toString().toLowerCase().includes('active') || item.classList.toString().toLowerCase().includes('selected') || item.classList.toString().toLowerCase().includes('current'); if (isActive) { const candidate = item.innerText?.split('\n')[0]?.trim() || ""; // מסנן טקסטים שנראים כמו כפתורים או תפריטים, לא כותרות שיחה if (candidate.length > 2 && candidate.length < 120) { title = candidate; break; } } } } // --- שיטה 4: Shadow DOM — ג'מיני לפעמים משתמש בו --- if (!title || title.length < 2) { const shadowHosts = document.querySelectorAll('*'); for (const host of shadowHosts) { if (!host.shadowRoot) continue; try { const inner = host.shadowRoot.querySelector( '[aria-selected="true"], [aria-current], .selected, .active' ); if (inner) { title = inner.innerText?.split('\n')[0]?.trim() || ""; if (title.length > 2) break; } } catch(e) {} } } // --- שיטה 5: כותרת הדף עצמו כ-fallback אחרון --- if (!title || title.length < 2) { title = document.title || ""; } } else { // ChatGPT — הלוגיקה המקורית שעובדת const activeChat = document.querySelector('ol li div.bg-token-sidebar-surface-active'); if (activeChat) title = activeChat.innerText; if (!title || title.length < 2) title = document.title; } // ניקוי סופי title = title .replace(/Gemini|ChatGPT|Google|New chat|אמרת/gi, '') .replace(/[\\/:*?"<>|]/g, '') .trim(); return title || "שיחת AI"; } const sleep = ms => new Promise(res => setTimeout(res, ms)); async function runExport() { const chatTitle = getSmartTitle(); const threadUrl = window.location.href; updateStatus("סורק את כל ההודעות בשרשור..."); const isGemini = location.hostname.includes('gemini'); const scrollContainer = isGemini ? document.querySelector('main-content-scrollable-container') || window : document.querySelector('main') || window; let lastCount = 0, retries = 0; while (retries < 5) { const selector = isGemini ? 'user-query, model-response' : 'article, [data-testid*="conversation-turn"]'; const elements = document.querySelectorAll(selector); updateStatus(`סורק הודעות... זוהו: ${elements.length}`); if (elements.length > 0) elements[0].scrollIntoView({ behavior: 'auto', block: 'start' }); if (scrollContainer.scrollTo) scrollContainer.scrollTo(0, 0); else window.scrollTo(0, 0); await sleep(1200); const newElements = document.querySelectorAll(selector); if (newElements.length > lastCount) { lastCount = newElements.length; retries = 0; } else { retries++; } if (retries > 2 && ((scrollContainer === window ? window.scrollY : scrollContainer.scrollTop) === 0)) break; } updateStatus("מכין את קובץ התיעוד הסופי..."); const msgSelector = isGemini ? 'user-query, model-response' : 'article, [data-testid*="conversation-turn"]'; const finalElements = document.querySelectorAll(msgSelector); const d = new Date(); const dateDots = `${String(d.getDate()).padStart(2, '0')}.${String(d.getMonth() + 1).padStart(2, '0')}.${d.getFullYear()}`; const timeStr = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`; let contentBuffer = `נושא: ${chatTitle}\n`; contentBuffer += `תאריך ייצוא: ${dateDots} | שעה: ${timeStr}\n`; contentBuffer += `קישור: ${threadUrl}\n`; contentBuffer += `${'='.repeat(60)}\n\n`; finalElements.forEach(el => { let role = ( isGemini && ( el.tagName.toLowerCase().includes('user') || el.closest('user-query') ) ) || ( !isGemini && ( el.querySelector('[data-message-author-role="user"]') || el.innerText.includes("אמרת") ) ) ? "אני" : (isGemini ? "Gemini" : "ChatGPT"); const cleanText = cleanAndFormatContent(el); let fileInfo = ""; let fileCount = 0; if (isGemini) { fileCount = el.querySelectorAll('inline-chip, img, .image-container').length; } else { fileCount = el.querySelectorAll('.file-attachment, [data-testid="attachment-wrapper"], img').length; } if (fileCount > 0) { fileInfo = `\n[להודעה זו מצורפים ${fileCount} קבצים]`; } if (cleanText || fileCount > 0) { contentBuffer += `[${role}]:\n${cleanText}${fileInfo}\n${'-'.repeat(40)}\n\n`; } }); const fileName = `${dateDots} - ${chatTitle}.txt`; const blob = new Blob([contentBuffer.trim()], { type: 'text/plain;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = fileName; a.click(); URL.revokeObjectURL(url); updateStatus("הקובץ נשמר בהצלחה!", true); await sleep(2200); document.getElementById(CONFIG.overlayId).style.display = 'none'; if (finalElements.length > 0) finalElements[finalElements.length - 1].scrollIntoView({ behavior: 'smooth' }); } function ensureButtonExists() { injectCSS(); if (document.getElementById(CONFIG.btnId)) return; const btn = document.createElement('button'); btn.id = CONFIG.btnId; btn.textContent = '💾'; btn.title = "ריענון וייצוא היסטוריה"; btn.onclick = (e) => { e.preventDefault(); e.stopPropagation(); runExport(); }; document.body.appendChild(btn); } setInterval(ensureButtonExists, 1000); })();
בהצלחה!
-
-
שלום לכל חברי הפורום היקרים!
ייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק
הקוד עודכן ב- 21/06/2026
מי מאיתנו לא מצא את עצמו מנהל שיחה ארוכה ומחכימה עם ה-AI (ג'מיני או צ'אט GPT) ורוצה לשמור את כל התוכן אצלו במחשב בצורה מסודרת? הכנתי סקריפט קטן וחכם שעושה את העבודה בשבילכם.
הסקריפט יוסיף לכם אייקון פינתי קטן לשמירת השרשור, בלחיצה על האייקון, הסקריפט יסרוק עבורכם את כל ההודעות בשיחה, ויוריד לכם אוטומטית את כל השרשור בקובץ טקסט בסיסי מסודר למחשב.
את הסקריפט הכנתי (בסיוע AI כמובן) לא מזמן עבורי ועבור חבר קרוב, ואני שמח לשתף אותו איתכם, תהנו גם אתם.
הוראות התקנה
-
יש להתקין את Tampermonkey – תוסף פופולארי לדפדפני כרום (ודומיהם), שמאפשר להריץ סקריפטים מותאמים אישית באתרים שונים. (@עדלאידע כתב כאן מדריך ברור ומפורט לתוסף).
-
לאחר התקנת התוסף:
- היכנסו לרשימת התוספים של הדפדפן.
- לחצו קליק ימני על סמל תוסף Tampermonkey ובחרו: "Create a new script..." - ייפתח עורך הסקריפטים.
- מחקו את כל התוכן הקיים.
- הדביקו שם את הקוד המצורף.
- שמרו את הסקריפט (Ctrl+S או דרך התפריט: קובץ > Save).
כעת ברגע שתיכנסו לצ'אט, יופיע לכם כפתור
קטן בפינה השמאלית למטה.
הבהרות
- הסקריפט פועל על בסיס מבנה האתרים (HTML), אם גוגל או OpenAI ישנו משמעותית את עיצוב האתר, ייתכן שיידרש עדכון לקוד.
- ניסיתי את הסקריפט על שרשורים בני מאות הודעות וזה עבד מעולה. עם זאת, בשרשורים של אלפי הודעות היו קצת באגים, והיה צריך להפעיל אותו כמה פעמים עד שהוא הצליח לסרוק את כל השרשור מהתחלה. לא היה לי פנאי ואפשרות לסדר את זה כרגע...
הקוד המלא
// ==UserScript== // @name ייצוא שרשורים מג'מיני וצ'אט GPT // @namespace http://tampermonkey.net/ // @version 1.1 // @description ייצוא שרשורי שיחות מ-ChatGPT ו-Gemini לקובץ טקסט מסודר וקריא // @author I believe (https://mitmachim.top/user/i-believe) // @match *://chatgpt.com/* // @match *://gemini.google.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com // @grant GM_addStyle // @run-at document-idle // @license MIT // ==/UserScript== (function() { 'use strict'; const CONFIG = { btnId: 'ai-universal-export-btn', statusId: 'ai-export-status-window', overlayId: 'ai-export-overlay', forbiddenPhrases: [ "Gemini אמר", "אמרת", "העתקה", "share", "Share", "Like", "Dislike", "הצגת תשובות נוספות", "דווח על בעיה משפטית", "Report", "Copy code", "Regenerate", "volume_up", "thumb_up", "thumb_down", "more_vert", "עריכה", "הקשבה", "טוב לדעת שזה עזר!", "שמירה ב-Drive", "You", "ChatGPT" ] }; function injectCSS() { const styleId = 'ai-capturer-style-v15-0'; if (document.getElementById(styleId)) return; const css = ` #${CONFIG.btnId} { position: fixed !important; bottom: 25px !important; left: 25px !important; z-index: 999999 !important; width: 50px !important; height: 50px !important; display: flex !important; align-items: center !important; justify-content: center !important; background-color: #7dd3fc !important; color: #1d4ed8 !important; border: 1px solid #bae6fd !important; border-radius: 12px !important; cursor: pointer !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important; font-size: 28px !important; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; } #${CONFIG.btnId}:hover { transform: scale(1.1); box-shadow: 0 6px 20px rgba(37, 99, 235, 0.5) !important; } #${CONFIG.overlayId} { position: fixed !important; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7) !important; z-index: 1000000 !important; display: none; align-items: center; justify-content: center; backdrop-filter: blur(2px); } #${CONFIG.statusId} { background: #ffffff !important; color: #1f2937 !important; padding: 30px !important; border-radius: 15px !important; width: 350px !important; text-align: center !important; direction: rtl !important; font-family: system-ui, -apple-system, sans-serif !important; box-shadow: 0 25px 50px -12px rgba(0,0,0,0.5) !important; } .ai-spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3b82f6; border-radius: 50%; width: 40px; height: 40px; animation: ai-spin 1s linear infinite; margin: 0 auto 20px; } @keyframes ai-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `; const style = document.createElement('style'); style.id = styleId; style.textContent = css; document.head.appendChild(style); } function updateStatus(msg, isFinal = false) { let overlay = document.getElementById(CONFIG.overlayId); if (!overlay) { overlay = document.createElement('div'); overlay.id = CONFIG.overlayId; const win = document.createElement('div'); win.id = CONFIG.statusId; overlay.appendChild(win); document.body.appendChild(overlay); } overlay.style.display = 'flex'; const win = document.getElementById(CONFIG.statusId); while (win.firstChild) win.removeChild(win.firstChild); if (!isFinal) { const spinner = document.createElement('div'); spinner.className = 'ai-spinner'; win.appendChild(spinner); } else { const check = document.createElement('div'); check.textContent = '✅'; check.style.fontSize = '40px'; check.style.marginBottom = '15px'; win.appendChild(check); } const title = document.createElement('div'); title.style.fontWeight = 'bold'; title.style.fontSize = '18px'; title.style.marginBottom = '10px'; title.textContent = isFinal ? 'ייצוא קובץ' : 'ריענון היסטוריה'; win.appendChild(title); const content = document.createElement('div'); content.style.fontSize = '15px'; content.style.color = '#4b5553'; content.textContent = msg; win.appendChild(content); } function cleanAndFormatContent(el) { let text = el.innerText; if (!text) return ""; const listItems = el.querySelectorAll('li'); listItems.forEach(li => { const liText = li.innerText.trim(); if (liText && !liText.startsWith('*')) { text = text.replace(liText, `* ${liText}`); } }); return text.split('\n') .map(line => line.trim()) .filter(line => { if (!line) return false; return !CONFIG.forbiddenPhrases.some(phrase => line === phrase || line.includes(phrase)); }) .join('\n'); } // ============================================================ // getSmartTitle — השיטה הכי בטוחה, מנסה כל האופציות לפי סדר // ============================================================ function getSmartTitle() { const isGemini = location.hostname.includes('gemini'); let title = ""; if (isGemini) { // --- שיטה 1: aria-selected או aria-current (הכי עמיד לשינויים) --- const ariaSelectors = [ '[aria-selected="true"]', '[aria-current="true"]', '[aria-current="page"]', ]; for (const sel of ariaSelectors) { const el = document.querySelector(sel); if (el) { // לוקחים רק את השורה הראשונה של הטקסט title = el.innerText?.split('\n')[0]?.trim() || ""; if (title.length > 2) break; } } // --- שיטה 2: class names נפוצים של ג'מיני (מתעדכן כשהם משנים) --- if (!title || title.length < 2) { const classSelectors = [ '.gds-selected', '[class*="selected"] [class*="title"]', '[class*="selected"] [class*="label"]', '[class*="active"] [class*="title"]', '[class*="active"] [class*="label"]', '[class*="ConversationItem"][class*="active"]', '[class*="conversation-item"][class*="selected"]', 'side-navigation-item[active]', 'side-navigation-item.selected', ]; for (const sel of classSelectors) { try { const el = document.querySelector(sel); if (el) { title = el.innerText?.split('\n')[0]?.trim() || ""; if (title.length > 2) break; } } catch(e) {} } } // --- שיטה 3: סריקה חכמה — מוצא את כל פריטי הרשימה בסיידבר ובוחר את הפעיל --- if (!title || title.length < 2) { const allNavItems = document.querySelectorAll( 'nav a, nav li, nav [role="listitem"], nav [role="option"], ' + 'aside a, aside li, aside [role="listitem"], ' + '[role="navigation"] a, [role="navigation"] li' ); for (const item of allNavItems) { const isActive = item.getAttribute('aria-selected') === 'true' || item.getAttribute('aria-current') !== null || item.classList.toString().toLowerCase().includes('active') || item.classList.toString().toLowerCase().includes('selected') || item.classList.toString().toLowerCase().includes('current'); if (isActive) { const candidate = item.innerText?.split('\n')[0]?.trim() || ""; // מסנן טקסטים שנראים כמו כפתורים או תפריטים, לא כותרות שיחה if (candidate.length > 2 && candidate.length < 120) { title = candidate; break; } } } } // --- שיטה 4: Shadow DOM — ג'מיני לפעמים משתמש בו --- if (!title || title.length < 2) { const shadowHosts = document.querySelectorAll('*'); for (const host of shadowHosts) { if (!host.shadowRoot) continue; try { const inner = host.shadowRoot.querySelector( '[aria-selected="true"], [aria-current], .selected, .active' ); if (inner) { title = inner.innerText?.split('\n')[0]?.trim() || ""; if (title.length > 2) break; } } catch(e) {} } } // --- שיטה 5: כותרת הדף עצמו כ-fallback אחרון --- if (!title || title.length < 2) { title = document.title || ""; } } else { // ChatGPT — הלוגיקה המקורית שעובדת const activeChat = document.querySelector('ol li div.bg-token-sidebar-surface-active'); if (activeChat) title = activeChat.innerText; if (!title || title.length < 2) title = document.title; } // ניקוי סופי title = title .replace(/Gemini|ChatGPT|Google|New chat|אמרת/gi, '') .replace(/[\\/:*?"<>|]/g, '') .trim(); return title || "שיחת AI"; } const sleep = ms => new Promise(res => setTimeout(res, ms)); async function runExport() { const chatTitle = getSmartTitle(); const threadUrl = window.location.href; updateStatus("סורק את כל ההודעות בשרשור..."); const isGemini = location.hostname.includes('gemini'); const scrollContainer = isGemini ? document.querySelector('main-content-scrollable-container') || window : document.querySelector('main') || window; let lastCount = 0, retries = 0; while (retries < 5) { const selector = isGemini ? 'user-query, model-response' : 'article, [data-testid*="conversation-turn"]'; const elements = document.querySelectorAll(selector); updateStatus(`סורק הודעות... זוהו: ${elements.length}`); if (elements.length > 0) elements[0].scrollIntoView({ behavior: 'auto', block: 'start' }); if (scrollContainer.scrollTo) scrollContainer.scrollTo(0, 0); else window.scrollTo(0, 0); await sleep(1200); const newElements = document.querySelectorAll(selector); if (newElements.length > lastCount) { lastCount = newElements.length; retries = 0; } else { retries++; } if (retries > 2 && ((scrollContainer === window ? window.scrollY : scrollContainer.scrollTop) === 0)) break; } updateStatus("מכין את קובץ התיעוד הסופי..."); const msgSelector = isGemini ? 'user-query, model-response' : 'article, [data-testid*="conversation-turn"]'; const finalElements = document.querySelectorAll(msgSelector); const d = new Date(); const dateDots = `${String(d.getDate()).padStart(2, '0')}.${String(d.getMonth() + 1).padStart(2, '0')}.${d.getFullYear()}`; const timeStr = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`; let contentBuffer = `נושא: ${chatTitle}\n`; contentBuffer += `תאריך ייצוא: ${dateDots} | שעה: ${timeStr}\n`; contentBuffer += `קישור: ${threadUrl}\n`; contentBuffer += `${'='.repeat(60)}\n\n`; finalElements.forEach(el => { let role = ( isGemini && ( el.tagName.toLowerCase().includes('user') || el.closest('user-query') ) ) || ( !isGemini && ( el.querySelector('[data-message-author-role="user"]') || el.innerText.includes("אמרת") ) ) ? "אני" : (isGemini ? "Gemini" : "ChatGPT"); const cleanText = cleanAndFormatContent(el); let fileInfo = ""; let fileCount = 0; if (isGemini) { fileCount = el.querySelectorAll('inline-chip, img, .image-container').length; } else { fileCount = el.querySelectorAll('.file-attachment, [data-testid="attachment-wrapper"], img').length; } if (fileCount > 0) { fileInfo = `\n[להודעה זו מצורפים ${fileCount} קבצים]`; } if (cleanText || fileCount > 0) { contentBuffer += `[${role}]:\n${cleanText}${fileInfo}\n${'-'.repeat(40)}\n\n`; } }); const fileName = `${dateDots} - ${chatTitle}.txt`; const blob = new Blob([contentBuffer.trim()], { type: 'text/plain;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = fileName; a.click(); URL.revokeObjectURL(url); updateStatus("הקובץ נשמר בהצלחה!", true); await sleep(2200); document.getElementById(CONFIG.overlayId).style.display = 'none'; if (finalElements.length > 0) finalElements[finalElements.length - 1].scrollIntoView({ behavior: 'smooth' }); } function ensureButtonExists() { injectCSS(); if (document.getElementById(CONFIG.btnId)) return; const btn = document.createElement('button'); btn.id = CONFIG.btnId; btn.textContent = '💾'; btn.title = "ריענון וייצוא היסטוריה"; btn.onclick = (e) => { e.preventDefault(); e.stopPropagation(); runExport(); }; document.body.appendChild(btn); } setInterval(ensureButtonExists, 1000); })();
בהצלחה!
@I-believe מאוד שימושי! כמה הצעות לשיפור:
1: כשמפעילים מצב קנבס - זה לא שומר את הקוד שבקנבס
2: אולי תוסיף תמיכה ב-PDF (לתמונות וכדומה)
תודה רבה -
-
@I-believe מאוד שימושי! כמה הצעות לשיפור:
1: כשמפעילים מצב קנבס - זה לא שומר את הקוד שבקנבס
2: אולי תוסיף תמיכה ב-PDF (לתמונות וכדומה)
תודה רבה@מייבין-במקצת תודה רבה על ההצעות!
לגבי התמיכה בקנבס – באמת לא שמתי לב לזה, תודה על ההערה.
בנוגע לתמונות וקבצים ב-PDF – כשבניתי את הכלי חיפשתי משהו קומפקטי וקליל שלא יתפוס מקום על המחשב, לכן הגדרתי שהסקריפט רק יציין אם קיים קובץ מצורף מבלי להוריד אותו פיזית.
בכל אופן, מכיוון שהכנתי את זה בעיקר לצורך אישי, אני יותר מאשמח אם מישהו ירים את הכפפה וישפר את זה עוד כמה צעדים קדימה. ואולי @י.-פל. ישלב את זה בתוסף המוצלח שלו...
-
@מייבין-במקצת תודה רבה על ההצעות!
לגבי התמיכה בקנבס – באמת לא שמתי לב לזה, תודה על ההערה.
בנוגע לתמונות וקבצים ב-PDF – כשבניתי את הכלי חיפשתי משהו קומפקטי וקליל שלא יתפוס מקום על המחשב, לכן הגדרתי שהסקריפט רק יציין אם קיים קובץ מצורף מבלי להוריד אותו פיזית.
בכל אופן, מכיוון שהכנתי את זה בעיקר לצורך אישי, אני יותר מאשמח אם מישהו ירים את הכפפה וישפר את זה עוד כמה צעדים קדימה. ואולי @י.-פל. ישלב את זה בתוסף המוצלח שלו...
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
אני יותר מאשמח אם מישהו ירים את הכפפה וישפר את זה עוד כמה צעדים קדימה.
אני מנסה...
-
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
אני יותר מאשמח אם מישהו ירים את הכפפה וישפר את זה עוד כמה צעדים קדימה.
אני מנסה...
כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
אני מנסה...
וברוך השם מצליח...
הנה זה כתוסף לכרום
מייצא שיחות.zipכרגע הוספתי תמיכה בקובץ וורד PDF ו-HTML לגבי קנבס - עוד לא
-
@מייבין-במקצת תודה רבה על ההצעות!
לגבי התמיכה בקנבס – באמת לא שמתי לב לזה, תודה על ההערה.
בנוגע לתמונות וקבצים ב-PDF – כשבניתי את הכלי חיפשתי משהו קומפקטי וקליל שלא יתפוס מקום על המחשב, לכן הגדרתי שהסקריפט רק יציין אם קיים קובץ מצורף מבלי להוריד אותו פיזית.
בכל אופן, מכיוון שהכנתי את זה בעיקר לצורך אישי, אני יותר מאשמח אם מישהו ירים את הכפפה וישפר את זה עוד כמה צעדים קדימה. ואולי @י.-פל. ישלב את זה בתוסף המוצלח שלו...
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
ואולי @י.-פל. ישלב את זה
יש לי כבר, ממזמן...
-
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
ואולי @י.-פל. ישלב את זה
יש לי כבר, ממזמן...
-
כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
אני מנסה...
וברוך השם מצליח...
הנה זה כתוסף לכרום
מייצא שיחות.zipכרגע הוספתי תמיכה בקובץ וורד PDF ו-HTML לגבי קנבס - עוד לא
-
@YOLEVI כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
נשמח אם תוכל לפרט מה בדיוק הפונקציות בעדכון
https://mitmachim.top/post/1114644
אפשר לבקש עוד, לא מבטיח שאתפנה... -
@YOLEVI כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
נשמח אם תוכל לפרט מה בדיוק הפונקציות בעדכון
https://mitmachim.top/post/1114644
אפשר לבקש עוד, לא מבטיח שאתפנה... -
@י.-פל. זה עובד פשוט מדהים, ובמהירות יוצאת דופן, תודה רבה לך על המאמץ וההשקעה.
נראה לי הגיע הזמן להתאים את התוסף הנפלא שלך גם לג'מיני...
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
לג'מיני
אני לא משתמש בטיפש הזה, ולכן אין לו תוסף...
יום אחד זה גם יקרה... בל"נ.
צריך זמן... -
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
לג'מיני
אני לא משתמש בטיפש הזה, ולכן אין לו תוסף...
יום אחד זה גם יקרה... בל"נ.
צריך זמן... -
@י.-פל. כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
אני לא משתמש בטיפש הזה, ולכן אין לו תוסף...
עד כדי כך??
מה עם גרוק?@YOLEVI כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
עד כדי כך??
כן. מסייג: לא יודע לגבי 3.1
@YOLEVI כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
מה עם גרוק?
לא יודע.
-
@י.-פל. זה עובד פשוט מדהים, ובמהירות יוצאת דופן, תודה רבה לך על המאמץ וההשקעה.
נראה לי הגיע הזמן להתאים את התוסף הנפלא שלך גם לג'מיני...
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
התאים את התוסף הנפלא שלך גם לג'מיני...
-
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
התאים את התוסף הנפלא שלך גם לג'מיני...
-
כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
אני מנסה...
וברוך השם מצליח...
הנה זה כתוסף לכרום
מייצא שיחות.zipכרגע הוספתי תמיכה בקובץ וורד PDF ו-HTML לגבי קנבס - עוד לא
-
ר רואה ואינו נראה התייחס לנושא זה
-
ק קראנץ' ונילה התייחס לנושא זה
-
@I-believe כתב במדריך | תוסף לייצוא שיחות מג'מיני וצ'אט GPT לקובץ טקסט בקליק:
התאים את התוסף הנפלא שלך גם לג'מיני...
-
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות

שווה נושא בפורום