בדיקת קוד פייתון
-
@ישראללוי לא יעבוד, אתה מעלה למערכת את נתיב הקובץ, הפרמטרים להעלאה לא נכונים, נראה שאתה מנסה לשלוח לימות url של קובץ מרוחק, מה שאתה צריך לעשות זה להוריד אותו אצלך מקומית ולהעלות את תוכן הקובץ לימות.
-
@צדיק-תמים כתב בבדיקת קוד פייתון:
@ישראללוי אם זה סקריפט חד פעמי אתה יכול לוותר על הלוגין ולוגאאוט ופשוט לשלוח בפרמטר טוקן את המשתמש והסיסמה עם נקודותיים ביניהם
לא עברתי על שאר הקודתקנתי כעצתך תודה רבה
@האדם-החושב כתב בבדיקת קוד פייתון:
@ישראללוי לא יעבוד, אתה מעלה למערכת את נתיב הקובץ, הפרמטרים להעלאה לא נכונים, נראה שאתה מנסה לשלוח לימות url של קובץ מרוחק, מה שאתה צריך לעשות זה להוריד אותו אצלך מקומית ולהעלות את תוכן הקובץ לימות.
קוד מתוקן
import os import shutil import requests import json # <-- ייבוא חיוני לפיענוח תגובות API from dotenv import load_dotenv # --- טעינת משתני סביבה מקובץ .env --- load_dotenv() # הגדרת תיקיית הורדות # DOWNLOAD_FOLDER = 'downloads' # os.makedirs(DOWNLOAD_FOLDER, exist_ok=True) # --- משתנים גלובליים עבור ה-API --- YEMOT_API_USERNAME = os.getenv("YEMOT_USERNAME") YEMOT_API_PASSWORD = os.getenv("YEMOT_PASSWORD") YEMOT_API_URL = "https://www.call2all.co.il/ym/api" # ------------------------------------------------------------------- # בדיקת תלות - האם FFmpeg מותקן? # ------------------------------------------------------------------- if not shutil.which('ffmpeg'): print("--------------------------------------------------") print("אזהרה: FFmpeg לא נמצא במערכת שלך.") print("המרת קבצים ל-WAV לא תעבוד ללא FFmpeg.") print("אנא התקן אותו והוסף אותו ל-PATH של המערכת.") print("--------------------------------------------------") # ------------------------------------------------------------------- # חלק 1: פונקציית עזר מתוקנת לתקשורת עם ימות המשיח # ------------------------------------------------------------------- def process_yemot_api(local_wav_path, remote_filename): """ Handles the entire Yemot API process: Login, Upload, and Logout. Uses JSON parsing for modern API responses and robust error handling. """ if not YEMOT_API_USERNAME or not YEMOT_API_PASSWORD: print("שגיאה: שם משתמש או סיסמה של ימות המשיח לא הוגדרו בקובץ .env") return False session = requests.Session() print(f"שלב 1: מעלה את הקובץ '{local_wav_path}' אל '{remote_filename}.wav'...") # הנתיב צריך להיות רק התיקייה, שם הקובץ מועבר בנפרד target_path_folder = "IVR2/8" upload_params = { "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", # שימוש בטוקן הנכון שחולץ מה-JSON "what": "ivr_sync", "path": target_path_folder, } try: with open(local_wav_path, 'rb') as f: # שם הקובץ בהעלאה צריך להיות עם סיומת .wav files = {'file': (f'{remote_filename}.wav', f, 'audio/wav')} response = session.post(f"{YEMOT_API_URL}/UploadFile", params=upload_params, files=files, timeout=90) # Timeout ארוך יותר להעלאה response.raise_for_status() data = response.json() if data.get("responseStatus") == "OK": print(f"העלאת הקובץ '{remote_filename}.wav' לשלוחה 8 הצליחה!") return True else: error_message = data.get("message", "שגיאה לא ידועה מה-API") print(f"שגיאת העלאת קובץ: {error_message}") return False except requests.exceptions.RequestException as e: print(f"שגיאת רשת בעת העלאת קובץ: {e}") return False except FileNotFoundError: print(f"שגיאה קריטית: לא נמצא קובץ מקומי להעלאה בנתיב {local_wav_path}") return False except json.JSONDecodeError: print(f"שגיאה בפענוח תגובת ה-API בעת העלאה. תגובה גולמית: {response.text}") return False if __name__ == "__main__": print("\n--- מתחיל הרצת בדיקה מקומית ---") # ודא שיש לך קובץ בשם 'a.wav' באותה תיקייה local_file = "a.wav" remote_name = "aaa_test" # שם הקובץ כפי שיופיע במערכת if os.path.exists(local_file): success = process_yemot_api(local_file, remote_name) if success: print(f"\nהתהליך הושלם בהצלחה. הקובץ '{remote_name}.wav' אמור להיות בשלוחה 8.") else: print("\nהתהליך נכשל. בדוק את הודעות השגיאה למעלה.") else: print(f"שגיאת בדיקה: הקובץ '{local_file}' לא נמצא. צור קובץ זה כדי להריץ את הבדיקה.") print("--- סיום הרצת בדיקה ---\n")
מה לא נכון? תודה רבה
-
@ישראללוי כתב בבדיקת קוד פייתון:
target_path_folder = "IVR2/8"
יש לך כמה שגיאות קודם כל בשורה 46:
target_path_folder = "IVR2/8"
תשנה ל:
target_path_folder = "ivr/8/"
תוסיף בפרמס: autoNumbering: true
כדי שזה יעלה במספור אוטומטי או שתשנה את הנתיב שיהיה את שם הקובץ + סיומת
לדוגמאtarget_path_folder = "ivr/8/000.wav"
-
פוסט זה נמחק! -
@פיסטוק-פרווה זה הקריאה המועדכנת
זה תקין?response = session.post(f"{YEMOT_API_URL}/UploadFile", headers={ "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", "path": "IVR2/8/a.wav" }, files={'file': (f'{remote_filename}.wav', f, 'audio/wav')} , timeout=90) # Timeout ארוך יותר להעלאה response.raise_for_status()
זה תקין?
"token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}",
זה מחזיר שגיאה
שגיאת העלאת קובץ: IllegalStateException(session token is required) -
@ישראללוי
זה לא קורא טוב את הערכים מה .env
איך רשמת ב ENV. (בלי סיסמה) -
@פיסטוק-פרווה
YEMOT_USERNAME=************
YEMOT_PASSWORD=*********
הטוקן והנתיב צריכים להיות בעדר או בפרמס? -
@ישראללוי
נראה לי שאפשר גם וגם אבל עדיף בפרמס -
@ישראללוי כתב בבדיקת קוד פייתון:
YEMOT_API_USERNAME
תוסיף פרינט של היוזר והסיסמה בהפעלת הקוד אחרי שזה נמשך מה env
-
@פיסטוק-פרווה כתב בבדיקת קוד פייתון:
@ישראללוי כתב בבדיקת קוד פייתון:
YEMOT_API_USERNAME
תוסיף פרינט של היוזר והסיסמה בהפעלת הקוד אחרי שזה נמשך מה env
הדפסתי והערכים תקינים
-
לא הבנתי למה צריך ffmpeg?, המערכת ממירה לבד את הקובץ
-
@פיסטוק-פרווה כתב בבדיקת קוד פייתון:
@ישראללוי
נראה לי שאפשר גם וגם אבל עדיף בפרמסזה המעודכן
with open(local_wav_path, 'rb') as f: # שם הקובץ בהעלאה צריך להיות עם סיומת .wav response = session.post(f"{YEMOT_API_URL}/UploadFile", params={ "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", "path":"IVR2/8/a.wav" }, headers={ "files": files } , timeout=90)
תקין?
-
@ישראללוי ה-path שוב לא תקין, תחליף ל-
ivr/8/a.wav
-
@CUBASE כתב בבדיקת קוד פייתון:
@ישראללוי ה-path שוב לא תקין, תחליף ל-
ivr/8/a.wav
זה המעודכןwith open(local_wav_path, 'rb') as f: # שם הקובץ בהעלאה צריך להיות עם סיומת .wav files = {'file': (f'{remote_filename}.wav', f, 'audio/wav')} response = session.post(f"{YEMOT_API_URL}/UploadFile", params={ "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", "path":"ivr/8/a.wav" }, headers={ "files": files } , timeout=90)
תקין?
עריכה זה המעודכן
with open(local_wav_path, 'rb') as f: # שם הקובץ בהעלאה צריך להיות עם סיומת .wav files = {'file': (f'{remote_filename}.wav', f, 'audio/wav')} response = session.post(f"{YEMOT_API_URL}/UploadFile", params={ "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", "path":"ivr/8/a.wav" }, files=files, headers={ "Content-Type": "multipart/form-data" }, timeout=90 )
-
@ישראללוי כתב בבדיקת קוד פייתון:
@CUBASE כתב בבדיקת קוד פייתון:
@ישראללוי ה-path שוב לא תקין, תחליף ל-
ivr/8/a.wav
זה המעודכןwith open(local_wav_path, 'rb') as f: # שם הקובץ בהעלאה צריך להיות עם סיומת .wav files = {'file': (f'{remote_filename}.wav', f, 'audio/wav')} response = session.post(f"{YEMOT_API_URL}/UploadFile", params={ "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", "path":"ivr/8/a.wav" }, headers={ "files": files } , timeout=90)
תקין?
עריכה זה המעודכן
with open(local_wav_path, 'rb') as f: # שם הקובץ בהעלאה צריך להיות עם סיומת .wav files = {'file': (f'{remote_filename}.wav', f, 'audio/wav')} response = session.post(f"{YEMOT_API_URL}/UploadFile", params={ "token": f"{YEMOT_API_USERNAME}:{YEMOT_API_PASSWORD}", "path":"ivr/8/a.wav" }, files=files, headers={ "Content-Type": "multipart/form-data" }, timeout=90 )
זה תקין?
-
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"