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

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

    נעוץ נעול הועבר
    1
    16 הצבעות
    1 פוסטים
    2k צפיות
    אין תגובות
  • באג בAPI להגדרת הגדרות?

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

    2
    0 הצבעות
    2 פוסטים
    11 צפיות
    א
    @ישק תגדיר שאלה ראשונה הקשת ת.ז. ושאלה שניה הקשת ספרות ללא אפשרות לחזור על אותם ספרות וכדי שיתעדכן בשיטס תגדיר שילח הכל בסיום לAPI חיצוני ובלינק תכניס את כתובת השיטס
  • תגובה לקבצי HTML לשימוש במערכות ימות המשיח

    66
    2 הצבעות
    66 פוסטים
    3k צפיות
    א
    @lavitoren-הטי-ל אפשרי בהחלט ע"י פקודת העתקה. מקווה לשבת ע"ז בקרוב.
  • אתר "קולות" – יצירת קרינות ותמלול AI בקלות

    117
    11 הצבעות
    117 פוסטים
    3k צפיות
    ה
    @שיבקשו-שלשתם כרגע אין. המערכת פועלת על גבי מנועי הקריינות המתקדמים של Google Gemini TTS, המספקים איכות פונטית גבוהה ביותר בעברית, שליטה באינטונציה וקריאה לפי ניקוד, אבל המנועים של גוגל לא מאפשרים שיבוט מטעמי אבטחה ופרטיות וכו'. שיבוט קולי אמיתי (כמו ב-ElevenLabs) דורש שירותים ייעודיים נפרדים, הרשאות מיוחדות ואימון מודל על גבי קבצי שמע, אולי בהמשך מתי שיהיה לי כוח אני ינסה לעשות.
  • קבלת נתונים בסיסית בAPI עם תמלול חינם - גירסת בטא

    21
    5 הצבעות
    21 פוסטים
    508 צפיות
    ה
    @הדיבל-המעופף כתב: @1668 גרסת בטא - מודל קבלת נתונים הקוד בשלוחה type=api api_link=https://111.a775529301.workers.dev/ api_url_post=yes api_add_0=YemotToken=טוקן מערכת api_add_1=GeminiKey=מפתח גמיני לתמלול עם Groq (יותר מהיר ויותר מכסה) החליפו בזה api_add_1=GroqKey=מפתח Groq ממשק הכנסת השאלות והצפייה בנתונים למחוק "מיותר" מהסיומת כתבו כאן על באגים, שיפורים נצרכים, ועוד זה מודל API, איך אפשר במודל קבלת נתונים, והאם אפשרי שתוך כדי שהלקוח במערכת הוא ישמע את התמלול ויאשר והמערכת תמשיך לעוד כמה שאלות, וישלח את הכל כולל התמלול לשרת?
  • שרת ymx

    לא נפתר
    21
    0 הצבעות
    21 פוסטים
    129 צפיות
    מ
    @אז-נדברו . תודה
  • תגובות | מודל הגדרת שלוחות דרך הטלפון !!!

    55
    2 הצבעות
    55 פוסטים
    1k צפיות
    א
    שילוב מנצח אשמח לשתף פעולה...
  • נושא זה נמחק!

    2
    1 הצבעות
    2 פוסטים
    19 צפיות
  • באגים במערכת

    לא נפתר
    8
    2
    0 הצבעות
    8 פוסטים
    229 צפיות
    L
    @אז-נדברו כל פעם שכחתי מחדש ובחודשים האחרונים פחות נזקקתי לזה בתקופה האחרונה יותר נזדקקתי ויישר כח על המענה המהיר בשעות כאלו בכל אופן מה לגבי המדור שנסגר
  • איך פותחים את הקו לקבלת צינטוקים

    5
    0 הצבעות
    5 פוסטים
    26 צפיות
    י
    https://www.call2all.co.il/ym/index.php?view=customer_settings
  • לאחרונה הקו מתנתק באמצע

    לא נפתר
    9
    0 הצבעות
    9 פוסטים
    27 צפיות
    א
    @שלומל-ה אם זה קורה לו בכל שיחה בבקשה שישלח פרטי שיחה לשירות לקוחות במייל.
  • מעבר לשלוחה בהקשת מקש בהודעת קמפיין

    3
    0 הצבעות
    3 פוסטים
    34 צפיות
    י
    @שלוחה-404 יש בהגדרות הקמפיין באתר הניהול החדש אפשרות שכאשר שלחתי הודעת קמפיין בהקשת 1 במקום מעבר למערכת אחרת מעבר לשלוחה בתוך המערכת משום מה זה לא באמת עובד
  • בקשות לפיתוח על ידי המשתמשים

    83
    1
    3 הצבעות
    83 פוסטים
    3k צפיות
    ש
    היה כדאי מאוד שיפתחו ומוזר שלא עשו עד היום דברים כה קריטיים ושימושיים לכולם: שלוחת סל המחזור לפי טלפון - מי שהתנתק לו השיחה באמצע הקלטה נשמר שם לפי הטלפון שלו. מקש להמשך והוספת הקלטה גם באמצע הקלטה (לפעמים אדם שכח וצריך להקליט הכל מחדש) נקודת ציון התחלה וציון סוף באמצע השמעה וגם בהקלטה לשינוי ומחיקה. סימניות (- שמופיע במערכות אחרות) מקש לשינוי נקודתי לסדר ההשמעות מהישן לחדש. (אם יש הרבה הודעות להיום ולאחר חזרה למיקום אחרון רוצה לשמוע לפי הסדר) הקלטה לפי ימים כל יום לשלוחה אחרה - ואיפוס השלוחה לאחר שבוע כי נכנסות הודעות מהשבוע החדש.
  • מרכזייה עיסקית

    11
    0 הצבעות
    11 פוסטים
    239 צפיות
    מ
    @שלוחה-404 לי יש משהו פרטי kav023137471@gmail.com
  • 0 הצבעות
    12 פוסטים
    57 צפיות
    א
    @סתם-שמרל נכון. אני חושב שיש שינויים בתפריט שאחרי הקלטת הודעה לקבוצה.
  • הקלטות במודול תור

    25
    0 הצבעות
    25 פוסטים
    211 צפיות
    א
    @שנאור תכנס לגוגל דרייב תעשה "חדש" [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] יש שם אפשרות לבחור כל כמה זמן זה יופעל, זה יבקש ממך אישור לבצע דברים תאשר, ואז כל פעם שזה יופעל זה יעתיק את השלוחות
  • השמעת הודעת קמפיין בתפריט

    3
    0 הצבעות
    3 פוסטים
    32 צפיות
    א
    @שלוחה-404 לא. בבדיקה.
  • לידיעת הציבור!!! (ידע הציבור ויתקן)

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