חיפוש קובץ במערכת
-
@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. -
@צדיק-תמים אמר בחיפוש קובץ במערכת:
@Liy אמר בחיפוש קובץ במערכת:
(זה הרבה יותא מאובטח עם הטוקן)
אין הבדל
ממש לא!
אם מישהו יעבור על התעבורה שלך הוא יראה רשימת כתובות URL שבקרת בהם או ששלחת אליהם בקשות, ז״א שהוא יראה גם URL של ה API של ימות עם הטוקן של המערכת שלך.
לעומת זאת POST הוא יראה URL והוא לא יראה את ה payload. -
@צדיק-תמים אמר בחיפוש קובץ במערכת:
מלבד זאת הקוד הזה לא נכתב כל כך עבור דפדפן אלא עבור node, וממש אין סיבה שמישהו יוכל לפענח את התעבורה של השרת שלך
אני עובד עם Front-End בלבד, סורי.
-
@Liy איך מישהו יעבור על התעבורה?
-
@Liy בגדול אם הלקוח (משתמש הקצה באתר) לא מקפיד על אבטחה ואפשר לעבור לו על התעבורה, זה בעיה שלו, והוא בצרה הרבה יותר גדולה מאשר טוקנים של ימות המשיח, אלא גם סיסמאות באתרים, ובעצם כל מידע שעובר מ/אל המחשב שלו
ובגדול בדיוק בשביל זה נועד HTTPS -
@צדיק-תמים
הקוד שלך מאלף!!
אז תתקן לי את מה שטעיתי בו:<script> const axios = require('axios'); axios.defaults.baseURL = 'https://www.call2all.co.il/ym/api/'; const YEMOT_NUMBER = '077400300'; 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; } </script>
תודה רבה!!
מתנצל על השאילה