קוד Node לקבלת נתונים מבנק הפועלים
-
ראיתי את הספריה israeli-bank-scrapers
התלבטתי אם להשתמש בזה.
אמרתי שאני ינסה ויראה עד כמה זה מורכב לממש את זה בעצמי.
תכלס כתבתי את זה עם עזרת GPT, וקיבלתי תוצאה טובה. (יש לי יותר מידע ממה שהם מחזירים, ואני יכול גם להוסיף כל הזמן כל מידע שאני צריך)
מצרף את הקובץ
const puppeteer = require('puppeteer'); const axios = require('axios'); const fs = require('fs'); const poalim = async (userCode, password, tranStartDate = null, tranEndDate = null) => {//dates in format yyyymmdd // פתיחת הדפדפן במצב דיבוג (headful) const browser = await puppeteer.launch({ headless: false, // הופך את המצב ל-Headful }); const pages = await browser.pages(); const page = pages[0]; // שימוש בטאב הראשון await page.goto("https://login.bankhapoalim.co.il/ng-portals/auth/he/"); // הזנת מידע לתוך האינפוטים await page.type('#userCode', userCode); // הזנת טקסט לאינפוט הראשון (לפי מזהה id) await page.type('#password', password); // הזנת טקסט לאינפוט השני (לפי מזהה id) // לחיצה על כפתור מסוג submit עם הטקסט "כניסה" await page.evaluate(() => { const button = Array.from(document.querySelectorAll('button[type="submit"]')) .find(el => el.innerText === 'כניסה'); if (button) button.click(); }); await page.waitForNavigation(); // שליפת עוגיות const cookies = await page.cookies(); // יצירת מחרוזת עוגיות עבור בקשות HTTP const cookieHeader = cookies.map(cookie => `${cookie.name}=${cookie.value}`).join('; '); // שליחת בקשה HTTP עם העוגיות const accounts = await axios.get('https://login.bankhapoalim.co.il/ServerServices/general/accounts', { headers: { 'Cookie': cookieHeader, // שימוש בעוגיות שהתקבלו }, }); // קביעת תאריכים עם ברירת מחדל אם לא סופקו const startDate = tranStartDate || new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString().split('T')[0].replace(/-/g, ''); const endDate = tranEndDate || new Date().toISOString().split('T')[0].replace(/-/g, ''); // עיבוד כל החשבונות במקביל const enrichedAccounts = await Promise.all( accounts.data.map(async (account) => { const accountId = `${account.bankNumber}-${account.branchNumber}-${account.accountNumber}`; // בקשה לפרטי היתרה והקרדיט const metadataPromise = axios.get( `https://login.bankhapoalim.co.il/ServerServices/current-account/composite/balanceAndCreditLimit?accountId=${accountId}&view=details&lang=he`, { headers: { 'Cookie': cookieHeader } } ); // בקשה לרשימת תנועות const transactionsPromise = axios.get( `https://login.bankhapoalim.co.il/ServerServices/current-account/transactions?accountId=${accountId}&numItemsPerPage=1000&retrievalEndDate=${endDate}&retrievalStartDate=${startDate}&sortCode=1`, { headers: { 'Cookie': cookieHeader } } ); // מחכים לשתי הבקשות במקביל const [metadataResponse, transactionsResponse] = await Promise.all([metadataPromise, transactionsPromise]); // החזרת האובייקט המועשר return { ...account, metadata: metadataResponse.data, transactions: transactionsResponse.data, }; }) ); const now = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 8) + '_' + new Date().toTimeString().slice(0, 5).replace(/:/g, ''); // כתיבת התוצאה לקובץ JSON fs.writeFileSync(`bank_${now}.json`, JSON.stringify(enrichedAccounts, null, 2)); await page.deleteCookie(...cookies);// מחיקת עוגיות await browser.close(); // סגירת הדפדפן } poalim('userName', 'password');
-
@יהודי-טוב כתב בקוד Node לקבלת נתונים מבנק הפועלים:
וקיבלתי תוצאה טובה
אתה מצליח למשוך את המידע בפועל?
אשמח להבין יותר מה אתה מקבל. -
@one1010 כתב בקוד Node לקבלת נתונים מבנק הפועלים:
אתה מצליח למשוך את המידע בפועל?
כן
אשמח להבין יותר מה אתה מקבל.
אני שומר את זה בקובץ json בתיקיה של הפרויקט.
אתה יכול לעשות עם זה מה שבא לך - ליצור מזה קובץ אקסל, לשלוח מייל, להריץ משימה שתבדוק כל הזמן אם יש נתונים חדשים ותתריע לך על זה וכו'...
אבל זה כבר לא קשור למשיכת הנתונים מהבנק.
מה שכתבתי זה לא מוצר שמתאים לצורך ספציפי - אלא רק מושך מהבנק נתונים על החשבון ואתה מחליט מה לעשות עם זה.
בנוסף שים לב שצריך להתקין את הספריות שאני מייבא.
-
@יהודי-טוב זה אמור לעבוד גם מכתובות בחו"ל? (למה אני מקבל 401 Unauthorized)
-
@יוס
אתה רואה דפדפן שנפתח?
מה אתה רואה בדפדפן?יכול להיות שפעם ראשונה צריך קוד חד"פ.
תנסה להוסיף אחרי הכניסה את השורות האלו
const currentUrl = page.url(); console.log(currentUrl);
אתה אמור לקבל את זה:
https://login.bankhapoalim.co.il/ng-portals/rb/he/homepage
@one1010
בדוגמא הזו אני מושך:
רשימה עם כל החשבונות בנק.
על כל חשבון פרטים בסיסיים ותנועות (מהשנה האחרונה או תאריכים שצוינו).אם אתה רוצה למשוך משהו נוסף אתה יכול לבדוק באתר של הבנק לאיזה כתובת מתבצעת הפניה ולהוסיף את זה לmap שיוסיף את זה עבור כל חשבון.
-
@יהודי-טוב כתב בקוד Node לקבלת נתונים מבנק הפועלים:
אתה יכול לבדוק באתר של הבנק לאיזה כתובת מתבצעת הפניה
איך? בהקלטת תעבורה?
-
@one1010 כתב בקוד Node לקבלת נתונים מבנק הפועלים:
@יהודי-טוב בעצם הקוד ניגש בעצמו לדפדפן ופותח את החשבון?
כן.
רואים את זה על המסך?
בקוד שכתבתי כן, אתה יכול להסיר את השורה הזו, וזה יגרום שלא יראו את זה על המסך.
headless: false,
המחשב חייב להיות דלוק?
כן, המחשב מריץ את זה, ובקוד שלי זה גם הרצה חד"פ, אם אתה רוצה שזה ירוץ כל הזמן אתה צריך לדאוג לזה...
זה אפשרי גם בשאר הבנקים וחברות האשראי?
לא, הקוד הזה מתאים רק לבנק הפועלים.
לשאר הבנקים וחברות אשראי אתה יכול להשתמש בספריה israeli-bank-scrapers.
או להבין בעצמך מה התהליך שקורא כשאתה נכנס לבנק, ולכתוב לבד.מה שכתבת שאני יכול לשלוח במייל, זה לא מופיע בקוד שלך, נכון?
נכון
זה לא קשור.
אם יש לך צורך ספציפי תכתוב (אולי באשכול חדש) ואולי יוכלו לכוון אותך לשם.
הקוד הזה בס"ה מביא את הנתונים.