• שדרוג אתר הניהול - חוו"ד המשתמשים

    נעוץ נעול
    1
    36 הצבעות
    1 פוסטים
    2k צפיות
    אין תגובות
  • תקנון קטגוריית עזרה הדדית

    נעוץ נעול הועבר
    1
    16 הצבעות
    1 פוסטים
    2k צפיות
    אין תגובות
  • 0 הצבעות
    6 פוסטים
    13 צפיות
    א
    @ממוצע לא. עדיף שתשיאר אותם כך ותשלח לשירות לקוחות בשבעל שנוכל לעלות על הבעיה מהשורש, זה ממש לא תקין.
  • תגובות | מודל הגדרת שלוחות דרך הטלפון !!!

    46
    2 הצבעות
    46 פוסטים
    768 צפיות
    א
    @הדיבל-המעופף תודה רבה ואין מילים (איני יכול לתייג הודעות עדיין...) נ.ב. האתר של פתרון ai אחד הדברים המוצלחים
  • הקלטות במודול תור

    25
    0 הצבעות
    25 פוסטים
    203 צפיות
    א
    @שנאור תכנס לגוגל דרייב תעשה "חדש" [image: 1792435825601-f1887310-3865-4912-9f4e-5d527ca8ecdd-image.jpeg] תבחר "עוד" - "גוגל סקריפט" [image: 1792435944196-%D7%A6%D7%99%D7%9C%D7%95%D7%9D-%D7%9E%D7%A1%D7%9A-2026-10-19-215037.png] תבחר יצירת סקריפט, ואז תדביק שם את הקוד הבא **שים לב שיש מקום להכניס את מספר המערכת, את הסיסמה, ואת הנתיב של השלוחה שבה ההקלטות היום, ונתיב שאליו אתה רוצה שזה יעבור, אתה יכול לשים שם מזהה של תקייה בדרייב אם אתה רוצה שזה ישמר גם שם /** * העתקת קבצים מתיקייה בימות המשיח – לתיקייה בימות ו/או לתיקייה בגוגל דרייב * כל קובץ מורד מהמקור (DownloadFile) ומועלה מחדש ליעד (UploadFile) – * ללא שימוש בהעתקה הפנימית של ימות. * ------------------------------------------------------------------------ * הוראות: * 1. ב-script.google.com צור פרויקט חדש והדבק את כל הקוד. * 2. מלא את ההגדרות ב-CONFIG למטה. * 3. הרץ פעם אחת ידנית את הפונקציה copyFiles (כדי לאשר הרשאות ולבדוק). * 4. לתזמון: הרץ פעם אחת את createTrigger (או דרך "טריגרים" בתפריט השמאלי). */ const CONFIG = { // פרטי התחברות למערכת USERNAME: '07XXXXXXXX', PASSWORD: 'XXXXXX', // תיקיית המקור בימות (לדוגמה: '/1/2') SOURCE_PATH: '/1', // מצב: 'yemot' = העתקה לתיקייה בימות | 'drive' = שמירה בדרייב | 'both' = לשניהם MODE: 'both', // יעד בימות (רלוונטי ל-yemot / both). הקבצים יורדו מהמקור ויועלו לכאן מחדש. YEMOT_TARGET_PATH: '/9', // מזהה תיקייה בדרייב (רלוונטי ל-drive / both) // מעתיקים מהכתובת: https://drive.google.com/drive/folders/<המזהה_כאן> DRIVE_FOLDER_ID: 'PUT_DRIVE_FOLDER_ID_HERE', // אילו סיומות להעתיק. מערך ריק [] = כל הקבצים EXTENSIONS: ['wav', 'mp3', 'ogg', 'txt', 'tts'], // כל כמה שעות להריץ (משמש את createTrigger) TRIGGER_EVERY_HOURS: 1 }; const API = 'https://www.call2all.co.il/ym/api/'; const MAX_RUNTIME_MS = 5 * 60 * 1000; // עצירה בטוחה לפני מגבלת 6 הדקות של גוגל const MAX_FILE_BYTES = 50 * 1024 * 1024; // מגבלת UrlFetchApp בגוגל /* ===================== פונקציה ראשית ===================== */ function copyFiles() { const start = Date.now(); const mode = String(CONFIG.MODE).toLowerCase(); const toYemot = mode === 'yemot' || mode === 'both'; const toDrive = mode === 'drive' || mode === 'both'; if (!toYemot && !toDrive) throw new Error('MODE חייב להיות yemot / drive / both'); const token = login_(); try { const sourceDir = normalizePath_(CONFIG.SOURCE_PATH); const files = listFiles_(token, sourceDir); Logger.log('נמצאו ' + files.length + ' קבצים במקור ' + sourceDir); // רשימת קבצים קיימים ביעד – כדי לדלג עליהם let yemotTarget, yemotExisting, driveFolder, driveExisting; if (toYemot) { yemotTarget = normalizePath_(CONFIG.YEMOT_TARGET_PATH); if (yemotTarget === sourceDir) throw new Error('תיקיית היעד בימות זהה לתיקיית המקור'); yemotExisting = new Set(listFiles_(token, yemotTarget, true).map(f => f.name)); } if (toDrive) { driveFolder = DriveApp.getFolderById(CONFIG.DRIVE_FOLDER_ID); driveExisting = new Set(); const it = driveFolder.getFiles(); while (it.hasNext()) driveExisting.add(it.next().getName()); } let copiedY = 0, copiedD = 0, skipped = 0, errors = 0; for (const f of files) { if (Date.now() - start > MAX_RUNTIME_MS) { Logger.log('הגעתי למגבלת זמן – ההמשך יתבצע בהרצה הבאה.'); break; } const srcFile = joinPath_(sourceDir, f.name); const needYemot = toYemot && !yemotExisting.has(f.name); const needDrive = toDrive && !driveExisting.has(f.name); if (!needYemot && !needDrive) { skipped++; continue; } if (f.size && f.size > MAX_FILE_BYTES) { errors++; Logger.log('דילוג על ' + srcFile + ' – גדול מ-50MB (מגבלת גוגל)'); continue; } // 1. הורדה פעם אחת מהמקור let blob; try { blob = downloadFile_(token, srcFile).setName(f.name); } catch (e) { errors++; Logger.log('שגיאה בהורדת ' + srcFile + ': ' + e.message); continue; } // 2. העלאה מחדש לתיקיית היעד בימות if (needYemot) { try { uploadFile_(token, joinPath_(yemotTarget, f.name), blob); yemotExisting.add(f.name); copiedY++; } catch (e) { errors++; Logger.log('שגיאה בהעלאה לימות ' + f.name + ': ' + e.message); } } // 3. שמירה בדרייב if (needDrive) { try { driveFolder.createFile(blob); driveExisting.add(f.name); copiedD++; } catch (e) { errors++; Logger.log('שגיאה בשמירה לדרייב ' + f.name + ': ' + e.message); } } } Logger.log('סיום: הועתקו לימות ' + copiedY + ', נשמרו בדרייב ' + copiedD + ', דולגו (קיימים) ' + skipped + ', שגיאות ' + errors); } finally { logout_(token); } } /* ===================== תזמון ===================== */ function createTrigger() { // מוחק טריגרים קודמים של הפונקציה כדי לא ליצור כפילויות ScriptApp.getProjectTriggers() .filter(t => t.getHandlerFunction() === 'copyFiles') .forEach(t => ScriptApp.deleteTrigger(t)); ScriptApp.newTrigger('copyFiles') .timeBased() .everyHours(CONFIG.TRIGGER_EVERY_HOURS) .create(); Logger.log('נוצר טריגר: כל ' + CONFIG.TRIGGER_EVERY_HOURS + ' שעות'); } function removeTriggers() { ScriptApp.getProjectTriggers() .filter(t => t.getHandlerFunction() === 'copyFiles') .forEach(t => ScriptApp.deleteTrigger(t)); Logger.log('הטריגרים נמחקו'); } /* ===================== פונקציות API ===================== */ function login_() { const data = apiCall_('Login', { username: CONFIG.USERNAME, password: CONFIG.PASSWORD }); if (!data.token) throw new Error('התחברות נכשלה – לא התקבל טוקן'); return data.token; } function logout_(token) { try { apiCall_('Logout', { token: token }); } catch (e) { /* לא קריטי */ } } /** רשימת קבצים בתיקייה (כמו בקובץ ה-PHP: GetIVR2Dir + סינון לפי סיומת) */ function listFiles_(token, dirPath, allowMissing) { const apiPath = dirPath === '/' ? '/' : dirPath + '/'; let data; try { data = apiCall_('GetIVR2Dir', { token: token, path: apiPath }); } catch (e) { if (allowMissing) return []; throw e; } const raw = Array.isArray(data.files) ? data.files : []; const exts = (CONFIG.EXTENSIONS || []).map(x => String(x).toLowerCase()); return raw.filter(f => { if (!f || !f.name) return false; if (exts.length === 0) return true; const ext = f.name.split('.').pop().toLowerCase(); return exts.indexOf(ext) !== -1 || f.fileType === 'AUDIO'; }); } /** העלאת קובץ לימות (UploadFile – POST multipart/form-data) */ function uploadFile_(token, targetPath, blob) { const resp = UrlFetchApp.fetch(API + 'UploadFile', { method: 'post', payload: { // אובייקט עם Blob => נשלח כ-multipart/form-data token: token, path: 'ivr2:' + targetPath.replace(/^\/+/, ''), convertAudio: '0', // שומר את הקובץ כמו שהוא, בלי המרה file: blob }, muteHttpExceptions: true }); let data; try { data = JSON.parse(resp.getContentText()); } catch (e) { throw new Error('UploadFile: תשובה לא תקינה (HTTP ' + resp.getResponseCode() + ')'); } if (data.responseStatus !== 'OK') { throw new Error('UploadFile: ' + (data.message || data.responseStatus) + (data.messageCode ? ' (קוד ' + data.messageCode + ')' : '')); } return data; } /** הורדת קובץ (DownloadFile) כ-Blob */ function downloadFile_(token, filePath) { const url = API + 'DownloadFile?' + toQuery_({ token: token, path: 'ivr2:' + filePath.replace(/^\/+/, '') }); const resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); if (resp.getResponseCode() === 404) { throw new Error('הקובץ לא נמצא (404)'); } if (resp.getResponseCode() !== 200) { throw new Error('HTTP ' + resp.getResponseCode()); } // אם חזר JSON של שגיאה במקום הקובץ const ct = String(resp.getHeaders()['Content-Type'] || ''); if (ct.indexOf('application/json') !== -1) { throw new Error('שגיאת API: ' + resp.getContentText()); } return resp.getBlob(); } function apiCall_(method, params) { const resp = UrlFetchApp.fetch(API + method + '?' + toQuery_(params), { muteHttpExceptions: true }); let data; try { data = JSON.parse(resp.getContentText()); } catch (e) { throw new Error(method + ': תשובה לא תקינה (HTTP ' + resp.getResponseCode() + ')'); } if (data.responseStatus !== 'OK') { throw new Error(method + ': ' + (data.message || data.responseStatus || 'שגיאה לא ידועה')); } return data; } /* ===================== עזר ===================== */ function toQuery_(obj) { return Object.keys(obj) .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(obj[k])) .join('&'); } function normalizePath_(p) { const t = String(p || '').replace(/^ivr2:/, '').replace(/^\/+|\/+$/g, ''); return '/' + t; } function joinPath_(dir, name) { return (dir === '/' ? '' : dir) + '/' + name; } אח"כ תשמור, ואז תיצור טריגר [image: 1792436151054-357ef5c0-3427-4637-af4e-29113c74dded-image.jpeg] יש שם אפשרות לבחור כל כמה זמן זה יופעל, זה יבקש ממך אישור לבצע דברים תאשר, ואז כל פעם שזה יופעל זה יעתיק את השלוחות
  • קבלת נתונים בסיסית בAPI עם תמלול חינם - גירסת בטא

    18
    5 הצבעות
    18 פוסטים
    423 צפיות
    ה
    @אבו @אבו כתב: איזה מודל שלו מוגבל הכול מוגבל @אבו כתב: (ומה נקרא אצלך 'די' מוגבל? 20 קריאות ליום נראלי, ובחינמי זה לפעמים יכול לא להגיב עקב עומסים
  • השמעת הודעת קמפיין בתפריט

    3
    0 הצבעות
    3 פוסטים
    22 צפיות
    א
    @שלוחה-404 לא. בבדיקה.
  • אתר "קולות" – יצירת קרינות ותמלול AI בקלות

    114
    11 הצבעות
    114 פוסטים
    3k צפיות
    מ
    @המתכנת-הראשי נתיב אמרו שהם לא יכולים לפתוח את אז כיון שזה מכיל תכנים שלא ראוים לקריאה, או לצפייה למה?
  • תגובה לקבצי HTML לשימוש במערכות ימות המשיח

    65
    2 הצבעות
    65 פוסטים
    3k צפיות
    L
    @אA האם יש לך כח לבנות תוכנה שתשכפל מתוך המערכת קבצים שלוקח בדיוק שניה וחצי לשכפל ולרכז הכל לשלוחה מסויימת אחת כי התוכנות האחרות מוציאות מהמערכת ומחזירות חזרה ועד שההעלאה מסתיימת זה לוקח שנים = מה שאני שואל אם אפשר לעשות כמו שכשלוחצים על מקש ימיני בעכבר על קובץ מסויים ומשכפלים לשלוחה מסויימת במערכת זה משכפל תוך שניה אז כנל כאן לעשות שכל מה שתחת שלוחה /X החל משלוחה X ועד שלוחה X מועתק ומשוכפל לשלוחה /X/000 לצורך העניין Spoiler נ.ב. אין לי בינה מלאכותית אז לכן אני פונה אליך בתור מומחה אם תוכל לעשות חינם אין כסף חסד תודה רבה רבה על כל מה שאתה עושה תמיד (גם אם לא תוכל לעשות את הנ"ל ההודאה על מה שתמיד עזרת ואתה עוזר לכולם שכווייח )
  • לידיעת הציבור!!! (ידע הציבור ויתקן)

    5
    4 הצבעות
    5 פוסטים
    58 צפיות
    L
    @אז-נדברו כנראה היה כי לא לקחתי את ההגדרות ממקום אחר בטוח!!! וגם מי זה המודל AI הטיפש שנתן את ההגדרה כך?! למה טיפש כל עוד זה עבד זה מצויין מעכשיו זה בעיה לא כך?
  • בקשות לפיתוח על ידי המשתמשים

    82
    1
    3 הצבעות
    82 פוסטים
    2k צפיות
    פ
    @הדיבל-המעופף סליחה שאני נכנס לך לפוסט אבל פיתחתי אצלי גם כן רעיון של בקשות לפיתוח והצבעות על פיתוחים שאתם רוצים https://ivr.pitronai.com/#/whats-new/ideas
  • מעבר ישיר לשלוחה ממנה נשלח צינתוק

    3
    0 הצבעות
    3 פוסטים
    42 צפיות
    ה
    @מזל-טוב-0 @שלוחה-404 זכור לי שיש ל@121244 (עזר פון) כזה דבר.
  • חזרה להאזנה האחרונה בכל שלוחה בקו

    22
    0 הצבעות
    22 פוסטים
    337 צפיות
    ה
    @אש-קודש-0 תעשה מה שבא לך. עצם זה שיש שלוחה מוגדרת מראש/הקשת שלוחה/כל המערכת לא מפריע לשום שלוחה אחרת
  • מרכזייה עיסקית

    10
    0 הצבעות
    10 פוסטים
    206 צפיות
    ש
    @yona אפשר ליצור איתך קשר באישי
  • 9 הצבעות
    6 פוסטים
    206 צפיות
    ל
    yechidot-video-he-subs.mp4
  • 🚗פיתוח קו למורי נהיגה לעדכון זמני שיעורים...📖

    לא נפתר
    25
    0 הצבעות
    25 פוסטים
    379 צפיות
    מ
    @מסובך-מאוד חמוד, אבל זה צריך להיות מוקלט ע"י המספר שלו...
  • הקווים נוראייים הכל קטועע בפרט ב 1700

    4
    1 הצבעות
    4 פוסטים
    77 צפיות
    R
    @פישל מצטרף זה בעיה רוחבית בהמון קווים
  • תגובות | הקלטת הודעות עם תמלול לטקסט - בחינם דרוש מפתח API

    13
    0 הצבעות
    13 פוסטים
    261 צפיות
    ד
    @הדיבל-המעופף x0773015710@gmail.com
  • מה זה בדיוק ריסלר ואיך זה עובד?

    1
    0 הצבעות
    1 פוסטים
    35 צפיות
    אין תגובות
  • הפסקת הקלטה

    13
    1 הצבעות
    13 פוסטים
    155 צפיות
    ז
    אצלי הסתדר לבד