• הרשמה
    • התחברות
    • חיפוש
    • דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • קבלת התראות מהדפדפן
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    1. דף הבית
    2. NA73438
    3. פוסטים
    N
    • פרופיל
    • עוקב אחרי 1
    • עוקבים 0
    • נושאים 16
    • פוסטים 51
    • הגבוה ביותר 5
    • שנוי במחלוקת 1
    • קבוצות 0

    הודעות שפורסמו על ידי NA73438

    • הכנסת קובץ שמע אישי למשתתף בAPI, איך עושים?

      יש לי שרת שיוצר קובץ שמע אישי לכל משתמש ואני רוצה שהוא ישלח אותו לימות המשיח עם ID של מספר הטלפון כך שכל מאזין יוכל להתקשר לקו ואם יש קובץ שמשויך למספר טלפון שלו הוא ישמיע אותה ואם לא ישמיע קובץ חילופי
      מה הדרך לעשות את זה?

      פורסם בפורום מפתחים API
      N
      NA73438
    • RE: המרת טקסט לדיבור מטורפת!!!! ב ח י נ ם!!!!!

      @CUBASE
      ואז איך שולחים את זה?
      באופציות של הפעלת קמפיין- הגדרות הTSS הם להשתמש בשרות של ימות אין שם מקום לשלב את הAPI של ג'מיני

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

      @MGM-IVR
      כמה מאות

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

      מה הדרך לשלב את היכולת הזאת בתוך ימות עצמם לדוגמה
      אני רוצה לשלוח קמפיין גדול שכל אחד מקבל הודעה אישית עבורו- הקמפיין מופעל בAPI
      איך אפשר לעשות שהוא ישמיע את ההודעה מהקריינות המצוינת הזאת?

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

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • שליחת כמות גדולה של הודעות בAPI כשכל מספר צריך לקבל הודעה אחרת

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: פתיחת שלוחות מרובות עם קבצי שמע / טקסט

      @y6714453
      תודה רבה
      נעזרתי בזה וזה מצוין
      אציין שהיה לי 2 תקלות וסידרתי את זה (בעזרתו של ג'מיני)

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

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

      
      import pandas as pd
      import requests
      from requests_toolbelt.multipart.encoder import MultipartEncoder
      import os
      import asyncio
      import edge_tts
      import subprocess
      import json
      import urllib.request
      import zipfile
      import shutil
      import warnings
      
      warnings.filterwarnings("ignore")
      
      DEFAULT_TTS_VOICE = "he-IL-AvriNeural"
      FFMPEG_EXECUTABLE = None
      
      def read_excel_data(excel_file_path):
          print(f"📖 קורא קובץ אקסל: {excel_file_path}")
          try:
              df = pd.read_excel(excel_file_path, header=None)
              username = str(df.iloc[0, 1]).strip()
              password = str(df.iloc[1, 1]).strip()
              
              if not username:
                  print("❌ שגיאה: אנא הכנס מספר מערכת (תא B1 באקסל).")
                  return None, None, None
              if not password:
                  print("❌ שגיאה: אנא הכנס סיסמא (תא B2 באקסל).")
                  return None, None, None
      
              extensions = df.iloc[5:, [0, 1, 2, 3, 4]].dropna(how='all')
              extensions.columns = ['נתיב', 'הגדרה', 'שם השלוחה', 'קובץ שמע להעלאה', 'קובץ טקסט להעלאה']
              
              extensions = extensions.apply(lambda x: x.astype(str).str.strip().replace('nan', '') if x.dtype == 'object' else x)
      
              print(f"✔️ נקראו בהצלחה: משתמש={username}, סיסמה={'*' * len(password)}")
              return username, password, extensions.to_dict('records')
          except FileNotFoundError:
              print(f"❌ שגיאה: קובץ האקסל '{excel_file_path}' לא נמצא. ודא שהוא באותה תיקייה כמו הסקריפט.")
              return None, None, None
          except Exception as e:
              print(f"❌ שגיאה בקריאת קובץ האקסל: {e}")
              return None, None, None
      
      def create_ext_ini_file(extension_type, extension_name, output_file_name, is_subpath=False, direct_ini_content=None):
          # פונקציה זו נשארת ללא שינוי
          content = ""
          if direct_ini_content:
              content = direct_ini_content.strip() + '\n'
          elif is_subpath:
              content = "type=menu\n"
          # ... (שאר הקוד של הפונקציה זהה)
          try:
              with open(output_file_name, 'w', encoding='utf-8') as f:
                  f.write(content)
              return True
          except Exception:
              return False
      
      
      async def create_and_convert_audio_file(text, output_wav_name):
          # פונקציה זו נשארת ללא שינוי
          output_mp3_temp = f"temp_{os.path.splitext(output_wav_name)[0]}.mp3"
          print(f"🔊 יוצר קובץ שמע {output_wav_name} מטקסט: '{text}'")
          global FFMPEG_EXECUTABLE
          if not FFMPEG_EXECUTABLE or not os.path.exists(FFMPEG_EXECUTABLE):
              ensure_ffmpeg() 
              if not FFMPEG_EXECUTABLE or not os.path.exists(FFMPEG_EXECUTABLE):
                  return False
          # ... (שאר הקוד של הפונקציה זהה)
          try:
              comm = edge_tts.Communicate(text, voice=DEFAULT_TTS_VOICE)
              await comm.save(output_mp3_temp)
              subprocess.run(
                  [FFMPEG_EXECUTABLE, "-loglevel", "error", "-y", "-i", output_mp3_temp, "-ar", "8000", "-ac", "1", "-acodec", "pcm_s16le", output_wav_name],
                  check=True
              )
              return True
          except Exception:
              return False
          finally:
              if os.path.exists(output_mp3_temp):
                  os.remove(output_mp3_temp)
      
      def upload_file_to_yemot(file_path, yemot_full_path, username, password):
          # פונקציה זו נשארת ללא שינוי
          token = f"{username}:{password}"
          content_type = 'application/octet-stream'
          if file_path.lower().endswith('.wav'): content_type = 'audio/wav'
          if file_path.lower().endswith('.ini'): content_type = 'text/plain'
          
          try:
              with open(file_path, 'rb') as f_read:
                  m = MultipartEncoder(fields={
                      "token": token, "path": yemot_full_path,
                      "upload": (os.path.basename(yemot_full_path), f_read, content_type) # שינוי קטן לשם הקובץ בשרת
                  })
                  print(f"⬆️ מעלה קובץ '{os.path.basename(file_path)}' לנתיב: '{yemot_full_path}'")
                  r = requests.post("https://www.call2all.co.il/ym/api/UploadFile", data=m, headers={'Content-Type': m.content_type})
                  r.raise_for_status()
                  print(f"✔️ הקובץ הועלה בהצלחה")
                  return True
          except Exception as e:
              print(f"❌ שגיאה בהעלאת קובץ {os.path.basename(file_path)}: {e}")
              return False
      
      def generate_subpaths(full_path):
          # פונקציה זו נשארת ללא שינוי
          parts = [p for p in full_path.split('/') if p]
          subpaths = []
          current_path_parts = []
          for part in parts[:-1]:
              current_path_parts.append(part)
              subpaths.append('/'.join(current_path_parts))
          return subpaths
      
      def ensure_ffmpeg():
          # פונקציה זו נשארת ללא שינוי
          global FFMPEG_EXECUTABLE
          local_ffmpeg_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "bin", "ffmpeg.exe")
          if os.path.exists(local_ffmpeg_path):
              FFMPEG_EXECUTABLE = local_ffmpeg_path
              return
          print("❌ FFmpeg לא נמצא בתיקיית 'bin'. יצירת שמע מטקסט לא תתאפשר.")
          FFMPEG_EXECUTABLE = None
          
      async def main():
          print("🚀 מתחיל תהליך יצירת והעלאת שלוחות...")
          script_dir = os.path.dirname(os.path.abspath(__file__))
          excel_file = os.path.join(script_dir, "משני.xlsx")
      
          if not os.path.exists(excel_file):
              print(f"❌ קובץ האקסל '{excel_file}' לא נמצא!")
              return
      
          username, password, extensions_data = read_excel_data(excel_file)
          if not username or not password or not extensions_data:
              return
      
          all_defined_paths = {ext.get('נתיב', '').strip() for ext in extensions_data if ext.get('נתיב')}
      
          for ext in extensions_data:
              path = ext.get('נתיב', '').strip()
              extension_type = ext.get('הגדרה', '').strip()
              audio_content = ext.get('קובץ שמע להעלאה', '').strip()
      
              if not path: continue
              
              print(f"\n📋 מעבד שלוחה: {ext.get('שם השלוחה', 'ללא שם')} ({path})")
      
              # לוגיקת יצירת תיקיות ביניים ו-ext.ini נשארת זהה...
              # ...
              if extension_type:
                  main_ini_file = "ext_temp_main.ini"
                  if create_ext_ini_file(None, None, main_ini_file, direct_ini_content=extension_type):
                      upload_file_to_yemot(main_ini_file, f"ivr2:/{path}/ext.ini", username, password)
                      os.remove(main_ini_file)
      
              # --- ⭐ התיקון המרכזי נמצא כאן ⭐ ---
              if audio_content:
                  source_filename = audio_content
                  dest_filename = ""
      
                  # בדיקה אם יש הגדרת שם מותאם
                  if '>' in audio_content:
                      parts = audio_content.split('>', 1)
                      source_filename = parts[0].strip()
                      dest_filename = parts[1].strip()
                  
                  local_audio_path = os.path.join(script_dir, source_filename)
      
                  # עדיפות 1: בדיקת קובץ מקומי
                  if os.path.exists(local_audio_path):
                      # אם לא הוגדר שם יעד, השתמש בשם המקורי
                      if not dest_filename:
                          dest_filename = os.path.basename(local_audio_path)
                      
                      audio_yemot_path = f"ivr2:/{path}/{dest_filename}"
                      upload_file_to_yemot(local_audio_path, audio_yemot_path, username, password)
                  
                  # עדיפות 2: יצירת שמע מטקסט
                  else:
                      print(f"📄 לא נמצא קובץ מקומי '{source_filename}'. מנסה ליצור שמע מהטקסט...")
                      # אם לא הוגדר שם יעד, השתמש בשם ברירת מחדל
                      if not dest_filename:
                          dest_filename = "000.wav"
      
                      temp_tts_wav_file = "temp_tts_generated.wav"
                      
                      if await create_and_convert_audio_file(source_filename, temp_tts_wav_file):
                          audio_yemot_path = f"ivr2:/{path}/{dest_filename}"
                          upload_file_to_yemot(temp_tts_wav_file, audio_yemot_path, username, password)
                          if os.path.exists(temp_tts_wav_file):
                              os.remove(temp_tts_wav_file)
                      else:
                          print(f"⚠️ דילוג על העלאת קובץ שמע עקב שגיאה ביצירה.")
              # --- ⭐ סוף התיקון ⭐ ---
      
          print("\n✅ סיום עיבוד כל השלוחות בהצלחה!")
      
      if __name__ == "__main__":
          asyncio.run(main())
      
      
      פורסם בטיפים עצות והדגמות מהמשתמשים
      N
      NA73438
    • RE: משחק קליקרים

      עשיתי גם בחויה בקליק וגם בטריקס
      נהנתי יותר מחויה בקליק
      יש להם גם שירות מהמם במייל ובטלפון
      מבחינת המחיר נראה לי שהם גם יותר זולים-אבל זה תלוי בעיקר במספר המשתתפים

      פורסם בשאלות ועזרה הדדית
      N
      NA73438
    • RE: חדש! אתר לניהול מערכת תורים

      רק אצלי אי אפשר לשמוע את ההקלטות כבר?

      פורסם בחדש במערכת
      N
      NA73438
    • RE: האם הקוים נסגרים לאחר הורדת דמי הקישוריות?

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

      וכמובן אי אפשר לשכוח את כל תעשיית המבזקים שרק תפרח ותשגשג למורת לב ההמונים....

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: האם הקוים נסגרים לאחר הורדת דמי הקישוריות?

      תקחו בחשבון שזה לא גרוע כמו שזה נראה כי אז כל העברת שיחה מחוץ למערכת לא אמור לעלות יחידות
      כך שמי שיש לו מערכת של מרכזיה בד"כ יהיה שווה לו לשלם סכום קבוע על הקו מאשר לפי דקות

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • משהו מכיר דרך לצור פקודה שתצור שיחת טלפון ביני לבין הלקוח (פרטים בפנים)

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: יצוא מערכת שלמה

      @אביי-ורבא
      כן
      למערכת חדשה בימות
      אין לי אפשרות לפנות בפרטי

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: יצוא מערכת שלמה

      @613-0 כתב ביצוא מערכת שלמה:

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • יצוא מערכת שלמה

      יש דרך לייצא מערכת שלמה ולהעביר למערכת חדשה?
      (יש לי מערכת עם הגדרות ב200 שלוחות...)

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: הורדת הקלטת שיחה מהכתובת שנשלחת לAPI לאחר שיחה- לא פעילה

      @מתעניין
      תיקנתי וזה עובד
      סוף סוף...
      רק מוזר כי ככה זה הגיע לי בAPI
      יש דרך לסדר את זה?

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: הורדת הקלטת שיחה מהכתובת שנשלחת לAPI לאחר שיחה- לא פעילה

      @הרב
      כן
      הכנסתי את הכתובת לדפדפן

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: הורדת הקלטת שיחה מהכתובת שנשלחת לAPI לאחר שיחה- לא פעילה

      @הרב
      ניסתי רק דרך הדפדפן
      אך אפשר עוד להשתמש בזה?

      פורסם בעזרה הדדית למשתמשים מתקדמים
      N
      NA73438
    • RE: הורדת הקלטת שיחה מהכתובת שנשלחת לAPI לאחר שיחה- לא פעילה

      @הרב
      שמתי את זה

      https://www.call2all.co.il/ym/api/DownloadFile?token=0773137777:1111&path=ivr2:/Trash/QueueRecord/CustomerDID-0799272744-Phone-0583220456-Folder-1-DialTo-548427673-Date-2024-01-01-16-23-24.wav
      

      וזה כותב לי
      Requested file does not exist
      הקובץ המבוקש אינו קיים

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