שיתוף סקריפט nodejs להורדת אקסל תנועות עו"ש מבנק דיסקונט משנים קודמים באמצעות התיבה האישית
-
הייתי צריך כעת לשחזר נתונים מחשבון של קרוב המתנהל בבנק דיסקונט של משכנתא ששולמה בעבר והעברות שבוצעו לכיסוי המשכנתא.
בתנועות אחרונות ניתן לייצא (נכון לעכשיו, בבנק דיסקונט) עד שנה אחורה.
(יש שירות בדיסקונט של שיחזור דפי חשבון ישנים בצורת HTML אבל גם זה מוגבל ל3 שנים וניתן לייצא עד 17 דפים בבקשה אחת וצריך לסנן תאריכים ולשלם עמלה לכל בקשה ועדיין להשתגע להמיר את ה HTML לאקסל וכו'. קיצר לא לעניין).
מצאתי שבתיבה האישית קיימים הנתונים כדפי חשבון (בחשבון המבוקש היו לי למפרע מ 05/2016, אין לי מושג במה זה תלוי, אבל לי זה הספיק) אך הם מופיעים כדפי חשבון ומפוזרים בין המכתבים ולא שייך לסנן אותם וכו'.
ראיתי שזה מבוסס API שמקבל בשלב ראשון את רשימת המכתבים ובשלב שני API לקבל כל מכתב כמערך של השורות וכו'.
יצרתי לעצמי סקריפט שמסנן את המכתבים רק של דפי חשבון, שולף רק את השורות של התנועות, מצליב את השנה מהכותרת לתאריך (ללא השנה) בשורה, מצליב 2/3 שורות של פירוט תנועה בודדת לשורה אחת, ויוצר מהם קובץ אקסל.
בסקריפט צריך להזין ס"ה 2 נתונים, מספר החשבון ועוגיות הזדהות, וכמובן להריץ nodejs על המחשב/שרת.
לשימוש בסקריפט יש להזדהות באתר של דיסקונט עם הפרטים, ולאחר מכן יש ללחוץ על F12 ואח"כ ללחוץ על הלחצן של תיבת הדואר הפנימי בחשבון
כעת יופיע לנו ב network/רשת התחברות לAPI המבוקש
ניתן לסנן בקלות "mailQuery" ולראות את השורה.
נלחץ על השורה ובכותרת הבקשה נחפש את הקוקיז ונעתיק אותו
יש להדביק אותו בסקריפט (למותר לציין שזה רץ רק אצלכם במחשב והעוגיות לא עוברות לשרת אחר)
כמו"כ יש להעתיק את מספר החשבון כפי שהוא מופיע בכותרות ולהדביק בסקריפט במיקום המבוקש
וזהו נותר רק להריץ אץ הסקריפט ובסיומו יש לנו אקסל מסודר להפליא עם היסטוריית תנועות ישנות.
בתקוה שהקוד יביא תועלת למישהו.
שימו לב השתמשתי בקוד ב 3 ספריות חיצונית: node-fetch, moment, json2xls.
השימוש בסקריפט הינו על אחריות המשתמש בלבד ואיני נושא בשום נזק שיגרם חלילה על ידי השימוש בו.
(לי זה עבד ללא בעיות).
להלן הקודlet fetch = require('node-fetch'); let fs = require('fs'); const moment = require('moment'); const json2xls = require('json2xls'); // כאן יש להדביק את מספר החשבון let accountNumber = "0012300000"; // כאן יש להדביק את הקוקיז let cookie = "PD_STATEFUL_fadfads......."; let MessagesList = []; let MessageID = ''; let pgnToDate = ""; let pgnSubjectID = ""; let pgnYear = 0; let pgnVer = 0; let pgnNum = 0; let MessagesData = []; let months = ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"]; let lines = []; (async () => { let next = true; while (next) { let body = { "AccountNumber": accountNumber, "ListOrContentFlag": "listnotjoined", "StatusFilter": "U", "FromDate": "", "ToDate": "", "NumberOfBackDays": 3 }; if (MessageID) { body = { "AccountNumber": accountNumber, "ListOrContentFlag": "listnotjoined", "StatusFilter": "U", "FromDate": "", "ToDate": "", "NumberOfBackDays": 3, "MessageID": MessageID, "PgnToDate": pgnToDate, "PgnSubjectID": pgnSubjectID, "PgnYear": pgnYear, "PgnVer": pgnVer, "PgnNum": pgnNum } } // console.log(body); await fetch("https://start.telebank.co.il/Titan/gatewayAPI/discountMail/mailQuery", { "headers": { "content-type": "application/json;charset=UTF-8", "cookie": cookie, }, "body": JSON.stringify(body), "method": "POST" }).then(res => res.json()).then(MailQuery => { if (MailQuery.MailQuery && MailQuery.MailQuery.PaginationBlock) { MessageID = MailQuery.MailQuery.PaginationBlock.PaginationMessageID; pgnToDate = MailQuery.MailQuery.PaginationBlock.PaginationMessageCreationDate; pgnSubjectID = MailQuery.MailQuery.PaginationBlock.PaginationMessageSubject; pgnYear = MailQuery.MailQuery.PaginationBlock.PaginationMessageYear; pgnVer = MailQuery.MailQuery.PaginationBlock.PaginationMessageVersion; pgnNum = MailQuery.MailQuery.PaginationBlock.PaginationPageNumber; next = true; } else { next = false; } try { if (MailQuery.MailQuery.MessageInfo){ MessagesList.push(...MailQuery.MailQuery.MessageInfo) } } catch (e) { console.log(e); } }).catch(console.error); } // console.log(MessagesList); for (let i = 0; i < MessagesList.length; i++) { let message = MessagesList[i]; if (message.SubjectID === 'COH012') { console.log('MessageIDNumber: ' + message.MessageIDNumber, 'index: ' + i, 'from: ' + MessagesList.length); await fetch("https://start.telebank.co.il/Titan/gatewayAPI/discountMail/mailQuery", { "headers": { "content-type": "application/json;charset=UTF-8", "cookie": cookie, }, "body": "{\"ListOrContentFlag\":\"content\",\"AccountNumber\":\"0096343062\",\"MessageIdForDetails\":\"" + message.MessageIDNumber + "\"}", "method": "POST" }).then(res => res.json()).then(MailQuery => { try { let LineInfoEntry = MailQuery.MailQuery.MessageInfo[0].PageInfoBlock.PageInfoEntry[0].LineInfoBlock.LineInfoEntry; if (LineInfoEntry){ console.log('ok'); MessagesData.push(...LineInfoEntry) let month = LineInfoEntry[3].LineTextMessage.slice(1).match(months.join("|"))[0]; let start = 1 + month.length + 1; let year = LineInfoEntry[3].LineTextMessage.substr(start, 4); LineInfoEntry = LineInfoEntry.slice(4); for (let i in LineInfoEntry){ let row = LineInfoEntry[i]; if (/^ \d/.test(row.LineTextMessage)){ let i = 1; let obj = {}; obj['תאריך'] = moment(row.LineTextMessage.substr(i, 5) + '/' + year, 'DD/MM/YYYY').format('YYYY-MM-DD');i++; i = i + 5; obj['תאריך ערך'] = row.LineTextMessage.substr(i, 1) !== ' ' ? moment(row.LineTextMessage.substr(i, 5) + '/' + year, 'DD/MM/YYYY').format('YYYY-MM-DD') : '';i++; i = i + 5; obj['סוג'] = row.LineTextMessage.substr(i, 1);i++; i = i + 1; obj['תיאור'] = row.LineTextMessage.substr(i, 31);i++; i = i + 31; obj['אסמכתא'] = row.LineTextMessage.substr(i, 10);i++; i = i + 10; obj['זכות'] = parseFloat(row.LineTextMessage.substr(i, 10).replace(',', '').trim());i++; i = i + 10; if (isNaN(obj['זכות'])){ obj['זכות'] = ''; } obj['חובה'] = parseFloat(row.LineTextMessage.substr(i, 10).replace(',', '').trim());i++; i = i + 10; if (isNaN(obj['חובה'])){ obj['חובה'] = ''; } obj['יתרה'] = parseFloat(row.LineTextMessage.substr(i, 10).replace(',', '').trim());i++; i = i + 10; if (isNaN(obj['יתרה'])){ obj['יתרה'] = ''; } obj['תוכן'] = row.LineTextMessage; lines.push(obj); } else if (row.LineTextMessage.slice(1).match(months.join("|"))){ month = row.LineTextMessage.slice(1).match(months.join("|"))[0]; year = row.LineTextMessage.substr(1 + month.length + 1, 4); } else if (/^\s{15}\S/.test(row.LineTextMessage)){ lines[lines.length - 1]['תיאור'] += row.LineTextMessage.slice(15, 31); if (row.LineTextMessage.slice(81, 10) !== ''){ lines[lines.length - 1]['יתרה'] += row.LineTextMessage.slice(81, 10); } lines[lines.length - 1]['תוכן'] += '|' + row.LineTextMessage; }else if (/^\s{75}\S/.test(row.LineTextMessage)) { lines[lines.length - 1]['אסמכתא'] += row.LineTextMessage.substr(75, 10); if (row.LineTextMessage.slice(81, 10) !== ''){ lines[lines.length - 1]['יתרה'] += row.LineTextMessage.slice(81, 10); } lines[lines.length - 1]['תוכן'] += '|' + row.LineTextMessage; } } } } catch (e) { console.log(e); } }).catch(console.error); } } console.log(lines); fs.writeFileSync('./MessagesData ' + moment().unix() + '.json', JSON.stringify(MessagesData)); fs.writeFileSync('./lines ' + moment().unix() + '.json', JSON.stringify(lines)); let excel = json2xls(lines); fs.writeFileSync('./lines ' + moment().unix() + '.xlsx', excel, 'binary'); })();
-
@חוקר אמר בשיתוף סקריפט nodejs להורדת אקסל תנועות עו"ש מבנק דיסקונט משנים קודמים באמצעות התיבה האישית:
השימוש בסקריפט אינו על אחריות המשתמש בלבד
כנראה התכוונת לכתוב "הינו" על אחריות המשתמש...
-
@לעזור-לכולם אמר בשיתוף סקריפט nodejs להורדת אקסל תנועות עו"ש מבנק דיסקונט משנים קודמים באמצעות התיבה האישית:
כנראה התכוונת לכתוב "הינו" על אחריות המשתמש...
תודה
תיקנתי -
אם מישהו הספיק להעתיק את הקוד
שימו לב לשינוי, ערכתי והחלפתי מparseInt
לparseFloat
בגלל שזה השמיט את האגורות, כעת מתוקן ותקין ב"ה.
אני אמנם עבדתי זמן מה להבין את הAPI של דיסקונט ובעיקר להבין את מבנה התוכן המתקבל, אך בסופו של יום קבלת הנתונים בצורת אקסל סייעו לי מאוד.
הייתי צריך לחשב 2 משכנתאות והעברות שהיו נגד המשכנתאות ולהצליב את הנתונים, זה היה תענוג לחפש באקסל בקלות את התנועות ולבדוק את ההפרשים, בהחלט אשמח מאוד אם זה יביא למישהו תועלת ויחסוך לו לחפור ולהעתיק או להזין ידנית. -
@חוקר כתב בשיתוף סקריפט nodejs להורדת אקסל תנועות עו"ש מבנק דיסקונט משנים קודמים באמצעות התיבה האישית:
הייתי צריך כעת לשחזר נתונים מחשבון של קרוב המתנהל בבנק דיסקונט של משכנתא ששולמה בעבר והעברות שבוצעו לכיסוי המשכנתא.
בתנועות אחרונות ניתן לייצא (נכון לעכשיו, בבנק דיסקונט) עד שנה אחורה.
(יש שירות בדיסקונט של שיחזור דפי חשבון ישנים בצורת HTML אבל גם זה מוגבל ל3 שנים וניתן לייצא עד 17 דפים בבקשה אחת וצריך לסנן תאריכים ולשלם עמלה לכל בקשה ועדיין להשתגע להמיר את ה HTML לאקסל וכו'. קיצר לא לעניין).
מצאתי שבתיבה האישית קיימים הנתונים כדפי חשבון (בחשבון המבוקש היו לי למפרע מ 05/2016, אין לי מושג במה זה תלוי, אבל לי זה הספיק) אך הם מופיעים כדפי חשבון ומפוזרים בין המכתבים ולא שייך לסנן אותם וכו'.
ראיתי שזה מבוסס API שמקבל בשלב ראשון את רשימת המכתבים ובשלב שני API לקבל כל מכתב כמערך של השורות וכו'.
יצרתי לעצמי סקריפט שמסנן את המכתבים רק של דפי חשבון, שולף רק את השורות של התנועות, מצליב את השנה מהכותרת לתאריך (ללא השנה) בשורה, מצליב 2/3 שורות של פירוט תנועה בודדת לשורה אחת, ויוצר מהם קובץ אקסל.
בסקריפט צריך להזין ס"ה 2 נתונים, מספר החשבון ועוגיות הזדהות, וכמובן להריץ nodejs על המחשב/שרת.
לשימוש בסקריפט יש להזדהות באתר של דיסקונט עם הפרטים, ולאחר מכן יש ללחוץ על F12 ואח"כ ללחוץ על הלחצן של תיבת הדואר הפנימי בחשבון
כעת יופיע לנו ב network/רשת התחברות לAPI המבוקש
ניתן לסנן בקלות "mailQuery" ולראות את השורה.
נלחץ על השורה ובכותרת הבקשה נחפש את הקוקיז ונעתיק אותו
יש להדביק אותו בסקריפט (למותר לציין שזה רץ רק אצלכם במחשב והעוגיות לא עוברות לשרת אחר)
כמו"כ יש להעתיק את מספר החשבון כפי שהוא מופיע בכותרות ולהדביק בסקריפט במיקום המבוקש
וזהו נותר רק להריץ אץ הסקריפט ובסיומו יש לנו אקסל מסודר להפליא עם היסטוריית תנועות ישנות.
בתקוה שהקוד יביא תועלת למישהו.
שימו לב השתמשתי בקוד ב 3 ספריות חיצונית: node-fetch, moment, json2xls.
השימוש בסקריפט הינו על אחריות המשתמש בלבד ואיני נושא בשום נזק שיגרם חלילה על ידי השימוש בו.
(לי זה עבד ללא בעיות).
להלן הקודlet fetch = require('node-fetch'); let fs = require('fs'); const moment = require('moment'); const json2xls = require('json2xls'); // כאן יש להדביק את מספר החשבון let accountNumber = "0012300000"; // כאן יש להדביק את הקוקיז let cookie = "PD_STATEFUL_fadfads......."; let MessagesList = []; let MessageID = ''; let pgnToDate = ""; let pgnSubjectID = ""; let pgnYear = 0; let pgnVer = 0; let pgnNum = 0; let MessagesData = []; let months = ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"]; let lines = []; (async () => { let next = true; while (next) { let body = { "AccountNumber": accountNumber, "ListOrContentFlag": "listnotjoined", "StatusFilter": "U", "FromDate": "", "ToDate": "", "NumberOfBackDays": 3 }; if (MessageID) { body = { "AccountNumber": accountNumber, "ListOrContentFlag": "listnotjoined", "StatusFilter": "U", "FromDate": "", "ToDate": "", "NumberOfBackDays": 3, "MessageID": MessageID, "PgnToDate": pgnToDate, "PgnSubjectID": pgnSubjectID, "PgnYear": pgnYear, "PgnVer": pgnVer, "PgnNum": pgnNum } } // console.log(body); await fetch("https://start.telebank.co.il/Titan/gatewayAPI/discountMail/mailQuery", { "headers": { "content-type": "application/json;charset=UTF-8", "cookie": cookie, }, "body": JSON.stringify(body), "method": "POST" }).then(res => res.json()).then(MailQuery => { if (MailQuery.MailQuery && MailQuery.MailQuery.PaginationBlock) { MessageID = MailQuery.MailQuery.PaginationBlock.PaginationMessageID; pgnToDate = MailQuery.MailQuery.PaginationBlock.PaginationMessageCreationDate; pgnSubjectID = MailQuery.MailQuery.PaginationBlock.PaginationMessageSubject; pgnYear = MailQuery.MailQuery.PaginationBlock.PaginationMessageYear; pgnVer = MailQuery.MailQuery.PaginationBlock.PaginationMessageVersion; pgnNum = MailQuery.MailQuery.PaginationBlock.PaginationPageNumber; next = true; } else { next = false; } try { if (MailQuery.MailQuery.MessageInfo){ MessagesList.push(...MailQuery.MailQuery.MessageInfo) } } catch (e) { console.log(e); } }).catch(console.error); } // console.log(MessagesList); for (let i = 0; i < MessagesList.length; i++) { let message = MessagesList[i]; if (message.SubjectID === 'COH012') { console.log('MessageIDNumber: ' + message.MessageIDNumber, 'index: ' + i, 'from: ' + MessagesList.length); await fetch("https://start.telebank.co.il/Titan/gatewayAPI/discountMail/mailQuery", { "headers": { "content-type": "application/json;charset=UTF-8", "cookie": cookie, }, "body": "{\"ListOrContentFlag\":\"content\",\"AccountNumber\":\"0096343062\",\"MessageIdForDetails\":\"" + message.MessageIDNumber + "\"}", "method": "POST" }).then(res => res.json()).then(MailQuery => { try { let LineInfoEntry = MailQuery.MailQuery.MessageInfo[0].PageInfoBlock.PageInfoEntry[0].LineInfoBlock.LineInfoEntry; if (LineInfoEntry){ console.log('ok'); MessagesData.push(...LineInfoEntry) let month = LineInfoEntry[3].LineTextMessage.slice(1).match(months.join("|"))[0]; let start = 1 + month.length + 1; let year = LineInfoEntry[3].LineTextMessage.substr(start, 4); LineInfoEntry = LineInfoEntry.slice(4); for (let i in LineInfoEntry){ let row = LineInfoEntry[i]; if (/^ \d/.test(row.LineTextMessage)){ let i = 1; let obj = {}; obj['תאריך'] = moment(row.LineTextMessage.substr(i, 5) + '/' + year, 'DD/MM/YYYY').format('YYYY-MM-DD');i++; i = i + 5; obj['תאריך ערך'] = row.LineTextMessage.substr(i, 1) !== ' ' ? moment(row.LineTextMessage.substr(i, 5) + '/' + year, 'DD/MM/YYYY').format('YYYY-MM-DD') : '';i++; i = i + 5; obj['סוג'] = row.LineTextMessage.substr(i, 1);i++; i = i + 1; obj['תיאור'] = row.LineTextMessage.substr(i, 31);i++; i = i + 31; obj['אסמכתא'] = row.LineTextMessage.substr(i, 10);i++; i = i + 10; obj['זכות'] = parseFloat(row.LineTextMessage.substr(i, 10).replace(',', '').trim());i++; i = i + 10; if (isNaN(obj['זכות'])){ obj['זכות'] = ''; } obj['חובה'] = parseFloat(row.LineTextMessage.substr(i, 10).replace(',', '').trim());i++; i = i + 10; if (isNaN(obj['חובה'])){ obj['חובה'] = ''; } obj['יתרה'] = parseFloat(row.LineTextMessage.substr(i, 10).replace(',', '').trim());i++; i = i + 10; if (isNaN(obj['יתרה'])){ obj['יתרה'] = ''; } obj['תוכן'] = row.LineTextMessage; lines.push(obj); } else if (row.LineTextMessage.slice(1).match(months.join("|"))){ month = row.LineTextMessage.slice(1).match(months.join("|"))[0]; year = row.LineTextMessage.substr(1 + month.length + 1, 4); } else if (/^\s{15}\S/.test(row.LineTextMessage)){ lines[lines.length - 1]['תיאור'] += row.LineTextMessage.slice(15, 31); if (row.LineTextMessage.slice(81, 10) !== ''){ lines[lines.length - 1]['יתרה'] += row.LineTextMessage.slice(81, 10); } lines[lines.length - 1]['תוכן'] += '|' + row.LineTextMessage; }else if (/^\s{75}\S/.test(row.LineTextMessage)) { lines[lines.length - 1]['אסמכתא'] += row.LineTextMessage.substr(75, 10); if (row.LineTextMessage.slice(81, 10) !== ''){ lines[lines.length - 1]['יתרה'] += row.LineTextMessage.slice(81, 10); } lines[lines.length - 1]['תוכן'] += '|' + row.LineTextMessage; } } } } catch (e) { console.log(e); } }).catch(console.error); } } console.log(lines); fs.writeFileSync('./MessagesData ' + moment().unix() + '.json', JSON.stringify(MessagesData)); fs.writeFileSync('./lines ' + moment().unix() + '.json', JSON.stringify(lines)); let excel = json2xls(lines); fs.writeFileSync('./lines ' + moment().unix() + '.xlsx', excel, 'binary'); })();
יש אפשרות הרבה יותר קלה אבל לצערי לא אוכל לכתוב את זה פה
תבדקו טוב ותראו לבד... -
@ivrtikshoret כתב בשיתוף סקריפט nodejs להורדת אקסל תנועות עו"ש מבנק דיסקונט משנים קודמים באמצעות התיבה האישית:
יש אפשרות הרבה יותר קלה אבל לצערי לא אוכל לכתוב את זה פה
??
-
@ivrtikshoret כתב בשיתוף סקריפט nodejs להורדת אקסל תנועות עו"ש מבנק דיסקונט משנים קודמים באמצעות התיבה האישית:
יש אפשרות הרבה יותר קלה אבל לצערי לא אוכל לכתוב את זה פה
תבדקו טוב ותראו לבד...אתה מתכון בעצם לפירצת אבטחה שיש בדיסקונט?
אם לא, אז למה לא תוכל לכתוב כאן? -
@avi-rz מבלי לבדוק את הקוד עצמו, תוכל לפרט מה הבעיות בהתקנת הספרייה? כי אצלי הספריות מותקנות מצויין.
ליתר ביטחון ניסיתי להתקין אצלי את הספריות עם הפקודהsudo npm i node-fetch moment json2xls
וכמובן עובד מצויין, אמנם יש אזהרה על שתי ״פגיעויות אבטחה״ (severity vulnerabilities) בתלויות jszip בגרסא 3.7.1 ובnode-zip שגם נפגעת מהפגיעה בjszip, ו npm audit fix אכן לא מצא גרסא חדשה יותר שמטפלת בבעית האבטחה, אבל בכל מקרה הספריות עובדות (אצלי לכה״פ) מצוין.
זה הpackage.json שנוצר אצלי:
בכ״א בלי פרטים נוספים על השגיאה שמתקבלת אצלך יהיה קשה לענות תשובה ברורה..
-