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

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
יהודי טובי

יהודי טוב

@יהודי טוב
אודות
פוסטים
617
נושאים
93
שיתופים
0
קבוצות
0
עוקבים
4
עוקב אחרי
0

פוסטים

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

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    יהודי טובי יהודי טוב

    @eido כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:

    אני צריך יותר "תוכנית עבודה"

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

    ואז תבצע תהליך כשכל תהליך מוריד את הקבצים בJSON של תא מסוים ובסיום קורא לאנדפוינט שמתקדם לתא הבא וכן הלאה..

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    יהודי טובי יהודי טוב

    @eido

    אם מעניין אותך יש לי את הקוד הזה בnode.
    שאני דבר ראשון מקבל את כל הנתיבים של הקבצים - שזה בקשות לא כבדות.
    ואח"כ אני עובר על כל הקבצים עם מידע כמה אחוז כבר ירד (ושומר לקובץ ZIP את מה שנוצר)

    
    
    // ============================================
    // ייבוא מודולים
    // ============================================
    const axios = require('axios');
    const fs = require('fs');
    const path = require('path');
    const archiver = require('archiver');
    
    const TOKEN = "XX"
    
    const API_BASE_URL = 'https://www.call2all.co.il/ym/api/';
    const ITEMS_PER_REQUEST = 500;
    
    // ============================================
    // פונקציות עזר
    // ============================================
    
    /**
     * יצירת תיקייה אם לא קיימת
     */
    function ensureDir(dirPath) {
      if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath, { recursive: true });
      }
    }
    
    /**
     * מחיקת תיקייה רקורסיבית
     */
    function removeDir(dirPath) {
      if (fs.existsSync(dirPath)) {
        fs.rmSync(dirPath, { recursive: true, force: true });
      }
    }
    
    /**
     * קבלת פרטי המערכת
     */
    async function getSystemInfo() {
      try {
        const response = await axios.get(`${API_BASE_URL}GetSession`, {
          params: {
            token: TOKEN
          }
        });
    
        if (response.data.responseStatus !== 'OK') {
          throw new Error(`Error getting system info: ${response.data.message}`);
        }
    
        return response.data;
      } catch (error) {
        console.error('❌ שגיאה בקבלת פרטי מערכת:', error.message);
        throw error;
      }
    }
    
    /**
     * קבלת תוכן תיקייה מהשרת
     */
    async function getDirectoryContent(dirPath, filesFrom = 0, filesLimit = ITEMS_PER_REQUEST) {
      try {
        const response = await axios.get(`${API_BASE_URL}GetIVR2Dir`, {
          params: {
            token: TOKEN,
            path: dirPath,
            filesFrom,
            filesLimit
          }
        });
    
        if (response.data.responseStatus !== 'OK') {
          throw new Error(`Error getting directory: ${response.data.message}`);
        }
    
        return response.data;
      } catch (error) {
        console.error(`❌ שגיאה בקבלת תוכן תיקייה ${dirPath}:`, error.message);
        throw error;
      }
    }
    
    /**
     * הורדת קובץ בודד
     */
    async function downloadFile(filePath, localPath) {
      try {
        const response = await axios.get(`${API_BASE_URL}DownloadFile`, {
          params: {
            token: TOKEN,
            path: filePath
          },
          responseType: 'arraybuffer'
        });
    
        ensureDir(path.dirname(localPath));
        fs.writeFileSync(localPath, response.data);
        
        return true;
      } catch (error) {
        console.error(`❌ שגיאה בהורדת קובץ ${filePath}:`, error.message);
        return false;
      }
    }
    
    /**
     * איסוף כל הקבצים מתיקייה (עם טיפול בפגינציה) - ללא הורדה
     */
    async function collectFilesFromDir(dirPath) {
      let filesFrom = 0;
      let allFiles = [];
      let allIni = [];
      let allHtml = [];
    
      // איסוף כל הקבצים (עם פגינציה)
      while (true) {
        const dirContent = await getDirectoryContent(dirPath, filesFrom, ITEMS_PER_REQUEST);
        
        const currentFiles = dirContent.files || [];
        const currentIni = dirContent.ini || [];
        const currentHtml = dirContent.html || [];
    
        allFiles.push(...currentFiles);
        allIni.push(...currentIni);
        allHtml.push(...currentHtml);
    
        // אם קיבלנו פחות מהלימיט, זה אומר שזה הסיבוב האחרון
        if (currentFiles.length < ITEMS_PER_REQUEST) {
          break;
        }
    
        filesFrom += ITEMS_PER_REQUEST;
      }
    
      return [
        ...allFiles,
        ...allIni,
        ...allHtml
      ];
    }
    
    /**
     * סריקה רקורסיבית של כל התיקיות - רק איסוף נתיבים
     */
    async function scanRecursively(dirPath, localDirPath, filesList = []) {
      // איסוף הקבצים מהתיקייה הנוכחית
      const files = await collectFilesFromDir(dirPath);
      
      // הוספת הקבצים למערך עם הנתיב המקומי
      for (const file of files) {
        filesList.push({
          remotePath: file.what,
          localPath: path.join(localDirPath, file.name),
          name: file.name,
          size: file.size || 0
        });
      }
    
      // קבלת רשימת התיקיות
      const dirContent = await getDirectoryContent(dirPath, 0, ITEMS_PER_REQUEST);
      const dirs = dirContent.dirs || [];
    
      // עיבוד כל תיקייה באופן רקורסיבי
      for (const dir of dirs) {
        const subDirPath = dir.what;
        const localSubDirPath = path.join(localDirPath, dir.name);
        
        await scanRecursively(subDirPath, localSubDirPath, filesList);
      }
    
      return filesList;
    }
    
    /**
     * הורדת כל הקבצים עם התקדמות
     */
    async function downloadAllFiles(filesList, concurrency = 10) {
      let completed = 0;
      const total = filesList.length;
      const startTime = Date.now();
    
      console.log(`\n⬇️  מתחיל הורדת ${total} קבצים...\n`);
    
      // חלוקה לבאצ'ים להורדה מקבילית מבוקרת
      for (let i = 0; i < filesList.length; i += concurrency) {
        const batch = filesList.slice(i, i + concurrency);
        
        const downloadPromises = batch.map(async (file) => {
          const success = await downloadFile(file.remotePath, file.localPath);
          
          completed++;
          const percentage = Math.floor((completed / total) * 100);
          const elapsed = ((Date.now() - startTime) / 1000).toFixed(0);
          const estimatedTotal = total > 0 ? ((elapsed / completed) * total).toFixed(0) : 0;
          const remaining = estimatedTotal - elapsed;
          
          // עדכון progress bar
          const barLength = 30;
          const filled = Math.floor((completed / total) * barLength);
          const bar = '█'.repeat(filled) + '░'.repeat(barLength - filled);
          
          process.stdout.write(`\r[${completed}/${total}] ${bar} ${percentage}% | ${elapsed}s / ~${estimatedTotal}s`);
          
          return success;
        });
    
        await Promise.all(downloadPromises);
      }
    
      console.log('\n');
      return completed;
    }
    
    /**
     * יצירת קובץ ZIP
     */
    async function createZip(sourceDir, outputPath) {
      return new Promise((resolve, reject) => {
        const output = fs.createWriteStream(outputPath);
        const archive = archiver('zip', {
          zlib: { level: 9 } // דחיסה מקסימלית
        });
    
        output.on('close', () => {
          console.log(`\n📦 קובץ ZIP נוצר: ${outputPath}`);
          console.log(`   גודל: ${(archive.pointer() / 1024 / 1024).toFixed(2)} MB`);
          resolve();
        });
    
        archive.on('error', (err) => {
          reject(err);
        });
    
        archive.pipe(output);
        archive.directory(sourceDir, false);
        archive.finalize();
      });
    }
    
    /**
     * פונקציה ראשית
     */
    async function main() {
      console.log('🚀 מתחיל תהליך גיבוי...\n');
    
      // בדיקת טוקן
      if (TOKEN === 'your-token-here') {
        console.error('❌ שגיאה: לא הוגדר טוקן! הדבק את הטוקן שלך בתחילת הקובץ.');
        process.exit(1);
      }
    
      const startTime = Date.now();
      const startDate = new Date();
      
      // יצירת פורמט תאריך מלא
      const year = startDate.getFullYear();
      const month = String(startDate.getMonth() + 1).padStart(2, '0');
      const day = String(startDate.getDate()).padStart(2, '0');
      const hours = String(startDate.getHours()).padStart(2, '0');
      const minutes = String(startDate.getMinutes()).padStart(2, '0');
      const seconds = String(startDate.getSeconds()).padStart(2, '0');
      const dateTimeStr = `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
    
      try {
        // קבלת פרטי מערכת
        console.log('📋 מקבל פרטי מערכת...');
        const systemInfo = await getSystemInfo();
        const systemNumber = systemInfo.username || 'unknown';
        console.log(`   מערכת: ${systemNumber}`);
        console.log(`   שם: ${systemInfo.name || 'N/A'}\n`);
    
        // יצירת תיקייה זמנית עם אותו שם כמו הקובץ
        const backupName = `backup_${systemNumber}_${dateTimeStr}`;
        const TEMP_DIR = path.join(__dirname, `temp_${backupName}`);
        
        console.log('📁 יוצר תיקייה זמנית...');
        ensureDir(TEMP_DIR);
    
        // שלב 1: סריקה ואיסוף נתיבים
        console.log('🔍 שלב 1: סורק תיקיות ואוסף רשימת קבצים...\n');
        const allFiles = await scanRecursively('ivr2:/', TEMP_DIR);
        
        const totalSize = allFiles.reduce((sum, file) => sum + (file.size || 0), 0);
        const totalSizeMB = (totalSize / 1024 / 1024).toFixed(2);
        
        console.log(`\n✅ סריקה הושלמה!`);
        console.log(`   📊 נמצאו: ${allFiles.length} קבצים`);
        console.log(`   💾 גודל כולל: ${totalSizeMB} MB\n`);
    
        // שלב 2: הורדת קבצים
        console.log('⬇️  שלב 2: מוריד קבצים...');
        const successCount = await downloadAllFiles(allFiles, 10);
        
        console.log(`✅ הורדה הושלמה: ${successCount}/${allFiles.length} קבצים\n`);
    
        // יצירת קובץ ZIP
        const zipPath = path.join(__dirname, `${backupName}.zip`);
        
        console.log('\n📦 יוצר קובץ ZIP...');
        await createZip(TEMP_DIR, zipPath);
    
        // מחיקת תיקייה זמנית
        console.log('🧹 מנקה תיקייה זמנית...');
        removeDir(TEMP_DIR);
    
        const duration = ((Date.now() - startTime) / 1000 / 60).toFixed(2);
        console.log(`\n✅ הגיבוי הושלם בהצלחה!`);
        console.log(`⏱️  זמן כולל: ${duration} דקות`);
        console.log(`📁 קובץ הגיבוי: ${zipPath}`);
    
      } catch (error) {
        console.error('\n❌ שגיאה בתהליך הגיבוי:', error.message);
        
        // ניקוי במקרה של שגיאה
        if (TEMP_DIR) {
          console.log('🧹 מנקה תיקייה זמנית...');
          removeDir(TEMP_DIR);
        }
        
        process.exit(1);
      }
    }
    
    // הרצת התוכנית
    if (require.main === module) {
      main();
    }
    
    

    שים לב שצריך להתקין את הספריות ולכתוב טוקן.

    תכנות

  • סליקת אשראי דרך api
    יהודי טובי יהודי טוב

    @Shmuel754 כתב בסליקת אשראי דרך api:

    לפלא קארד, יש API המאפשר לשלוח מספר כרטיס ותוקף או טוקן.
    https://gateway21.pelecard.biz/SandboxServices?selectedMethodId=62

    אני לא יודע איך הגעת לקישור הזה.
    זה לא הוכחה כי יכול להיות שזה רק למי שיש אישור PCI.

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

    קישור עם מידע שעלה לי עכשיו בגוגל

    תכנות

  • סליקת אשראי דרך api
    יהודי טובי יהודי טוב

    @dovid
    חברות ישראליות:

    טרנזילה.
    credit2000
    נדרים פלוס

    תכנות

  • סליקת אשראי דרך api
    יהודי טובי יהודי טוב

    @dovid כתב בסליקת אשראי דרך api:

    בטח שיש.

    יש לך דוגמא של חברה כזו?

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

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

    תכנות

  • סליקת אשראי דרך api
    יהודי טובי יהודי טוב

    @eido כתב בסליקת אשראי דרך api:

    אני לא רואה מקום לשליחת מספר הכרטיס.

    אין כזה דבר לשלוח מספר כרטיס בAPI (בהנחה ואין לך אישור PCI)

    כל חברות האשראי עובדות בצורה שאתה מטמיע IFRAME שלהם (בצורה כזו או אחרת).
    ושם הלקוח מזין את פרטי התשלום,

    ואז אתה מקבל callback לשרת שלך עם הטוקן ופרטי הלקוח.

    תכנות

  • לוגי שגיאה בnodejs וyemotrouter מה הגורם לקריסה?
    יהודי טובי יהודי טוב

    @eido כתב בלוגי שגיאה בnodejs וyemotrouter מה הגורם לקריסה?:

    הtry/catch הארוך הוא כי עשיתי שינוי על שינוי לטובת הלקוח. אז נשאר כזה ארוך, סתם להבין מה רע בזה?

    1 - בגדול זה שזה ארוך זה לא ממקד אותך בבעיה
    2 - הוא כתב שעדיף בלי, כי אם אתה לא מטפל בשגיאה אז זה נזרק הלאה ויש לו בספריה טיפול בשגיאות.
    אז אתה יכול לטפל שם בשגיאות..

    תכנות

  • מה עונים ללקוחות ששואלים האם אפשר לבנות את מה שאני בונה בAI?
    יהודי טובי יהודי טוב

    @ששא זה לא מדויק.

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

    תכנות

  • הדפסת מעטפות ומכתבי תודה אוטמט מנדרים פלוס
    יהודי טובי יהודי טוב

    @THMV

    לנדרים פלוס יש אפשרות לשלוח callback על כל עיסקה שקורית..

    תוכנה

  • שגיאת ERR_TOO_MANY_REDIRECTS - איך לתקן?
    יהודי טובי יהודי טוב

    @יעקב-מ.-פינס
    עם iframe יכול להיות לך טוב?

    אינטרנט

  • שגיאת ERR_TOO_MANY_REDIRECTS - איך לתקן?
    יהודי טובי יהודי טוב

    @י.פל. כתב בשגיאת ERR_TOO_MANY_REDIRECTS - איך לתקן?:

    אין לי כח וזמן

    דרך ארוכה שהיא קצרה 😉

    אינטרנט

  • שגיאת ERR_TOO_MANY_REDIRECTS - איך לתקן?
    יהודי טובי יהודי טוב

    @י.פל. למה שלא תעשה את זה כסאב דומיין שיפנה ישירות להוסטינגר?

    אינטרנט

  • אבטחת אתר
    יהודי טובי יהודי טוב

    יש לי אתר שבניתי.

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

    מישהו מכיר חברה שנותנת שירות כזה, או משהו כזה?

    אני צריך לבדוק לאורך כל הדרך, בקוד, בשרת ששם זה רץ וכו'.

    רשתות

  • סליקת אשראי שיגיע לחשבון בנק שלי
    יהודי טובי יהודי טוב

    @meir-lamdan כתב בסליקת אשראי שיגיע לחשבון בנק שלי:

    הם ביטלו את זה מזמן

    באתר זה עדיין כתוב:
    https://www.max.co.il/business/pay/max-account

    גומלין - כללי

  • סליקת אשראי שיגיע לחשבון בנק שלי
    יהודי טובי יהודי טוב

    המלצה משמיעה ולא מחוויה אישית.

    בMAX אתה יכול לקבל כרטיס אשראי

    שאתה יכול לסלוק ואתה מקבל את הכסף לכרטיס - מתקזז לך בסוף חודש עם הרכישות שלך.
    ואם אתה מושך לחשבון בנק זה בעמלה של 1.2%.

    גומלין - כללי

  • הקמת IVR בצורה עצמאית
    יהודי טובי יהודי טוב

    @צבי-ש כתב בהקמת IVR בצורה עצמאית:

    5 שקל לקו חודשי

    נכון זה מה שהבנתי, 500 שח לחודש זה לא הרבה, יחסית לתועלת.

    אבל אתה צודק ש:

    @צבי-ש כתב בהקמת IVR בצורה עצמאית:

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

    זה מה שאני עכשיו מנסה לגלגל בראש..
    עזרת לי מאוד..

    אגב בסופו של דבר בנית לבד מרכזיה?

    תכנות

  • הקמת IVR בצורה עצמאית
    יהודי טובי יהודי טוב

    @צבי-ש כתב בהקמת IVR בצורה עצמאית:

    ל100 ערוצי שיחות

    זה אומר 100 שיחות נכנסות בו זמנית בכל הקווים ביחד, נכון?

    @צבי-ש כתב בהקמת IVR בצורה עצמאית:

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

    זה מה שאני עושה גם במערכות ווביות שאני כותב...

    אני מנסה להבין מה יש מעבר לזה..
    אבל אתה צודק שזה בהחלט התעסקות..

    @צבי-ש כתב בהקמת IVR בצורה עצמאית:

    יכול להיות שיצא עם זה או עם זה משהו, אולי זה יסדר אותך, אני לא יודע כל כך

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

    אם זה 5 שח לקו אין לי בעיה לרכוש 100 - חשבתי שזה יותר יקר.

    תכנות

  • הקמת IVR בצורה עצמאית
    יהודי טובי יהודי טוב

    @צבי-ש תודה על התשובה המפורטת.

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

    והאם יש לי עוד התעסקות עם הקווים אחרי הרכישה והפניה לשרת שלי (חוץ מבניית הקו בפועל).

    כרגע יש לי קווים בימות המשיח, שעיקר השימוש שלי בהם הוא שלוחת API להתממשק למערכות שלי.

    ולאחרונה משהו בהם מעצבן אותי...

    אני כל הזמן מקבל מהם "תזכורת" מי בעל הבית,

    ואני מנסה להבין אם זה שווה את המעבר..

    תכנות

  • הקמת IVR בצורה עצמאית
    יהודי טובי יהודי טוב

    הייתי רוצה להקים IVR על שרתים שלי (עם אסטריסק), עם מספרי טלפון שרשומים על שמי - ושהכל יהיה בשליטתי.

    אני מנסה להבין בצורה ראשונית (לא כדי להתחיל לבצע מחר, אלא כדי לחומר למחשבה)..

    1 - איך אני קונה מספרים לשיחות נכנסות מחברות כמו בזק וכדו'
    2 - כמות קווים מחייגים בו זמנית - האם יש הגבלה ואני משלם לבזק לפי ההגבלה שאני רוצה, או שזה ללא הגבלה ותלוי בנתונים של השרת, או שההגבלה היא משותפת בין כל הקווים שלי
    3 - שיחות יוצאות, האם זה גם יכול להיות דרך בזק.
    4 - ולפי מה זה מתומחר?
    5 - והאם אני יכול גם להתחיל עם כמות קטנה של קווים (20).

    אני יודה אם יש מישהו שיכול לענות על זה מנסיון.

    תכנות

  • ריאקט
    יהודי טובי יהודי טוב

    @צדיק-תמים כתב בריאקט:

    אם אף אחת מהן לא מפריעה לך

    האמת שלא,

    הגיוני שזה בגלל שאני לא מודע למשהו יותר טוב,

    אבל אני לא זוכר את עצמי "מתעצבן" על ריאקט שמשהו לא נוח.

    בכל אופן כמו ש @dovid כתב שזה עניין של טעם..

    יש לי דברים שיותר מעניין אותי ללמוד ולדעת מאשר ספרייה נוספת לUI, ואני עדיין לא מגיע לזה..
    (לדוגמא, להפעיל לבד מרכזיה ב Asterisk ולא להיות תלוי בגחמות של ימות המשיח)

    תכנות
  • 1
  • 2
  • 3
  • 4
  • 5
  • 30
  • 31
  • 1 / 31
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום