@עידו300 זה אתר לבניית אפליקציות וייב קוד, מאד קל זורם ויעיל, אפשר לבנות דרכו גם אפליקציות גדולות ומורכבות, אם כי כדי שזה יעבוד טוב באפליקציות מורכבות צריך כמובן לעבוד איתו נכון ולא להתפתות לבקש ממנו בבת אחת ליצור הכל בכל מכל כל, לבנות שלב שלב, ולהשתמש עם הרבה מצב דיון, אני מאד נהנה עם זה בניתי שם כבר כמה אפליקתיות גדולות ממש ומורכבות ממש.
בהצלחה.
צמצם
-
בקשת מידע | בניית תוכנה שלימה עם AI -
בקשת מידע | בניית תוכנה שלימה עם AI@צמצם שים לב, באתרים שמבוססים על Base44 שכוללים מערכת משתמשים, הם ברוב גדול מאוד של המקרים לא מוגנים. בעבר פתחתי פה נושא על זה, אבל הוא ירד.
מה המשמעות?
-
בקשת מידע | בניית תוכנה שלימה עם AI@עידו300 נכון, תנסה להתחבר דרך חשבון גוגל בדרך כלל זה הולך בקלות.
-
בקשת מידע | בניית תוכנה שלימה עם AI -
להורדה | סימניה להורדת קבצי הקוד מ Base44תיקנתי את הסקריפט שוב עם קלוד והתברר שהבעיה הייתה כי Base44 עברו למבנה role="treeitem" עם ARIA מלא, במקום button + SVG עם קלאס lucide. זה ההסבר לכל התקלה (לא באמת הבנתי... קלוד ניתח את זה עם בדיקות בקונסול וזה התוצאה)
מדביק את הסקריפט המעודכן, בהצלחה.
javascript:(async()=>{ if(document.querySelector("html").className.includes("translated"))return alert("⚠ בטל תרגום דפדפן."); const sleep=ms=>new Promise(r=>setTimeout(r,ms)); const waitFor=async(checkFn,{maxWait=2000,interval=30,stableChecks=2}={})=>{ const start=Date.now();let last=undefined,stable=0; while(Date.now()-start<maxWait){ let val;try{val=await checkFn();}catch(e){val=undefined;} if(val!==undefined&&val===last){stable++;if(stable>=stableChecks)return val;}else{stable=0;} last=val;await sleep(interval); } return last; }; const nav=document.querySelector('[data-testid="ds-file-tree"]')||document.querySelector('nav.flex-1.overflow-y-auto'); if(!nav)return alert("❌ לא נמצא עץ קבצים. ודא שאתה בלשונית 'Code'."); let root;try{root=await window.showDirectoryPicker({mode:"readwrite"})}catch{return} const panel=document.createElement("div"); panel.style="position:fixed;top:12px;left:50%;transform:translateX(-50%);width:450px;background:#111;color:#fff;font:13px system-ui;padding:16px;border-radius:14px;z-index:999999;direction:rtl;box-shadow:0 10px 30px rgba(0,0,0,0.8);border:1px solid #333"; panel.innerHTML=`<div style="display:flex;gap:10px;align-items:center;margin-bottom:12px"><div style="width:16px;height:16px;border:3px solid #444;border-top-color:#4caf50;border-radius:50%;animation:spin 1s linear infinite"></div><b style="font-size:15px">Base44 Extractor V16 (Fast)</b></div><div id="stg" style="color:#aaa;margin-bottom:8px">מאתחל...</div><div style="background:#222;height:12px;border-radius:6px;overflow:hidden"><div id="bar" style="height:100%;width:0%;background:#4caf50;transition:width 0.3s"></div></div><div id="pct" style="margin-top:6px;color:#888;font-size:12px">0%</div><div id="logArea" style="margin-top:10px;height:150px;background:#000;border:1px solid #444;border-radius:6px;overflow-y:auto;font-family:monospace;font-size:11px;padding:6px;text-align:left;direction:ltr;white-space:nowrap;color:#0f0;"></div><style>@keyframes spin{to{transform:rotate(360deg)}}</style>`; document.body.appendChild(panel); const stage=t=>{panel.querySelector("#stg").textContent=t;}; let fullLog=""; const logFn=m=>{console.log(m);fullLog+=m+"\r\n";const l=panel.querySelector("#logArea");if(l){l.innerHTML+='<div>> '+m+'</div>';l.scrollTop=l.scrollHeight;}}; const progress=(d,t)=>{const p=Math.floor((d/t)*100);panel.querySelector("#bar").style.width=p+"%";panel.querySelector("#pct").textContent=`${p}% (${d} מתוך ${t} קבצים)`;}; logFn("System Initialized V16 - Fast Mode."); const getNodes=()=>Array.from(nav.querySelectorAll('[role="treeitem"]')).map(el=>{ const isFolder=el.hasAttribute('data-group-id'); const isFile=el.hasAttribute('data-file-id'); const fullPath=isFolder?el.getAttribute('data-group-id'):el.getAttribute('data-file-id'); if(!fullPath)return null; const nameSpan=el.querySelector('span[data-testid="ds-text"]')||el.querySelector('span[data-ds-tooltip-anchor]'); const text=nameSpan?nameSpan.innerText.trim():fullPath.split('/').pop(); const isClosed=isFolder&&el.getAttribute('aria-expanded')==='false'; const clickTarget=el.querySelector('div.cursor-pointer')||el; return{el,clickTarget,text,fullPath,isFolder,isFile,isClosed}; }).filter(Boolean); const scrollTop=async()=>{nav.scrollTop=0;await waitFor(()=>nav.scrollTop,{maxWait:400,interval:30,stableChecks:2});}; const scrollStep=async(px=700)=>{const oldScroll=nav.scrollTop;nav.scrollTop+=px;await waitFor(()=>nav.scrollTop,{maxWait:250,interval:25,stableChecks:2});return nav.scrollTop!==oldScroll;}; stage("פותח תיקיות..."); await scrollTop(); let expStable=0,attempts=new Map(); while(expStable<5){ const nodes=getNodes(); let expanded=false; for(const n of nodes){ if(n.isClosed){ const tries=attempts.get(n.fullPath)||0; if(tries<3){ attempts.set(n.fullPath,tries+1); logFn(`Expanding folder: ${n.fullPath}`); n.el.scrollIntoView({block:"center"}); n.clickTarget.click(); await waitFor(()=>{const fresh=getNodes().find(x=>x.fullPath===n.fullPath);return fresh?(fresh.isClosed===false?true:undefined):undefined;},{maxWait:600,interval:25,stableChecks:1}); expanded=true;expStable=0;break; } } } if(!expanded){const moved=await scrollStep(700);if(!moved)expStable++;else expStable=0;} } stage("ממפה פרויקט..."); await scrollTop(); let mappedFiles=new Map(),mapStable=0; while(mapStable<5){ const nodes=getNodes(); for(const n of nodes){ if(n.isFile&&!mappedFiles.has(n.fullPath)){ const saveName=n.text.includes(".")?n.text:n.text+".js"; const parts=n.fullPath.split('/'); mappedFiles.set(n.fullPath,{name:saveName,path:n.fullPath,dir:parts.slice(0,-1)}); logFn(`Mapped: ${n.fullPath}`); } } const moved=await scrollStep(700); if(!moved)mapStable++;else mapStable=0; } const fList=Array.from(mappedFiles.values()); logFn(`Mapping complete. Found ${fList.length} files.`); if(!fList.length){panel.remove();return alert("לא נמצאו קבצים. נסה לרענן את העמוד.");} const sanitize=s=>s.replace(/[<>:"\/\\|?*]/g,"_"); const readMonacoContent=async(fileName)=>{ return await waitFor(()=>{ if(window.monaco?.editor){ const m=window.monaco.editor.getModels(); if(m.length){ const md=m.find(x=>x.uri.path.toLowerCase().endsWith(fileName.toLowerCase()))||m[0]; const val=md.getValue(); if(val)return val; } } return undefined; },{maxWait:2500,interval:30,stableChecks:2}); }; let saved=0,failed=[]; for(let i=0;i<fList.length;i++){ const file=fList[i]; stage(`מוריד: ${file.name}`); progress(i,fList.length); logFn(`--- Target: ${file.path} ---`); await scrollTop(); let tgt=null,tgtEl=null,sStable=0; while(sStable<5&&!tgt){ const nodes=getNodes(); const found=nodes.find(n=>n.fullPath===file.path); if(found){tgt=found.clickTarget;tgtEl=found.el;break;} const moved=await scrollStep(700); if(!moved)sStable++;else sStable=0; } let content=""; let retryCount=0; while(retryCount<2&&!content){ if(tgt){ tgtEl.scrollIntoView({block:"center"}); tgt.click(); await sleep(70); try{ content=await readMonacoContent(file.name)||""; if(content)logFn("Read from Monaco API."); }catch(e){logFn(`Monaco error: ${e.message}`);} } if(!content){ retryCount++; if(retryCount<2){logFn(`Retry ${retryCount} for ${file.name}...`);await sleep(300);} } } if(content){ try{ let dH=root; for(const p of file.dir)dH=await dH.getDirectoryHandle(sanitize(p),{create:true}); const fH=await dH.getFileHandle(sanitize(file.name),{create:true}); const w=await fH.createWritable(); await w.write(content); await w.close(); saved++; logFn(`Saved: ${file.name}`); }catch(e){ logFn(`Save error: ${e.message}`); failed.push(file.path); } }else{ logFn(`ERROR: No content after retries — ${file.path}`); failed.push(file.path); } } progress(fList.length,fList.length); stage("הושלם ✅"); logFn(`Done! Saved ${saved}/${fList.length}`); try{ const logFH=await root.getFileHandle("extraction_log.txt",{create:true}); const logW=await logFH.createWritable(); await logW.write(fullLog); await logW.close(); }catch(e){} setTimeout(()=>{ panel.remove(); alert(`✅ החילוץ הסתיים!\nנשמרו ${saved}/${fList.length} קבצים.\n${failed.length?"נכשלו:\n"+failed.join("\n"):""}`); },1200); })(); -
להורדה | סימניה להורדת קבצי הקוד מ Base44 -
להורדה | סימניה להורדת קבצי הקוד מ Base44@רציונל ויש הבדל ביניהם? בגירסה הקודמת יש פחות סיכויים שיראו איך הוא עשה את זה?
-
להורדה | סימניה להורדת קבצי הקוד מ Base44@לאצי @oryadaniely השתמשתי עם הקוד שלך ותודה רבה עליה...
מה שכן, זה לוקח הרבה זמן כי בקוד מוטמע שהוא מחכה בכל טעינת דף 2 שניות ולפעמים זה לחכות הרבה זמן עד שהוא גומר להוריד הכל,ביקשתי מקלוד שישנה את הקוד שהוא לא מחכה 2 שניות אלא מחכה עד שהדף נטען וזה אכן הוריד הרבה יותר מהר.
מצרף את הקוד ששיניתי.
javascript:(async()=>{if(document.querySelector("html").className.includes("translated"))return alert("⚠ בטל תרגום דפדפן.");const sleep=ms=>new Promise(r=>setTimeout(r,ms));const waitFor=async(checkFn,{maxWait=3000,interval=50,stableChecks=2}={})=>{ const start=Date.now(); let last=undefined,stable=0; while(Date.now()-start<maxWait){ let val; try{val=await checkFn();}catch(e){val=undefined;} if(val!==undefined&&val===last){ stable++; if(stable>=stableChecks)return val; }else{ stable=0; } last=val; await sleep(interval); } return last;};const nav=document.querySelector('nav.flex-1.overflow-y-auto');if(!nav)return alert("❌ לא נמצא עץ קבצים. ודא שאתה בלשונית 'Code'.");let root;try{root=await window.showDirectoryPicker({mode:"readwrite"})}catch{return}const panel=document.createElement("div");panel.style="position:fixed;top:12px;left:50%;transform:translateX(-50%);width:450px;background:#111;color:#fff;font:13px system-ui;padding:16px;border-radius:14px;z-index:999999;direction:rtl;box-shadow:0 10px 30px rgba(0,0,0,0.8);border:1px solid #333";panel.innerHTML=%60<div style="display:flex;gap:10px;align-items:center;margin-bottom:12px"><div style="width:16px;height:16px;border:3px solid #444;border-top-color:#4caf50;border-radius:50%;animation:spin 1s linear infinite"></div><b style="font-size:15px">Base44 Extractor V14 (Fast)</b></div><div id="stg" style="color:#aaa;margin-bottom:8px">מאתחל...</div><div style="background:#222;height:12px;border-radius:6px;overflow:hidden"><div id="bar" style="height:100%;width:0%;background:#4caf50;transition:width 0.3s"></div></div><div id="pct" style="margin-top:6px;color:#888;font-size:12px">0%</div><div id="logArea" style="margin-top:10px;height:150px;background:#000;border:1px solid #444;border-radius:6px;overflow-y:auto;font-family:monospace;font-size:11px;padding:6px;text-align:left;direction:ltr;white-space:nowrap;color:#0f0;"></div><style>@keyframes spin{to{transform:rotate(360deg)}}</style>%60;document.body.appendChild(panel);const stage=t=>{panel.querySelector("#stg").textContent=t;};let fullLog="";const logFn=m=>{console.log(m);fullLog+=m+"\r\n";const l=panel.querySelector("#logArea");if(l){l.innerHTML+='<div>> '+m+'</div>';l.scrollTop=l.scrollHeight;}};const progress=(d,t)=>{const p=Math.floor((d/t)*100);panel.querySelector("#bar").style.width=p+"%";panel.querySelector("#pct").textContent=%60${p}% (${d} מתוך ${t} קבצים)%60;};logFn("System Initialized V14 - Base44 Native Engine (Dynamic Wait).");const getNodes=()=>{ return Array.from(nav.querySelectorAll("button")).map(btn=>{ const span=btn.querySelector("span.truncate"); if(!span)return null; const text=span.innerText.trim(); const pl=parseInt(btn.style.paddingLeft||"8"); const chevron=btn.querySelector("svg.lucide-chevron-down"); const isFolder=!!chevron; const isClosed=isFolder&&chevron.classList.contains("-rotate-90"); return{btn,text,depth:pl,isFolder,isClosed,isFile:!isFolder}; }).filter(Boolean);};const scrollTop=async()=>{ logFn("Scrolling tree to top..."); nav.scrollTop=0; await waitFor(()=>nav.scrollTop,{maxWait:600,interval:50,stableChecks:2});};const scrollStep=async(px=300)=>{ const oldScroll=nav.scrollTop; nav.scrollTop+=px; await waitFor(()=>nav.scrollTop,{maxWait:400,interval:40,stableChecks:2}); return nav.scrollTop!==oldScroll;};stage("פותח תיקיות (Native)...");await scrollTop();let expStable=0,attempts=new Map();while(expStable<5){ const nodes=getNodes(); let expanded=!1; for(const n of nodes){ if(n.isClosed){ const tries=attempts.get(n.text)||0; if(tries<3){ attempts.set(n.text,tries+1); logFn(%60Expanding folder: ${n.text}%60); n.btn.scrollIntoView({block:"center"}); await waitFor(()=>true,{maxWait:250,interval:50,stableChecks:1}); const beforeCount=nav.querySelectorAll("button").length; n.btn.click(); await waitFor(()=>nav.querySelectorAll("button").length!==beforeCount?nav.querySelectorAll("button").length:undefined,{maxWait:800,interval:40,stableChecks:1}); expanded=!0; expStable=0; break; } } } if(!expanded){ const moved=await scrollStep(300); if(!moved)expStable++;else expStable=0; }}stage("ממפה פרויקט...");await scrollTop();let cStk=[],mappedFiles=new Map(),mapStable=0;while(mapStable<5){ const nodes=getNodes(); for(const n of nodes){ while(cStk.length>0&&cStk[cStk.length-1].depth>=n.depth)cStk.pop(); cStk.push(n); if(n.isFile){ const fullPath=cStk.map(p=>p.text).join("/"); if(!mappedFiles.has(fullPath)){ const saveName=n.text.includes(".")?n.text:n.text+".js"; mappedFiles.set(fullPath,{name:saveName,path:fullPath,dir:cStk.slice(0,-1).map(p=>p.text)}); logFn(%60Mapped: ${fullPath}%60); } } } const moved=await scrollStep(300); if(!moved)mapStable++;else mapStable=0;}const fList=Array.from(mappedFiles.values());logFn(%60Mapping complete. Found ${fList.length} files.%60);if(!fList.length){panel.remove();return alert("לא נמצאו קבצים. נסה לרענן את העמוד.");}const sanitize=s=>s.replace(/[<>:"\/\\|?*]/g,"_");const readMonacoContent=async(fileName)=>{ return await waitFor(()=>{ if(window.monaco?.editor){ const m=window.monaco.editor.getModels(); if(m.length){ const md=m.find(x=>x.uri.path.toLowerCase().endsWith(fileName.toLowerCase()))||m[0]; const val=md.getValue(); if(val)return val; } } return undefined; },{maxWait:3000,interval:50,stableChecks:2});};let saved=0,failed=[];for(let i=0;i<fList.length;i++){ const file=fList[i]; stage(%60מוריד: ${file.name}%60); progress(i,fList.length); logFn(%60--- Target: ${file.path} ---%60); await scrollTop(); let tgt=null,sStable=0; cStk=[]; while(sStable<5&&!tgt){ const nodes=getNodes(); for(const n of nodes){ while(cStk.length>0&&cStk[cStk.length-1].depth>=n.depth)cStk.pop(); cStk.push(n); const cp=cStk.map(p=>p.text).join("/"); if(cp===file.path){tgt=n.btn;break;} } if(tgt)break; const moved=await scrollStep(300); if(!moved)sStable++;else sStable=0; } if(tgt){ tgt.scrollIntoView({block:"center"}); await waitFor(()=>true,{maxWait:250,interval:50,stableChecks:1}); logFn(%60Clicking file...%60); tgt.click(); await sleep(120); let content=""; try{ content=await readMonacoContent(file.name)||""; if(content)logFn("Read from Monaco API."); }catch(e){logFn(%60Monaco error: ${e.message}%60);} if(content){ try{ let dH=root; for(const p of file.dir)dH=await dH.getDirectoryHandle(sanitize(p),{create:true}); const fH=await dH.getFileHandle(sanitize(file.name),{create:true}); const w=await fH.createWritable(); await w.write(content); await w.close(); saved++; logFn(%60Saved: ${file.name}%60); }catch(e){ logFn(%60Save error: ${e.message}%60); failed.push(file.path); } }else{ logFn("ERROR: No content."); failed.push(file.path); } }else{ logFn("ERROR: Node not found in tree."); failed.push(file.path); }}progress(fList.length,fList.length);stage("הושלם ✅");logFn(%60Done! Saved ${saved}/${fList.length}%60);try{ const logFH=await root.getFileHandle("extraction_log.txt",{create:true}); const logW=await logFH.createWritable(); await logW.write(fullLog); await logW.close();}catch(e){}setTimeout(()=>{ panel.remove(); alert(%60✅ החילוץ הסתיים!\nנשמרו ${saved}/${fList.length} קבצים.\n${failed.length?"נכשלו:\n"+failed.join("\n"):""}%60);},1500);})(); -
המלצה | חדש חדש!! צ'אט ישיר בין מחשבים כולל שיחות וידאו ואודיו והעברת קבצים ישירה פתוח לכולם!!!!@רוטב-שום גם אם אתה מרענן את הדף?
-
המלצה | חדש חדש!! צ'אט ישיר בין מחשבים כולל שיחות וידאו ואודיו והעברת קבצים ישירה פתוח לכולם!!!!@רוטב-שום לא יודע...
אצלי זה עובד מצוין

-
המלצה | חדש חדש!! צ'אט ישיר בין מחשבים כולל שיחות וידאו ואודיו והעברת קבצים ישירה פתוח לכולם!!!!@רוטב-שום תחליף את סיומת הקובץ ל-HTML
