חיפוש קובץ במערכת
-
@פיסטוק-פרווה אמר בחיפוש קובץ במערכת:
גם לולאה לא תעזור כי אתה לא יכול לדעת כמה שלוחות יש ולכן לא תוכל לדעת כמה לולאות לעשות...
לולאה רקורסיבית...
-
@צדיק-תמים
מה זה בדיוק? תן קישור למדריך... -
@פיסטוק-פרווה אמר בחיפוש קובץ במערכת:
גם לולאה לא תעזור כי אתה לא יכול לדעת כמה שלוחות יש ולכן לא תוכל לדעת כמה לולאות לעשות...
אם היית באמת יודע תיכנות היית יודע כמה.
-
@nyh אין דרך לדעת מראש, הדרך לעשות זאת עם רקרוסיביה (פונקציה שקוראת לעצמה בתנאי מסוים), או עם while עם תנאי עצירה מתאים.
המימוש בפועל שונה בכל שפה, וכיוון שכנראה השפה ש @פיסטוק-פרווה יודע היא רק PHP, אין לי אין לעזור עם דוגמה. -
@צדיק-תמים אמר בחיפוש קובץ במערכת:
וכיוון שכנראה השפה ש @פיסטוק-פרווה יודע היא רק PHP, אין לי אין לעזור עם דוגמה.
מי ששאל את השאלה זה אני...
JavaScript הכי טוב לי. -
@eliyahu אמר בחיפוש קובץ במערכת:
@Liy אמר בחיפוש קובץ במערכת:
יש אפשרות לחפש קובץ בכל המערכת?
@eliyahuמה יהיה עם התיוגים האלה?
פתחתי עוד 2 פוסטים ואין מענה מהיר כמו אם הייתי מתייג אותך...
https://f2.freeivr.co.il/topic/9305/מה-ההבדל-בין-העלאת-והורדת-קבצי-שמע-לקמפיין-ל-ניהול-קבצי-קמפיין
-
@פיסטוק-פרווה אמר בחיפוש קובץ במערכת:
בינתיים אין כזה דבר...
רק אם יהיה api של הצגת כל הקבצים במערכת
גם לולאה לא תעזור כי אתה לא יכול לדעת כמה שלוחות יש ולכן לא תוכל לדעת כמה לולאות לעשות...
מקווה שימות יפתחו ב api של GetIVR2Dir את האפשרות להצגת כל הקבצים בכל השלוחות יחד...אתה הולך לשלוחה הראשית,
מקבל את הרשימה של הקבצים, ואז שומר אותם, ועושה עוד בקשה לתוך כל אחד מהשלוחות,
קצת בעייתי לחשבן את זה,
אבל אפשרי בהחלט. -
@MGM-IVR
צריך לולאה מסוימת בשביל זה... -
@Liy
גם לי... -
@Liy @פיסטוק-פרווה מימשתי משהו בשביל האתגר
בעז"ה במוצ"ש נעלה לכאן -
@צדיק-תמים אמר בחיפוש קובץ במערכת:
@Liy @פיסטוק-פרווה מימשתי משהו בשביל האתגר
בעז"ה במוצ"ש נעלה לכאןמחכים...
-
-
קבלת רשימת קבצים בתקיה (או תקיות)
const axios = require('axios'); axios.defaults.baseURL = 'https://www.call2all.co.il/ym/api/'; const YEMOT_NUMBER = '0773130000'; const YEMOT_PASSWORD = '123456'; /** * @return {String} - The token */ async function getToken() { const response = await axios.post('Login', { username: YEMOT_NUMBER, password: YEMOT_PASSWORD, }); return response.data.token; } /** * @param {String} token - Yemot token * @param {String} path - folder path * @return {Promise<object>} - folder data */ async function getFolder(path, token) { let response; response = await axios.get('GetIVR2Dir', { params: { token, path } }); const { data } = response; if (data.responseStatus !== 'OK') throw new Error('Yemot error: ' + data.message); return data; } /** * * @param {Array|String} begin - Folder(s) to start from * @param {Array} exclusionsWords - Words to exclude folders that contain them * @param {String} token - Yemot token * @returns */ async function getLists(begin, exclusionsWords, token = `${YEMOT_NUMBER}:${YEMOT_PASSWORD}`) { const lists = { files: [], dirs: [], ini: [] }; let nextFolders = Array.from(begin); while (nextFolders.length) { const promises = nextFolders.map((path) => { return getFolder(path, token); }); const responses = await Promise.all(promises); let localNextFolders = []; responses.forEach((folder) => { lists.files.push(...folder.files); lists.dirs.push(...folder.dirs); lists.ini.push(...folder.ini); const exclusionsRegex = new RegExp(exclusionsWords.join('|'), 'g'); const nextFoldersFiltered = folder.dirs.filter((dir) => !exclusionsRegex.test(dir.name)).map((path) => path.what); localNextFolders = [...localNextFolders, ...nextFoldersFiltered]; }); nextFolders = localNextFolders; } return lists; }
דוגמה למימוש - קבלת רשימת הקבצים מתקיות: 1, 2, הדפסת כמות התקיות, כמות קבצים, וכמות קבצי ini, ובנוסף הדפסה של רשימת נתיבי הקבצים ממוינים לפי הנתיב:
(async () => { const token = await getToken(); const lists = await getLists(['1', '2'], ['Log', 'Trash'], token); for (const listName in lists) { if (Object.hasOwnProperty.call(lists, listName)) { console.log(`${listName} count: ${lists[listName].length}`); } } console.log(lists.files.map((file) => file.what).sort()); })();
כמובן שניתן
- לסרוק תקיה אחת, כולל למשל את הראשי
- לא להחריג את תקיות לוג וסל מחזור
לא רואה סיבה לא להשתמש בטוקן אלא במספר מערכת וסיסמה, אבל אם לא מעבירים ארגומנט טוקן לפונקציה getLists היא משתמש במספר:סיסמה.
מימשתי את זה עם לולאה ולא עם רקורסיביה, אבל זה כמובן שולח בכל פעם את כל הבקשות במקביל, ואז שולח שוב לתתי-תקיות וכן הלאה, ולא בקשה אחת בכל פעם, וכך זה מהיר יותר, צ"ע אם בצורה של שליחת כמה שיותר בקשות בבת אחת וטיפול בכל אחת שמסתיימת, זה היה יותר מהיר משמעותית אם בכלל.
-
@צדיק-תמים אמר בחיפוש קובץ במערכת:
קבלת רשימת קבצים בתקיה (או תקיות)
const axios = require('axios'); axios.defaults.baseURL = 'https://www.call2all.co.il/ym/api/'; const YEMOT_NUMBER = '0773130000'; const YEMOT_PASSWORD = '123456'; /** * @return {String} - The token */ async function getToken() { const response = await axios.post('Login', { username: YEMOT_NUMBER, password: YEMOT_PASSWORD, }); return response.data.token; } /** * @param {String} token - Yemot token * @param {String} path - folder path * @return {Promise<object>} - folder data */ async function getFolder(path, token) { let response; response = await axios.get('GetIVR2Dir', { params: { token, path } }); const { data } = response; if (data.responseStatus !== 'OK') throw new Error('Yemot error: ' + data.message); return data; } /** * * @param {Array|String} begin - Folder(s) to start from * @param {Array} exclusionsWords - Words to exclude folders that contain them * @param {String} token - Yemot token * @returns */ async function getLists(begin, exclusionsWords, token = `${YEMOT_NUMBER}:${YEMOT_PASSWORD}`) { const lists = { files: [], dirs: [], ini: [] }; let nextFolders = Array.from(begin); while (nextFolders.length) { const promises = nextFolders.map((path) => { return getFolder(path, token); }); const responses = await Promise.all(promises); let localNextFolders = []; responses.forEach((folder) => { lists.files.push(...folder.files); lists.dirs.push(...folder.dirs); lists.ini.push(...folder.ini); const exclusionsRegex = new RegExp(exclusionsWords.join('|'), 'g'); const nextFoldersFiltered = folder.dirs.filter((dir) => !exclusionsRegex.test(dir.name)).map((path) => path.what); localNextFolders = [...localNextFolders, ...nextFoldersFiltered]; }); nextFolders = localNextFolders; } return lists; }
דוגמה למימוש - קבלת רשימת הקבצים מתקיות: 1, 2, הדפסת כמות התקיות, כמות קבצים, וכמות קבצי ini, ובנוסף הדפסה של רשימת נתיבי הקבצים ממוינים לפי הנתיב:
(async () => { const token = await getToken(); const lists = await getLists(['1', '2'], ['Log', 'Trash'], token); for (const listName in lists) { if (Object.hasOwnProperty.call(lists, listName)) { console.log(`${listName} count: ${lists[listName].length}`); } } console.log(lists.files.map((file) => file.what).sort()); })();
כמובן שניתן
- לסרוק תקיה אחת, כולל למשל את הראשי
- לא להחריג את תקיות לוג וסל מחזור
לא רואה סיבה לא להשתמש בטוקן אלא במספר מערכת וסיסמה, אבל אם לא מעבירים ארגומנט טוקן לפונקציה getLists היא משתמש במספר:סיסמה.
מימשתי את זה עם לולאה ולא עם רקורסיביה, אבל זה כמובן שולח בכל פעם את כל הבקשות במקביל, ואז שולח שוב לתתי-תקיות וכן הלאה, ולא בקשה אחת בכל פעם, וכך זה מהיר יותר, צ"ע אם בצורה של שליחת כמה שיותר בקשות בבת אחת וטיפול בכל אחת שמסתיימת, זה היה יותר מהיר משמעותית אם בכלל.
הרעיון חמוד, במעבר מהיר על הקוד, הוא יכל להכתב קצת יותר קצת ומובן (סתם להערה כמובן).
-
@Liy אמר בחיפוש קובץ במערכת:
במעבר מהיר על הקוד, הוא יכל להכתב קצת יותר קצת ומובן (סתם להערה כמובן).
פרט באר נמק
אחרת אין למשפט הזה שום תועלת -
@צדיק-תמים אמר בחיפוש קובץ במערכת:
@Liy אמר בחיפוש קובץ במערכת:
במעבר מהיר על הקוד, הוא יכל להכתב קצת יותר קצת ומובן (סתם להערה כמובן).
פרט באר נמק
אחרת אין למשפט הזה שום תועלתאם היה לי זמן הייתי כותב אותו מחדש להמחשה...
אבל סתם בקצרה:let response; response = await axios.get('GetIVR2Dir', { params: { token, path } });
מספיק לכתוב:
const body = { token: token, path: "/"} let response = await axios.get('GetIVR2Dir', body);
זה יותר נכון וברור...
סתם דוגמא קטנה (ח״ו לא בא להוריד מהערך של מה שכתבת!). -
@Liy אתה צודק חלקית,
לגבי זה שאין צורך להגדיר בנפרד את response אתה צודק, הסיבה היא שעשיתי בהתחלה trycatch כדי שאם יש שגיאה יתקבל רק ההודעה ולא כל אובייקט השגיאה, ואם כן צריך להגדיר את המשתנה מחוץ לסקופ כדי שיהיה אליו גישה מבחוץ, אח"כ מחקתי את זה ושחכתי לבטל את זה.
מה עוד?
אבל אתה לא צודק לגבי התחביר, אי אפשר לשלוח לאקסיוס בבקשת get פרמטר שני של הפרמטרים, אלא צריך לשלוח null ואז את האובייקט פרמטרים, כנראה אתה רגיל לשלוח בקשות פוסט...
דוגמה: https://runkit.com/embed/otvs4r6iat52
שים לב שהשגיאה היא לא שם משתמש/סיסמה שגוי, אלא שכלל לא סופק שם משתמש וסיסמה, כלומר שהפרמטרים לא נשלחים כלל
למעשה ככה הייתי כותב את זהasync function getFolder(path, token) { const { data } = await axios.get('GetIVR2Dir', { params: { token, path } }); if (data.responseStatus !== 'OK') throw new Error('Yemot error: ' + data.message); return data; }
-
@צדיק-תמים לא שמתי לב לעוד משהו חריג..
-
@צדיק-תמים אמר בחיפוש קובץ במערכת:
אבל אתה לא צודק לגבי התחביר, אי אפשר לשלוח בבקשת get פרמטר שני של הפרמטרים, אלא צריך לשלוח null ואז את האובייקט פרמטרים, כנראה אתה רגיל לשלוח בקשות פוסט...
צודק, לא שמתי לב שזה GET אני עובד בד״כ עם POST (זה הרבה יותא מאובטח עם הטוקן)
-
@Liy אמר בחיפוש קובץ במערכת:
(זה הרבה יותא מאובטח עם הטוקן)
אין הבדל
אם מישהו פותח את התעבורה הוא יכול לראות גם את הbody
ואם לא אין לו דרך לראות גם את הכתובת
ובאופן עקרוני לכך נועד HTTPS
מלבד זאת הקוד הזה לא נכתב כל כך עבור דפדפן אלא עבור node, וממש אין סיבה שמישהו יוכל לפענח את התעבורה של השרת שלך
נ.ב. המוסכמה היא באופן כללי להשתמש בGET לקבלת נתונים ולא בPOST, אמנם באופן כללי ימות לא כ"כ מקפידים על כאלה דברים, אבל איפה שזה אפשרי בקוד אני משתמש בזה. ואכן להפעלת צינתוק לדוגמה, אני ישתמש בPOST.