• הרשמה
    • התחברות
    • חיפוש
    • דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • קבלת התראות מהדפדפן
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    1. דף הבית
    2. הלוי הלוי
    ה
    • פרופיל
    • עוקב אחרי 0
    • עוקבים 1
    • נושאים 14
    • פוסטים 54
    • הגבוה ביותר 15
    • שנוי במחלוקת 0
    • קבוצות 0

    הלוי הלוי

    @הלוי הלוי

    26
    מוניטין
    30
    צפיות בפרופיל
    54
    פוסטים
    1
    עוקבים
    0
    עוקב אחרי
    הצטרף ב- התחבר לאחרונה

    הלוי הלוי הפסק לעקוב עקוב

    הפוסטים הטובים ביותר שנוצרו על ידי הלוי הלוי

    • RE: איך אוכל לקבל ב-API קובץ שמע בלי להוריד אותו?

      @שמחה-זו-הסיסמא
      למעשה הצלחתי עד כה להשתמש עם גוגל סקריפט כמעט כשרת רגיל,
      על רוב התקלות הצלחתי להתגבר..
      למשל את הבעיה של החסימה של ימות על גוגל סקריפט
      פתרתי כך:

      var token = PropertiesService.getScriptProperties().getProperty('token');
      
      function getSession() {
        if (!token || JSON.parse(UrlFetchApp.fetch(`https://www.call2all.co.il/ym/api/GetSession?token=${token}`).getContentText()).responseStatus !== `OK`) {
          PropertiesService.getScriptProperties().setProperty(`token`,'');
      	  while (!PropertiesService.getScriptProperties().getProperty('token')) {
            var login = JSON.parse(UrlFetchApp.fetch(`https://www.call2all.co.il/ym/api/Login?username=XXXX&password=XXXXX`).getContentText()).token;
            if (login) {
              PropertiesService.getScriptProperties().setProperty(`token`, login);
            }
          }
        }
      }
      

      מה שקורה כאן בעצם זה משתנה קבוע שמכיל את הטוקן,
      פעם בחצי שעה מופעל טריגר לפונקציה getSession,
      מכיוון שטוקן תקף למשך שעה מאז שנוצר או מאז שהשתמשו בו,
      אני פשוט משתמש בו פעם בחצי שעה (סתם - קבלת פרטי המערכת, לא עושה עם זה כלום...)
      אם התשובה היא לא OK או שלא קיים טוקן מאיזו סיבה, הוא מנסה שוב ושוב להתחבר מחדש וליצור טוקן...
      וממילא בכל הסקריפט הנוכחי יש לי כל הזמן משתנה בשם token שאני משתמש בו לכל מטרה...

      עוד בעיה של "אין מענה משרת API" שנכתב כאן
      אני פשוט מחליף את ההודעה הנ"ל בקובץ שקט,
      עושה הפנייה לשלוחה אחרת בכל מקום שאני משתמש ב-API מהמערכת,
      ה-API משנה בשלוחה ההיא כל פעם את ה-M0000 כך:

      UrlFetchApp.fetch(`https://www.call2all.co.il/ym/api/UploadTextFile?token=${token}&what=ivr2:/222/M0000.tts&contents=${contents}`);
      

      בקיצור.... יש פתרונות להכל..

      פורסם בפורום מפתחים API
      ה
      הלוי הלוי
    • RE: שיחה יוצאת מתוזמנת עם הקשות DTMF

      @שמואל-ש
      הפקודה היא:

      CallExtensionBridging
      

      מופיע כאן

      פורסם בבקשות לפיתוח
      ה
      הלוי הלוי
    • RE: במודול זמני תחבורה ציבורית

      הנושא ישן מאד,
      אך יש כמה דברים שמאד חסרים בקל-קו,

      שמיעת רשימת אוטובוסים ספציפיים,
      למשל כאשר אני נמצא בתחנה "צומת רמות"
      אני צריך להגיע לרחוב יחזקאל,
      לא מעניין אותי כרגע מתי יגיע קו 62 לכיוון תחנה מרכזית,
      וכל שכן שלא מעניין אותי לדעת מתי יגיע האוטובוס שמוריד נוסעים מקרית ספר.
      לדעתי צריך אפשרות לכתוב רשימת קווים (עם * בין קו לקו או # ובסוף להקיש פעמיים סולמית...)
      ואז אוכל לבדוק רק בין 71,72,36,56 וכו'

      וכן על זו הדרך,
      בחירה האם להשמיע רק את האוטובוסים שמעלים \ מורידים \ עירוניים \ בין-עירוניים וכדו'

      ועוד משהו,
      השמעה יותר מהירה
      אנשים שנמצאים בתחנה ורואים אוטובוס שהוא טוב להם בעדיפות שלישית (מגיע כמה רחובות ליד, עושה סיבובים וכו'..),
      אם ידעו שבדקות הקרובות יגיע להם קו מסויים אחר, יחכו עוד ולא יעלו,
      אין להם זמן עכשיו לשמוע : "תחנה, ???, קו, ???, יגיע בעוד, ??? דקות".
      אפשר לקצר את התהליך קצת על דרך "באיזו ללוד"..
      "קו ? בעוד ?".
      או אם המנגינה תהיה ברורה אפשר אפילו על זה לוותר,
      ויקריא "36, 3 דקות, 200, 5 דקות" וכו'.

      פורסם בבקשות לפיתוח
      ה
      הלוי הלוי
    • RE: שיחה יוצאת מתוזמנת עם הקשות DTMF

      @ivrפון כתב בשיחה יוצאת מתוזמנת עם הקשות DTMF:

      מה אכפת לך לעשות העתק הדבק?

      1. אני לא יושב כל היום ובודק אם החזירו לי תגובה.
      2. חשבתי, ועדיין אני חושב שהרבה יותר ברור לקרוא שם בצורה מסודרת.
      3. אענה לך באותה מטבע...

      מה אכפת לך רק ללחוץ על הקישור?

      תהיה בריא!

      פורסם בבקשות לפיתוח
      ה
      הלוי הלוי
    • איך אוכל לקבל ב-API קובץ שמע בלי להוריד אותו?

      יש לי צורך לבצע פעולות על קבצי שמע במערכת שלי (תמלול וכדו'),
      אני רוצה לגשת לקובץ כשהוא עדיין בענן,
      האם יש הגדרה "GetAudioFile" (או יותר נכון "GetAudioBlob") בדומה להגדרה "GetTextFile" של קבצי טקסט?
      אין לי מה להאריך בהסבר, מי שלא הבין מה שאלתי, כנראה שאין לו תשובה...
      תודה מראש!!

      פורסם בפורום מפתחים API
      ה
      הלוי הלוי
    • RE: במודול זמני תחבורה ציבורית

      @צבי-ד-צ דווקא נראה שזה קצת כן קשור לפורום,
      @noam כתב במודול זמני תחבורה ציבורית:

      אנו מבקשים ממשתמשי הפורום העושים שימוש בתחבורה ציבורית לכתוב מהם הדברים החשובים להם.

      רק שאין שם אפשרויות לתגובה,
      גם לא קישור לשרשור ששם ניתן להגיב.

      פורסם בבקשות לפיתוח
      ה
      הלוי הלוי
    • המתנה ארוכה בחסימת האזנה לקבצים שהמשתמש האזין להם בעבר

      אני משתמש במערכת שלי בשלוחת השמעת קבצים, באפשרות של חסימת האזנה לקובץ שכבר האזין.
      הבעיה היא שהבדיקה על כל קובץ אם שמעו אותו כבר לוקחת הרבה זמן,
      כאשר יש בשלוחה 5 קבצים זה עוד נסבל,
      אבל אם יש לי בשלוחה 20 קבצים או אפילו 100 וזה עולה מפעם לפעם..
      אני שומע את ההודעה החדשה, ואז ממתין המון זמן עד שהוא חוזר לתפריט,
      אני לא רוצה לעבור לתפריט באופן ידני כי עד שלא אשמע את ההודעה במלואה היא לא תירשם בלוג,
      ואני לא יכול לדעת אם זה השקט של בדיקת כל הקבצים או שמישהו הקליט הודעה ושכח לנתק...

      האם יש פתרון לבעיה הזו?
      האם מישהו שם לב לעניין הזה?

      פורסם בבאגים במערכת
      ה
      הלוי הלוי
    • RE: הקצאת מקש למעבר לשלוחה אחרת בשלוחת תפריט

      @משה-הישראלי
      רק בשביל הניסוי עשיתי בשלוחה 1/1
      כתבתי כך בקובץ ext.ini

      type=menu
      title=אבא
      control_play1=go_to_folder
      playfile_control_play_1_goto=/3/04/01
       
      control_play2=go_to_folder
      playfile_control_play_2_goto=/3/04/02
      

      לא עובד!
      (החלפתי את 3/4/1 לנתיב שמתאים אצלי)

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי
    • RE: שיחה יוצאת מתוזמנת עם הקשות DTMF

      @613-0
      אין לי מושג באמת למה הוא מורחק וזה לא נוגע אליי, ראיתי הרבה אנשים שעשו דברים שגרמו לאנשים סביבם 'להרחיק' אותם ובשיחה בארבע עיניים התברר שהם פשוט לא הובנו נכון, זה לא שאני לא סומך על מנהלי הפורום, פשוט כל עוד אני לא ניזקתי ממישהו, אני משתדל להתייחס אליו כמו אל כל אדם אחר שאיני מכירו מטוב ועד [צריך להיות] מוטב.. שזה - כבדהו וחשדהו.

      כאשר מישהו שואל אותי כזו שאלה אני יכול להתייחס לזה:
      או -
      לבדוק מיד את הסטטוס שלו, לעבור על הפוסטים שהוא כתב בעבר, לנסות לסדר את כל הטעויות שלו, להדגיש ולוודא שכולם ראו את החותמת האדומה שיש על השם שלו, ועוד ועוד..
      או -
      פשוט לשאול אותו מה הוא התכוון ולהבין באמת מה הוא רצה.

      אם אתה שואל אותי, אם נחלק את מספר האופציות הקיימות כתשובה לשאלה למה הוא כתב שאלה כמו 'מה מספר הקו',
      תמצא הרבה יותר אפשרויות לדון לכף זכות או אפילו לכף שטות..
      מאשר האפשרויות שהוא איש רע וחפרן ומזיק וכו' וכדו',
      יכול להיות שרוב הקווים שהוא מכיר הם קווים שפתוחים לציבור,
      יכול להיות שהוא מאד רוצה לעזור, אך לא מבין מספיק את השאלה ולכן הוא רוצה להבין איך הקו עובד ורק אז לחשוב על פתרון מחוץ לקופסה,
      יכול להיות שיש לו את אותה שאלה ומעניין אותו איך פתרתי בסוף,
      יכול להיות אפילו שיש לו אוסף של קווים שהוא מקשיב להם בשעות הפנאי..
      יכול להיות גם שהוא 'מושתל' של ימות המשיח לבדוק מי משתמש בקווים באופן לא ראוי ולכן הוא אפילו מוגדר כ'מורחק' כדי שלא יחשדו...

      סליחה על האריכות וההתקפה, אבל אתה התחלת....
      אני לא מכיר אותו משום צומת ואין לי שום עניין להיות הפרקליט שלו,
      אני רק מעדיף להסתובב בעולם עם תחושה שכל האנשים סביבי מקיפים ועוטפים ומחבקים אותי מכל כיוון,
      ולא לפחד ולהסתכל כל הזמן לכל הצדדים ולבדוק איזה איש שחור ורע מגיע היום לטרוף אותי..
      מנסיון - זו תחושה נפלאה!!

      פורסם בבקשות לפיתוח
      ה
      הלוי הלוי
    • ייבוא אקסל לצינתוקים לפי תאריך ושעה למספרים שונים

      שלום וברכה.
      אני מלמד בחיידר, ויש אצלנו (כמו בכל מקום) תורני חצר להפסקות.
      אני מחפש פיתרון לתזכורות למלמדים ביום שהם תורני חצר.
      הפיתרון הפשוט צריך להיות שכל מלמד עושה לעצמו שעון מעורר בטלפון שלו עם חזרה שבועית וכדו',
      הבעיה היא שאין זמן קבוע לכל מלמד,
      כל מלמד תורן ביום שלם למשך כל ההפסקות,
      מכיוון שיש 8 מלמדים ו-6 ימים בשבוע,
      מי שהיה תורן ביום א' חיי-שרה, יהיה תורן ביום ג' תולדות וכו'
      הפיתרון שאני צריך הוא קו שייקרא אצל כל אחד באנשי קשר "תורן חצר",
      ויצנתק לכל מלמד יום קודם בערב (שלא יבנה על ההפסקות של מחר...) וכן דקה לפני כל הפסקה.
      פעם בתקופה אעלה קובץ אקסל עם עמודה לתאריך, עמודה לשעה ועמודה לשם \ מספר.
      יש דבר כזה?
      איך מבצעים אותו?
      תודה מראש (וסליחה על האריכות...)

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי

    פוסטים אחרונים שנוצרו על ידי הלוי הלוי

    • RE: השמעה יומית לפי תאריך עברי, זיהוי אדר ב'

      @yankl
      הנושא ישן,
      הוא גם לא רלוונטי לא לשנה הנוכחית ולא לשנה הבאה שהן שנים פשוטות,
      בכל אופן עברתי עכשיו קצת ומצאתי - אולי יועיל בהמשך אם לא יפתרו את זה בדרך המלך.

      יש פתרון פשוט יחסית, רק להוסיף כמה שורות עבור הקבצים הספציפיים של תחילת אד"א ותחילת ניסן.

      מה שצריך זה רק להגדיר מעבר לשלוחה ייעודית בהקשה על 8 בקובץ המדובר,
      וכן מעבר בסיום הקובץ המסויים לשלוחה הייעודית,
      בשלוחה ההיא להגדיר השמעת קבצים מהתיקייה הנוכחית ולהתחיל מהקובץ הרצוי.

      נניח שאתה נמצא בשלוחה 7 בתפריט הראשי,
      כך צריכה להיראות השלוחה שלך:

      type=playfile
      title=הלימוד היומי
      ;הפעלה לפי תאריך עברי
      folder_play=heb_date
      
      ;שנת תשפ"ז תהיה מעוברת
      ;נצטרך להצמיד את ל' שבט לא' אד"א ואת כ"ט אד"ב לא' ניסן
      
      ;מעבר לל' שבט בהקשת 8 בשיעור א' אד"א
      playfile_57871301_control_play_8=go_to_folder
      playfile_57871301_control_play_8_goto=/meuberet/7_57870530
      ;מעבר לא' אד"א בהקשת 2 בשיעור ל' שבט
      playfile_57870530_control_play_8=go_to_folder
      playfile_57870530_control_play_8_goto=/meuberet/7_57871301
      ;מעבר לל' שבט בסיום שיעור א' אד"א ללא הקשה
      after_play_57871301_go_to_folder=/meuberet/7_57870530
      ;מעבר לכ"ט אד"ב בהקשת 8 בשיעור א' ניסן
      playfile_57870701_control_play_8=go_to_folder
      playfile_57870701_control_play_8_goto=/meuberet/7_57871429
      ;מעבר לא' ניסן בהקשת 2 בשיעור כ"ט אד"ב
      playfile_57871429_control_play_8=go_to_folder
      playfile_57871429_control_play_8_goto=/meuberet/7_57870701
      ;מעבר לכ"ט אד"ב בסיום שיעור א' ניסן ללא הקשה
      after_play_57870701_go_to_folder=/meuberet/7_57871429
      

      ניצור שלוחה חדשה בשם meuberet (מעוברת) - או כל שם אחר שימצא חן בעיניך..
      בתוכה ניצור שלוחה עבור כל הפנייה,
      אני קראתי לשלוחות בשם "שלוחה_קובץ לניתוב פנימי" למען הסדר הטוב, תעשה ככך העולה בדמיונך..

      כך ייראו השלוחות בתיקייה "meuberet":

      ניתוב ל-ל' בשבט התשפ"ז

      type=playfile
      title=ל שבט תשפז
      ;השלוחה ממנה יושמעו הקבצים
      folder_to_play=/7
      ;הקובץ אותו יש להשמיע ראשון
      start_play=57870530
      

      ניתוב ל-א' באדר א' התשפ"ז

      type=playfile
      title=א אדר א תשפז
      folder_to_play=/7
      start_play=57871301
      

      ניתוב ל-כ"ט באדר ב' התשפ"ז

      type=playfile
      title=כט אדר ב תשפז
      folder_to_play=/7
      start_play=57871429
      

      ניתוב ל-א' בניסן התשפ"ז

      type=playfile
      title=א ניסן תשפז
      folder_to_play=/7
      start_play=57870701
      

      בהצלחה!!!

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי
    • RE: שליחת API רק בניתוק

      @דוד_מלך_ישראל
      אני משתמש בגוגל סקריפט...
      כך שממילא אני לא יכול להחזיר תגובה אלא משתיק את "אין מענה.." והתגובה תמיד מופיעה בתת שלוחה.
      (מוגדר api_end_goto=1 וכל פעם אני שולח טקסט אחר לפי העניין ל-M0000 של התת שלוחה 1)

      עריכה: עיינתי יותר במה ששלחת, אני רואה שאם לא מתקבלת תגובה, בעצם לא קורה כלום, אני צודק?
      בכל אופן פחות מעניין אותי התגובה שיקבל המשתמש, אני צריך לקבל נתונים רק לאחר שהמשתמש סיים את השיחה (את ההקלטה שנשמרת בניתוק, אין לי דרך לדעת איזה אורך היא תהיה, גם לעשות שלוחת API לאחר ההקלטה אין לי דרך כי המשתמש מנתק ולא ממשיך לטייל במערכת.)

      מה שאני צריך לכאו' לעשות זה פשוט לשלוח פונקציה שתתבצע רק אם מופיע פרמטר hangup.

      function doGet(e) {
      	if (e.parameter.checkRecordHangup && e.parameter.hangup == "yes") {
      		// יש לבצע את הפעולות הנדרשות
      	}
      }
      
      פורסם בפורום מפתחים API
      ה
      הלוי הלוי
    • RE: שליחת API רק בניתוק

      @ivrפון @אביי-ורבא @דוד_מלך_ישראל
      לכאורה מצאתי פתרון הכי פשוט,
      להשאיר הכל כרגיל, והתגובה תבדוק אם hangup=yes, רק אז תעשה את הפעולות שאני צריך בניתוק.
      תודה רבה!!!

      פורסם בפורום מפתחים API
      ה
      הלוי הלוי
    • RE: שליחת API רק בניתוק

      מעניין לעניין בעניין אחר...
      יש לי הרבה שלוחות API במערכת, כולם פונות לאותה כתובת (רק הפונקציות שונות ואכמ"ל)
      אשר על כן, כתבתי כבר ב-ivr.ini את הקישור (api_link=https://..abcd).
      כעת אני לא רוצה לשלוח API ולכן אני רוצה להשאיר ריק את הכתובת.
      מה יגבר?
      הכתובת שרשומה ב-IVR או הכתובת שלא רשומה ב-EXT של השלוחה הנוכחית?
      או שאולי כדאי פשוט לא להשאיר ריק (api_link=) אלא לכתוב שגיאה (api_link=null)?

      תודה מראש!!

      ( @ivrפון @אביי-ורבא )

      פורסם בפורום מפתחים API
      ה
      הלוי הלוי
    • שליחת API רק בניתוק

      אני רוצה להגדיר שלוחה שכל מי שיכנס אליה, בסיום השיחה יישלח API מהמערכת.
      האם יש דבר כזה מובנה במודל API?
      או שאוכל רק 'להתחכם' ולהשאיר ריק ב-api_link ורק את api_hangup_link להגדיר לכתובת הנכונה (וכמובן להחליף לקובץ שקט את M1609 לא מוגדר לינק)
      ????

      תודה מראש!

      פורסם בפורום מפתחים API
      ה
      הלוי הלוי
    • RE: מיקום נוסף לשמירת הקלטות ראוטינג

      @יוסף-ח אם כבר הצעת לבדוק את השיטה הפשוטה והישנה...
      לא עבד גם שכפול והעתקת לינק

      hard_link=yes
      copy_record_link=/1
      
      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי
    • RE: מיקום נוסף לשמירת הקלטות ראוטינג

      @יוסף-ח מידיעה זה אמור לעבוד או מניחוש?
      כי לי זה לא עובד,
      אני מאמין ג"כ שאם זה היה כ"כ פשוט, זה היה צריך להיות כתוב במודל ראוטינג.
      תודה!!

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי
    • RE: מישהו מבין בהקשות DTMF?

      אני רואה שלא מגיבים, כנראה שכתבתי הסבר מידי מסובך...
      הקשות send_dtmf פועלות לי תמיד כדבעי, אני רק צריך תזמון אחר וכדו' לפי הצרכים שלי,
      איך אוכל ליצור קובץ שמע שיעשה את העבודה כמו send_dtmf? מה לא טוב בקוד דלעיל? עוצמה? טון?
      @יעקב פה
      @eliyahu פה
      תודה רבה מראש!!

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי
    • מישהו מבין בהקשות DTMF?

      יש לי מערכת שאני גורם לה להתקשר למערכת אחרת (לא בימות ככה"נ)
      ושם להקיש מספר הקשות.
      אני צריך להמתין מספר שניות (להודעת הכותרת של המערכת ההיא)
      אח"כ להקיש כמה ספרות, להמתין שוב ולהקיש עוד כמה ספרות.
      ניסיתי להשתמש ב-send_dtmf
      זה עובד יחסית כמו שצריך, הבעיה היא שנראה שההגדרה הזו לא בדיוק מפותחת...
      ניתן להגדיר שם כמה לחכות בין הקשה להקשה (נראה שזה לא פועל בדיוק כפי ההגדרה, אבל עם זה איכשהו הסתדרתי..)
      מה שעשיתי זה שבכניסה למערכת מוגדרת GO_TO_FOLDER ויש שם קובץ M0000 עם שקט למשך כמה שניות שצריך לפני ההקשה הראשונה.
      עד כאן עובד.
      ניסיתי גם לפני ההמתנה הבאה לעשות שוב את אותו תהליך אבל אם יש הגדרה של send_dtmf הוא מתחיל את השלוחה הבאה עוד לפני שהוא גומר את ההקשות(!) וממילא אני לא יכול להגדיר כמה זמן לעשות את ההמתנה השנייה.

      ניסיתי גם להעלות למערכת קבצים של DTMF שמצאתי (בויקיפדיה יש ובעוד כמה אתרים), היה לי איזשהו קו שעליו זה עבד (במערכות של ימות זה עובד לכאו'), אבל במערכת המדוברת זה לא עובד.
      עשיתי ג"כ קוד בגוגל סקריפט שמעלה למערכת קובץ עם הקשות והמתנה בין ההקשות, הוא גם לא מקיש במערכת ההיא,
      איך אוכל לעשות שזה יעבוד????
      מצורף הקוד:

      // שימוש לדוגמה
      function createExampleDTMFWAV() {
        const digits = '1231234'; // ההקשות לביצוע
        const pauses = [5000, 500, 500, 500, 2000, 500, 500, 500]; // אלפיות שניה להמתנה בין כל הקשה
        const wavBlob = createDTMFWAV(digits, pauses); // יצירת הקובץ
        uploadFile("ivr2:בדיקה/M1012.wav", wavBlob); // העלאה למערכת
      }
      
      /**
       * יוצר קובץ WAV עם צלילי DTMF וזמן שקט.
       * 
       * @param {string} digits - מחרוזת ספרות להמרה לצלילי DTMF.
       * @param {Array<number>} pauses - מערך של משכי הפסקה באלפיות שניות בין הספרות.
       * @return {Blob} - קובץ ה-WAV כ-Blob.
       */
      function createDTMFWAV(digits, pauses) {
        const dtmfFrequencies = {
          '1': [697, 1209],
          '2': [697, 1336],
          '3': [697, 1477],
          '4': [770, 1209],
          '5': [770, 1336],
          '6': [770, 1477],
          '7': [852, 1209],
          '8': [852, 1336],
          '9': [852, 1477],
          '0': [941, 1336],
          '*': [941, 1209],
          '#': [941, 1477]
        };
        
        const sampleRate = 8000;  // 8 kHz
        const toneDuration = 250; // 250 אלפיות השנייה עבור כל צליל DTMF
        const amplitude = 32767;  // Maximum amplitude for 16-bit audio
      
        let samples = [];
        
        for (let i = 0; i < digits.length; i++) {
          // הוסף שקט לפני הטון הראשון ובין צלילים
          let pauseDuration = (i === 0) ? pauses[0] : pauses[i];
          if (pauseDuration > 0) {
            let pauseSamples = Math.floor((pauseDuration / 1000) * sampleRate);
            samples = samples.concat(new Array(pauseSamples).fill(0));
          }
          
          // צור צליל DTMF
          let freqs = dtmfFrequencies[digits[i]];
          if (freqs) {
            let numSamples = Math.floor((toneDuration / 1000) * sampleRate);
            for (let j = 0; j < numSamples; j++) {
              let sampleValue = amplitude * Math.sin(2 * Math.PI * freqs[0] * j / sampleRate)
                              + amplitude * Math.sin(2 * Math.PI * freqs[1] * j / sampleRate);
              samples.push(sampleValue / 2);  // ודא שהאות המשולב נמצא בטווח של 16 סיביות
            }
          }
        }
        
        // המרת דגימות ל-16 סיביות PCM
        let buffer = new ArrayBuffer(samples.length * 2); // 2 בתים לדגימה
        let view = new DataView(buffer);
        for (let i = 0; i < samples.length; i++) {
          view.setInt16(i * 2, samples[i], true);  // Little-endian
        }
        
        // Create WAV file header
        let wavBuffer = new ArrayBuffer(44 + buffer.byteLength);
        let wavView = new DataView(wavBuffer);
        
        // RIFF header
        writeString(wavView, 0, 'RIFF');
        wavView.setUint32(4, 36 + buffer.byteLength, true);
        writeString(wavView, 8, 'WAVE');
        
        // fmt subchunk
        writeString(wavView, 12, 'fmt ');
        wavView.setUint32(16, 16, true);  // Subchunk1Size (16 for PCM)
        wavView.setUint16(20, 1, true);   // AudioFormat (1 for PCM)
        wavView.setUint16(22, 1, true);   // NumChannels (1 for mono)
        wavView.setUint32(24, sampleRate, true); // SampleRate
        wavView.setUint32(28, sampleRate * 2, true); // ByteRate (SampleRate * NumChannels * BitsPerSample/8)
        wavView.setUint16(32, 2, true);   // BlockAlign (NumChannels * BitsPerSample/8)
        wavView.setUint16(34, 16, true);  // BitsPerSample
        
        // data subchunk
        writeString(wavView, 36, 'data');
        wavView.setUint32(40, buffer.byteLength, true);
        new Uint8Array(wavBuffer).set(new Uint8Array(buffer), 44);
        
        // Convert to Blob
        return Utilities.newBlob(new Uint8Array(wavBuffer), 'audio/wav', 'dtmf_tones.wav');
      }
      
      function writeString(view, offset, string) {
        for (let i = 0; i < string.length; i++) {
          view.setUint8(offset + i, string.charCodeAt(i));
        }
      }
      
      /**
       * מעלה קובץ לכתובת ה-URL שצוינה באמצעות בקשת HTTP POST עם נתונים מרובי חלקים/טופס.
       *
       * @param {string} path - הנתיב שבו יש להעלות את הקובץ.
       * @param {Blob} fileBlob - blob הקובץ שיש להעלות.
       */
      function uploadFile(path, fileBlob) {
      
        var YemotUrl = url + 'UploadFile';
      
        var formData = {
          'upload': fileBlob,
          'token': token,
          'path': path
        };
        
        var options = {
          'method': 'post',
          'payload': formData,
          'muteHttpExceptions': true
        };
        
        var response = UrlFetchApp.fetch(YemotUrl, options);
        var responseCode = response.getResponseCode();
        Logger.log(response.getContentText());
        if (responseCode === 200) {
          return JSON.parse(response.getContentText());
        } else {
          return {'שגיאה': 'הבקשה נכשלה עם קוד תגובה ' + responseCode};
        }
      }
      
      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי
    • מיקום נוסף לשמירת הקלטות ראוטינג

      ברירת מחדל ההקלטות נשמרות בסל המחזור > RoutingRecord
      ברירת מחדל שם הקובץ הוא בסגנון כזה:
      DID-****-Phone-****-Folder-****-routing-RoutingToPhone-****-Date-2024-06-22-23-28-01.wav

      האם ניתן להגדיר שישמרו גם בשלוחת השמעת קבצים עם מספור אוטומטי?
      תודה מראש!

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ה
      הלוי הלוי