חיפוש קובץ במערכת
-
קבלת רשימת קבצים בתקיה (או תקיות)
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>
תודה רבה!!
מתנצל על השאילה -
@צדיק-תמים אמר בחיפוש קובץ במערכת:
@Liy בגדול אם הלקוח (משתמש הקצה באתר) לא מקפיד על אבטחה ואפשר לעבור לו על התעבורה, זה בעיה שלו, והוא בצרה הרבה יותר גדולה מאשר טוקנים של ימות המשיח, אלא גם סיסמאות באתרים, ובעצם כל מידע שעובר מ/אל המחשב שלו
ובגדול בדיוק בשביל זה נועד HTTPSגם יכול להיות שזה כמה אנשים באותו בניין משרדים, שלאחד מהם חשקה נפשו לעבור על התעבורה של הרשת במשרד וכו׳
-
@צדיק-תמים אמר בחיפוש קובץ במערכת:
@nyh אין דרך לדעת מראש, הדרך לעשות זאת עם רקרוסיביה (פונקציה שקוראת לעצמה בתנאי מסוים), או עם while עם תנאי עצירה מתאים.
המימוש בפועל שונה בכל שפה, וכיוון שכנראה השפה ש @פיסטוק-פרווה יודע היא רק PHP, אין לי אין לעזור עם דוגמה.כאן יש לך בphp איך לעשות רקורסיה
-
@Liy שוב, במקרה שיש גישה לתעבורה, יש גישה להכל. אם לא, אין גישה גם לכתובות.
@פיסטוק-פרווה לא ייבאת את הספריה axios (כנראה), ולא קראת בכלל לפונקציה...
אגב הקוד הזה כנראה יפעל יותר טוב בNode.js בגלל מגבלת ה-6 בקשות לאותו אתר במקביל של כרום, שלא קיימת בנוד כמוב -
מישהו יכול לתת קוד של רקוסייה ב php / js למקרה הזה?
-
-
@פיסטוק-פרווה אמר בחיפוש קובץ במערכת:
מישהו יכול לתת קוד של רקוסייה ב php / js למקרה הזה?
מה רע במה שהבאתי?!
-
@צדיק-תמים
אני לא עובד עם ספריות.
אני מעדיף קוד בריא...