@sumone צודק.
שים לב שבכתובת ההיא בheaders כתוב שהcontent-type הוא json, אולי זה מה שגורם לבעיה.
מה רשום לך בapilog?
אגב, שים לב שכתבת את השורה הזאת:
api_hangup_send=noapi_hangup_send=no
@sumone צודק.
שים לב שבכתובת ההיא בheaders כתוב שהcontent-type הוא json, אולי זה מה שגורם לבעיה.
מה רשום לך בapilog?
אגב, שים לב שכתבת את השורה הזאת:
api_hangup_send=noapi_hangup_send=no
@אלי-דובדבן אתה צריך להחזיר תשובת שרת בפורמט טקסט רגיל, לא json.
@אליהו-המיבין אפשר לעשות שלוחת תור לקול הלשון ואז להעביר את הקלטת התור לתוך שלוחה בימות מתוך סל המחזור.
כדי לעשות את זה באופן אוטומטי תצטרך שרת שיאזין לוובהוק בסוף התור ויעביר את הקובץ.
תוכל גם להגדיר
queue_record_duplicate_link=מיקום
וכך זה ישמר אוטומטית בשלוחה גם בלי קריאת api, אבל ברגע שההקלטה תימחק מסל המחזור ההודעה תימחק.
יש רק בעיה קטנה באופציה של התור - ההקלטה תכלול את התפריט של קול הלשון.
אופציה שניה - לעשות שלוחת הקלטה רגילה ובסוף ההקלטה להעביר אותו לשלוחת api שתשלח וובהוק לשרת שלך ששם תכתוב את הלוגיה להעלות את הקובץ לקול הלשון.
from uuid import uuid4
import requests
class Yemot:
BASE_URL = "https://www.call2all.co.il/ym/api/"
def __init__(
self,
user_name: str,
password: str | int,
) -> None:
self.token = f"{user_name}:{password}"
self.params = {
"token": self.token
}
def upload_file(self, path: str, blob: bytes, file_name: str, base_path: str = "ivr2:/") -> bool:
total_size = len(blob)
chunk_size = 49 * 1024 * 1024
chunks = [blob[offset:offset + chunk_size] for offset in range(0, total_size, chunk_size)]
if len(chunks) == 1:
return self._upload_small_file(path, blob, file_name, base_path)
else:
return self._upload_large_file(path, chunks, file_name, total_size, base_path)
def _upload_small_file(self, path: str, blob: bytes, file_name: str, base_path: str) -> bool:
data = {
"path": f"{base_path}{path}",
"convertAudio": "1",
"autoNumbering": "true",
}
data.update(self.params)
files = {"file": (file_name, blob)}
url = f"{self.BASE_URL}UploadFile"
response = requests.post(url, files=files, data=data).json()
return response["responseStatus"] == "OK"
def _upload_large_file(self, path: str, chunks: list[bytes], file_name: str, content_size: int, base_path: str) -> bool:
qquuid = str(uuid4())
offset = 0
for index, chunk in enumerate(chunks):
data = {
"path": f"{base_path}{path}",
"qquuid": qquuid,
"convertAudio": "1",
"autoNumbering": "true",
"uploader": "yemot-admin",
"qqfilename": file_name,
"qqtotalfilesize": content_size,
"qqtotalparts": len(chunks),
"qqchunksize": len(chunk),
"qqpartbyteoffset": offset,
"qqpartindex": index,
}
data.update(self.params)
files = {
"qqfile": chunk,
}
url = f"{self.BASE_URL}UploadFile"
response = requests.post(url, data=data, files=files).json()
if not response["success"]:
print(f"Error uploading chunk {index}: {response}")
return False
offset += len(chunk)
data = {
"path": f"{base_path}{path}",
"uploader": "yemot-admin",
"convertAudio": "1",
"autoNumbering": "true",
"qquuid": qquuid,
"qqfilename": file_name,
"qqtotalfilesize": content_size,
"qqtotalparts": len(chunks),
}
data.update(self.params)
response = requests.post(f"{self.BASE_URL}UploadFile?done", data=data).json()
return response["responseStatus"] == "OK"
@ישראללוי לא יעבוד, אתה מעלה למערכת את נתיב הקובץ, הפרמטרים להעלאה לא נכונים, נראה שאתה מנסה לשלוח לימות url של קובץ מרוחק, מה שאתה צריך לעשות זה להוריד אותו אצלך מקומית ולהעלות את תוכן הקובץ לימות.
@הללוהו תביא את ההגדרות המלאות משלוחת התור ואת הקוד המלא מגוגל סקריפט ואולי נוכל לעזור לך.
אגב, אתה מודע לכך שצריך לעדכן פריסה אחרי כל שינוי בקוד כדי שהשינויים יחולו?
@יהודה-צ-כ חשבתי על הכיוון הזה, הבעיה תהיה במקרה שהלקוח ניתק לפני שהנציג הספיק לעשות את זה.
מה גם שזה לא יעזור למקרה הספציפי הזה, מה שאני צריך זה למיין את הקלטות התור לפי קטגוריות על ידי בחירת הנציג את הקטגוריה המתאימה + קריאת api, אם השיחה עדיין לא הסתיימה אין עדיין את ההקלטה.
@יהודה-צ-כ אני צריך שדווקא הנציג יגדיר.
@הללוהו למיטב זכרוני השליחה מימות כpost לא שולחת את הנתונים במבנה json אלא כפרמטרים מופרדים ב& ו =
אגב, למה אתה לא שולח בget?
אני צריך לקבל משוב מהנציג בסיום שיחת תור לאיזו קטגוריה לשייך את השיחה, אבל אני לא רואה דרך להשאיר את הנציג על הקו בסיום השיחה. (לבקש מהנציג שיתקשר כל פעם שוב פעם למערכת זה לא ישים)
הרעיון היחידי שהצלחתי לחשוב עליו הוא להגדיר שלוחת פילטר לפי מספר מאזינים שמפנה לשלוחת api שמפעילה קמפיין פתוח (CallExtensionBridging) שמכניסה את הנציג לחדר ועידה וגם הלקוח בסיום הapi מועבר לחדר הועידה.
חדר הועידה של הלקוח היא שלוחת מנהל כדי שבניתוק הלקוח הנציג יועבר לשלוחה שתבקש ממנו את המשוב.
הבעיה היא שיש בגישה הזאת הרבה מאוד בעיות צריך לפתור.
יש למישהו אולי רעיון טוב יותר?
@אופיר זה מספר וירטואלי
type=private_did
private_did_admin=מספר הטלפון שלך
@CUBASE בשמירת קובץ הקלטה גם יש נתיב יחסי. (אם כי כתיבת הנתיב היחסי שם קצת שונה מהדרך הרגילה)
@CUBASE
נניח אני בנתיב
ivr2:1/2/3
ואני רוצה לשנות קובץ שנמצא בנתיב
ivr2:1/1/2
אם אני כותב כך:
type=add_id_to_list
add_id_to_list_location_list=/1/1/2
add_id_to_list_key=001
add_id_to_list_value_type=digits
add_id_to_list_value_change=yes
הכל עובד, אבל אם אני כותב כך:
type=add_id_to_list
add_id_to_list_location_list=../../1/2
add_id_to_list_key=001
add_id_to_list_value_type=digits
add_id_to_list_value_change=yes
זה לא עובד.
אני מנסה לעשות נתיב יחסי בשלוחת add_id_to_list, הנתיב תקין ובכל זאת זה לא מתעדכן.
כשאני עושה נתיב לא יחסי זה כן עובד.
אגב, במקרה והקובץ לא קיים ומוגדר
add_id_to_list_value_change=yes
לא מושמעת הודעת שגיאה.
במודל record_system_messages יש את אותה בעיה.
@אביי-ורבא יש גם את זה, שם אפילו לא צריך לנקד.
ממה שהם מציגים זה נראה מדוייק ממש, אם כי אצלי לוקאלית ניסיתי את זה על קול שהמודל לא אומן עליו ולא התלהבתי מהתוצאות.
שמתי לב שבמספר אמריקאי הקידומת 1 נכנסת בסוף המספר, השאלה היא האם זה כך בכל המדינות והאם יש דרך לתקן את זה?
אני מחפש דרך לראות האם המשתמש הקליט הקלטה, לפי מספר טלפון לא יעזור לי כי אני צריך לדעת על אותה שיחה האם הוא הקליט.
את הנכנסים לקו אני מקבל דרך LogFolderEnterExit, והדרך היחידה שעולה בדעתי זה לבדוק לפי מזהה השיחה (שמופיע שם בלוג), השאלה היא אם יש דרך כלשהי לקבל את המידע על הקובץ מאיזה מזהה שיחה הוא הוקלט.
בתודה מראש.
def upload_tts_file(phone: str, tts_content: str):
"""העלאת קובץ TTS לשרת"""
url = f"{BASE_URL}/UploadTextFile"
params = {
"token": TOKEN,
"what": f"ivr2:5/{phone}.tts",
"contents": tts_content
}
try:
logging.debug(f"שולח בקשה להעלאת קובץ TTS עבור {phone}: {url}")
logging.debug(f"פרמטרים: {params}")
logging.debug(f"תוכן TTS: {tts_content}")
response = requests.get(url, params=params)
response.raise_for_status()
logging.debug(f"תגובת השרת בהעלאת TTS: {response.text}")
logging.info(f"העלאת קובץ TTS עבור {phone} בוצעה בהצלחה")
return response
except requests.exceptions.RequestException as e:
logging.error(f"שגיאה בהעלאת קובץ TTS עבור {phone}: {e}")
logging.error(traceback.format_exc())
raise