@מתעניין
אתה מוזמן לפתוח ע"ז עצומה לימות או יותר נכון למנהל האתר הזה שמואל.
אני אצטרף.
-
RE: הפרום השתנה לי!!!!
-
RE: הפרום השתנה לי!!!!
@פיתה
ככל הנראה כן.
אני אמנם מתחיל להתרגל אליו לאט לאט, אבל יש דברים פחות מהפורום הקודם -
RE: אישור השתתפות במבצע ושהטבלה תשלח לי בפקס או במייל כשאאשר את זה בטלפון
@קו-הרהיטים
אתה יכול פשוט להגדיר שלוחה נוספת של קבלת נונים שכשתיכנס אליה זה יכניס נתון אחד ריק ואזישלח את הקובץ למייל שלך -
RE: הקראת זמני התפילות מגוגל שיטס
@BEN-ZION
שלוחת API
ובכתובת השלוחה את הפריסה שקיבלת בסקריפט -
RE: אישור השתתפות במבצע ושהטבלה תשלח לי בפקס או במייל כשאאשר את זה בטלפון
@קו-הרהיטים
אתה ורצה שישלח את אישור ההשתתפות?
קבלת נתונים שולח גם מיילים -
RE: הקראת זמני התפילות מגוגל שיטס
@BEN-ZION
אתה תגדיר את הטריגר לפי הזמנים שתרצה שיעדכן.
כרגע, מוגדר בקוד שיבדוק את היום ובכל יום יקריא את העמודה של אותו היום.
תוכל לפתוח סקריפט נוסף שיקריא את כל עמודה מהשלוחה ממנה נשלחה כך שתוכל לעשות תפריט לשמיעת הזמנים לפי ימים. -
RE: אישור השתתפות במבצע ושהטבלה תשלח לי בפקס או במייל כשאאשר את זה בטלפון
@קו-הרהיטים
אני יכול להביא לך את המודולים אבל אני לא בטוח שזה יעבוד.
אין כזה קובץ במערכת, כך שזה ניתן רק להורדה למחשב ישירות. -
RE: בהודעת קמפיין בהקשה על מקש 1 שיעבור לשלוחה כלשהיא
@זעליג
תיכנס לשיגור הודעות>הגדרות קמפיין>סוג קמפיין>ניתוב שיחה למענה אנושי -
RE: בהודעת קמפיין בהקשה על מקש 1 שיעבור לשלוחה כלשהיא
@מוטי-מוטי-מוטי
כן, בלשונית שיגור הודעות בהגדרות קמפיין -
RE: בהודעת קמפיין בהקשה על מקש 1 שיעבור לשלוחה כלשהיא
@זעליג
לאן שתרצה.
למערכת, למערכת אחרת -
RE: השמעת קבצים אם אלפי קבצים כשידור חי📡🎙🎧
@lavitoren-הטי-ל
אבל מישהו הציע במקום אחר אולי להשתמש בשידור חי מדומה ששם יתכן וזה כן ממשיך -
RE: העברת קבצים ממערכת למערכת
@מה
לא היה פשוט, אבל ב"ה.הקוד המשודרג מצורף
<!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <title>העברת שלוחות ממערכת למערכת</title> <style> body { font-family: 'Segoe UI', Tahoma, sans-serif; margin: 20px; background-color: #f4f7f6; text-align: right; direction: rtl; } .container { max-width: 1100px; margin: auto; background: white; padding: 25px; border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); } .section { border: 1px solid #e0e0e0; padding: 15px; margin-bottom: 15px; border-radius: 8px; background: #fafafa; } #logArea { background: #1e1e1e; color: #d4d4d4; padding: 15px; border-radius: 5px; height: 250px; overflow-y: auto; font-family: 'Consolas', monospace; font-size: 13px; margin-top: 10px; } .log-info { color: #4fc3f7; } .log-success { color: #00ff00; font-weight: bold; } button { padding: 10px 20px; background: #3498db; color: white; border: none; cursor: pointer; border-radius: 5px; font-weight: bold; transition: background 0.3s; } button:hover { background: #2980b9; } button:disabled { background: #bdc3c7; } .nav-btn { background: #9b59b6; margin-bottom: 15px; } /* עיצוב שדות קלט - טוקנים רחבים */ input { padding: 10px; margin: 5px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; } .token-input { width: 350px; background: #fdfdfd; } .path-input { width: 150px; } .config-input { width: 60px; background: #fffde7; font-weight: bold; border: 1px solid #fbc02d; text-align: center; } table { width: 100%; border-collapse: collapse; margin-top: 15px; direction: rtl; } th, td { border: 1px solid #ddd; padding: 12px; text-align: right; } th { background: #f8f9fa; } .folder-link { color: #3498db; cursor: pointer; font-weight: bold; text-decoration: underline; } .breadcrumb { margin-bottom: 10px; font-weight: bold; color: #2c3e50; background: #e8f4fd; padding: 10px; border-radius: 5px; border-right: 5px solid #3498db; } .progress-container { background: #e0e0e0; border-radius: 20px; height: 25px; margin: 15px 0; overflow: hidden; display: none; } .progress-bar { width: 0%; height: 100%; background: linear-gradient(90deg, #2ecc71, #27ae60); transition: width 0.3s; color: white; text-align: center; line-height: 25px; font-weight: bold; } </style> </head> <body> <div class="container"> <h2>העברת שלוחות ממערכת למערכת</h2> <div class="section"> <strong>⚙️ הגדרות סריקה:</strong> סרוק שלוחות בעלות <input type="number" id="digitCount" class="config-input" value="2" min="1" max="4"> ספרות. </div> <div class="section"> <strong>1. מערכת המקור</strong><br> <input type="text" id="srcToken" class="token-input" placeholder="הכנס טוקן מקור כאן..."> <input type="text" id="srcPath" class="path-input" placeholder="נתיב מקור" value=> <button onclick="loadFolder(document.getElementById('srcPath').value)">טען קבצים ושלוחות</button> </div> <div class="section"> <strong>2. מערכת היעד</strong><br> <input type="text" id="destToken" class="token-input" placeholder="הכנס טוקן יעד כאן..."> <input type="text" id="destPath" class="path-input" placeholder="נתיב יעד"> <button id="transferBtn" onclick="startTransfer()" disabled style="background:#27ae60;">התחל העברה</button> <div class="progress-container" id="progContainer"> <div id="progBar" class="progress-bar">0%</div> </div> <div id="logArea">מוכן לפעולה...</div> </div> <div id="fileArea" style="display:none;"> <div class="breadcrumb" id="currentDisplayPath">מיקום נוכחי: /</div> <button class="nav-btn" id="backBtn" onclick="goBack()" style="display:none;">⬆️ חזור למעלה</button> <table> <thead> <tr> <th style="width: 40px;"><input type="checkbox" id="masterCheck" checked onclick="toggleAll(this)"></th> <th style="width: 100px;">סוג</th> <th>שם</th> <th style="width: 120px;">גודל</th> </tr> </thead> <tbody id="fileTableBody"></tbody> </table> </div> </div> <script> let currentViewPath = "/"; function addLog(msg, type = '') { const logArea = document.getElementById('logArea'); const div = document.createElement('div'); div.className = `log-${type}`; div.innerHTML = `[${new Date().toLocaleTimeString()}] ${msg}`; logArea.appendChild(div); logArea.scrollTop = logArea.scrollHeight; } function formatSize(bytes) { if (!bytes || bytes == 0) return "-"; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; } function getFileType(name, type) { if (type === "DIR" || !isNaN(name)) return "שלוחה"; return name.includes('.') ? name.split('.').pop().toLowerCase() : "קובץ"; } function cleanPath(path) { let p = path.replace(/\/+/g, '/'); if (!p.startsWith('/')) p = '/' + p; if (p.endsWith('/') && p.length > 1) p = p.slice(0, -1); return p; } async function loadFolder(path) { const token = document.getElementById('srcToken').value; const digits = parseInt(document.getElementById('digitCount').value) || 2; const maxRange = Math.pow(10, digits) - 1; if (!token) return; currentViewPath = cleanPath(path); document.getElementById('currentDisplayPath').innerText = `מיקום נוכחי: ${currentViewPath}`; document.getElementById('backBtn').style.display = currentViewPath === "/" ? "none" : "inline-block"; const tbody = document.getElementById('fileTableBody'); tbody.innerHTML = '<tr><td colspan="4">סורק...</td></tr>'; try { const res = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${token}&path=${currentViewPath}`); const data = await res.json(); let filesMap = new Map(); if (data.files) data.files.forEach(f => filesMap.set(f.name, f)); const iniCheck = await fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${token}&what=ivr2:${currentViewPath}/ext.ini`); if ((await iniCheck.json()).contents !== undefined) { filesMap.set("ext.ini", { name: "ext.ini", fileType: "FILE", isIni: true, size: 0 }); } const scanPromises = []; for (let i = 0; i <= maxRange; i++) { const n = i.toString(); if (filesMap.has(n)) continue; scanPromises.push( fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${token}&what=ivr2:${currentViewPath}/${n}/ext.ini`) .then(r => r.json()) .then(d => { if (d.contents !== undefined) filesMap.set(n, { name: n, fileType: "DIR", size: 0 }); }).catch(() => {}) ); } await Promise.all(scanPromises); let files = Array.from(filesMap.values()); files.sort((a, b) => { const aIsDir = a.fileType === "DIR" || !isNaN(a.name); const bIsDir = b.fileType === "DIR" || !isNaN(b.name); const aIsIni = a.name === "ext.ini"; const bIsIni = b.name === "ext.ini"; if (aIsDir && !bIsDir) return -1; if (!aIsDir && bIsDir) return 1; if (!aIsDir && !bIsDir) { if (aIsIni && !bIsIni) return -1; if (!aIsIni && bIsIni) return 1; } return a.name.localeCompare(b.name, undefined, {numeric: true}); }); tbody.innerHTML = ''; files.forEach(f => { const isDir = f.fileType === "DIR" || !isNaN(f.name); tbody.insertAdjacentHTML('beforeend', ` <tr> <td><input type="checkbox" class="file-check" data-name="${f.name}" data-type="${f.fileType}" checked></td> <td><strong>${getFileType(f.name, f.fileType)}</strong></td> <td class="${isDir ? 'folder-link' : ''}" onclick="${isDir ? `loadFolder('${currentViewPath}/${f.name}')` : ''}">${f.name}</td> <td>${formatSize(f.size)}</td> </tr>`); }); document.getElementById('fileArea').style.display = 'block'; document.getElementById('transferBtn').disabled = false; addLog(`סריקה הושלמה: נמצאו ${files.length} פריטים.`, "info"); } catch (e) { addLog("שגיאה בטעינה", "error"); } } function goBack() { let parts = currentViewPath.split('/'); parts.pop(); loadFolder(parts.join('/') || "/"); } async function uploadIniAsFile(token, path, fileName, contents) { const blob = new Blob([contents], { type: 'text/plain' }); const fd = new FormData(); fd.append('token', token); fd.append('path', `ivr2:${cleanPath(path)}/${fileName}`); fd.append('qqfile', blob, fileName); await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, { method: 'POST', body: fd }); } async function transferRecursive(srcT, srcP, destT, destP, name, type) { const sPath = cleanPath(`${srcP}/${name}`); const dPath = cleanPath(`${destP}/${name}`); const digits = parseInt(document.getElementById('digitCount').value) || 2; const maxRange = Math.pow(10, digits) - 1; if (type === "DIR" || !isNaN(name)) { addLog(`מעביר שלוחה ${name}...`, "info"); await fetch(`https://www.call2all.co.il/ym/api/Ym_MakeDir?token=${destT}&path=ivr2:${dPath}`); const ini = await fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${srcT}&what=ivr2:${sPath}/ext.ini`); const iniD = await ini.json(); if (iniD.contents !== undefined) await uploadIniAsFile(destT, dPath, "ext.ini", iniD.contents); const res = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${srcT}&path=${sPath}`); const data = await res.json(); let children = data.files || []; const subScanPromises = []; for(let i=0; i<=maxRange; i++) { const n = i.toString(); if(!children.find(c => c.name === n)) { subScanPromises.push( fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${srcT}&what=ivr2:${sPath}/${n}/ext.ini`) .then(r => r.json()) .then(d => { if(d.contents !== undefined) children.push({name: n, fileType: "DIR"}); }).catch(() => {}) ); } } await Promise.all(subScanPromises); for (const f of children) { if (f.name === "ext.ini") continue; await transferRecursive(srcT, sPath, destT, dPath, f.name, f.fileType); } addLog(`השלוחה ${name} הועברה`, "success"); } else { const dl = await fetch(`https://www.call2all.co.il/ym/api/DownloadFile?token=${srcT}&path=ivr2:${sPath}`); const blob = await dl.blob(); const fd = new FormData(); fd.append('token', destT); fd.append('path', `ivr2:${cleanPath(destP)}/${name}`); fd.append('qqfile', blob, name); await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, { method: 'POST', body: fd }); } } async function startTransfer() { const srcT = document.getElementById('srcToken').value; const destT = document.getElementById('destToken').value; const destP = cleanPath(document.getElementById('destPath').value || "/"); const selected = Array.from(document.querySelectorAll('.file-check:checked')); document.getElementById('transferBtn').disabled = true; document.getElementById('progContainer').style.display = 'block'; const rootIni = await fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${srcT}&what=ivr2:${currentViewPath}/ext.ini`); const rootData = await rootIni.json(); if (rootData.contents !== undefined) await uploadIniAsFile(destT, destP, "ext.ini", rootData.contents); for (let i = 0; i < selected.length; i++) { const name = selected[i].getAttribute('data-name'); const type = selected[i].getAttribute('data-type'); if (name === "ext.ini") continue; await transferRecursive(srcT, currentViewPath, destT, destP, name, type); let p = Math.round(((i + 1) / selected.length) * 100); document.getElementById('progBar').style.width = p + '%'; document.getElementById('progBar').innerText = p + '%'; } addLog("✅ סיום העברה!", "success"); document.getElementById('transferBtn').disabled = false; } function toggleAll(source) { document.querySelectorAll('.file-check').forEach(cb => cb.checked = source.checked); } </script> </body> </html> -
RE: האם יש אפשרות לשייך קו לתוכן אימייל?
@מי-יודע-0
אפשר עם סקריפט.
אבל יש לך פה כל מיני דברים כאלה בפורום.
תחפש מייל בטלפון -
RE: האם יש אפשרות לשייך קו לתוכן של אתר?
@מי-יודע-0
צריך לזה שרת.
וזה תלוי בסוג האתר. -
RE: שלוחת הרשמה לצינתוקים עם/ בלי הזמנה ע"י המנהל
@שיבקשו-שלשתם
לא קשור, היום הכל אותו הדבר.
רק לפי התיאור שלך אני מבין שאתה מדבר על כזו מערכת לכאורה.
לגופו של עניין, צדקתי במה שאתה מחפש?! -
RE: שלוחת הרשמה לצינתוקים עם/ בלי הזמנה ע"י המנהל
@שיבקשו-שלשתם
אתה בוטאצפון!
אני לא ממש יודע מה ההגדרות שם, אבל אני מבין שאתה רוצה שכשהמנהל יכנס לניהול המנהלים והחברים הוא ישמע לניהול המנהלים הקש 1 לניהול חברים 2, ואלי עוד ניהולים?