אני הייתי עושה בדיקה על לחצן אחר בדיאלוג הזה, כמו לחצן סגור - ובודק אם יש בעיה באינפוט או שבכלל הדיאלוג לא נקלט.
או שיכול להיות שהם מצפים באינפוט הזה לקלט אחד אחרי השני ואין אפשרות לכתוב בפעם אחת את כל הקוד, תנסה לכתוב רק תו אחד.
אני הייתי עושה בדיקה על לחצן אחר בדיאלוג הזה, כמו לחצן סגור - ובודק אם יש בעיה באינפוט או שבכלל הדיאלוג לא נקלט.
או שיכול להיות שהם מצפים באינפוט הזה לקלט אחד אחרי השני ואין אפשרות לכתוב בפעם אחת את כל הקוד, תנסה לכתוב רק תו אחד.
@mekev כתב בחיפוש שירות: קבלת מייל יומי מסוכם עם היתרות עו"ש בבנקים:
אני אוחז פה (שאני לא מצליח לבצע פעולות בדיאלוג)
תבדוק שזה לא יושב בתוך iframe.
כי לדוגמא בהתחברות בבנק פאגי ובנק מזרחי, עולה סוג של דיאלוג שזה בiframe ואז אתה צריך למצוא את האלמנט של ה-iframe ואח"כ בתותו את האלמנטים שאתה רוצה....
ניסיתי לשאול אותו בשבילך, וקיבלתי תוצאה שאני חושב יותר יפתור לך את הבעיה מאשר RSS.
ככה אתה קורא את התוכן באתר ההוא.
שים לב שהקוד הזה מותאם לאתר https://www.geektime.co.il/
תנסה להבין מזה איך להתאים את זה לאתר שלך.
(תלחץ על F12 תלחץ על הסמן של העכבר בפינה השמאלית, תבחר את האלמנט של התקציר, זה יקפיץ לך את זה בחלונית בצד, תעתיק ותדביק לGPT, אתה יכול להמשיך בהתכתבות הזו, ולכתוב לו שאתה רוצה קוד לעוד אתר אם הוא יכול להתאים לך את הקוד לזה...
https://chatgpt.com/share/67587d29-3574-8007-b7f8-0d85e37469f7
@mekev כתב בחיפוש שירות: קבלת מייל יומי מסוכם עם היתרות עו"ש בבנקים:
בנק פועלים עסקי - לא מצאתי ספרייה פתוחה פעילה תקינה התומכת בניהול האימות הדו גורמי
בכל כניסה זה דורש אימות או רק בפעם הראשונה?
@מנחם כתב בחיפוש שירות: קבלת מייל יומי מסוכם עם היתרות עו"ש בבנקים:
מה לא טוב בכספיון עם גוגל שיטס?
זה מעדכן כל הזמן את הקובץ גוגל שיטס?
נותן אפשרות לשלוח מיילים על יתרות?
@mekev כתב בחיפוש שירות: קבלת מייל יומי מסוכם עם היתרות עו"ש בבנקים:
גם לתוכניות בתשלום
כמה שווה לך לשלם חד"פ כדי לקבל פרויקט node שירוץ לך על המחשב ויעשה את הפעולה הזו?
@אפרים22 כתב בחיפוש שירות: קבלת מייל יומי מסוכם עם היתרות עו"ש בבנקים:
היום יש את רפורמת הבנקאות הפתוחה של בנק ישראל, אפשרי להוסיף דרך הבנק. אני חושב שאפשר גם דרך חברת כאל
זה לא ברמה שאדם רגיל מן השורה יכול להתחבר לזה, צריך אישור מבנק ישראל - נשמע משהו מורכב...
@THMV
תרגמת את התוצאה שלו?
הבנת מה הוא כתב לך?
תתרגם ותנסה להבין, ואז תבין איך לנסח לו את השאלה בצורה שתמצא חן בעיניו.
(אין עניין שאני ישאל את הGPT כל שאלה שיש לך, חבל על הזמן שלי ועל הזמן שלך, תנסה לבקש מהקהילה לפתוח לך את זה, או שתלמד איך לעבוד עם מי שכן פתוח בקהילה שלך..)
@THMV
מעולה, נראה תוצאה טובה...
זה מה שרצית?
@THMV כתב במחיקת חלקים ממיל אוטומט לפני שאנו מעבירים אותו הלאה:
כמו כן אני ישמח מאוד אם תוכל לעשות לי סימניה של חיפוש והחלפה לדברים מרובים (שיעבוד גם אם לא מוצא כלום)
ותלמד אותי איפה מכניסים את המלל שמחפשים ולמה להחליף
כלומר אכתוב לו שאת ת"א יחליף ל-תל אביב ואת רח' יחליף ל-רחוב וכו'
וגם שימחוק סימנים של / למעט עם זה בתאריךתודה רבה על הכל תעשה רק מה שקל לך ויש לך כח
יהיה לך הכי נוח פשוט לשאול את הצאט GPT.
תכתוב לו משהו כזה:
יש לי טקסט שאני רוצה לסנן ממנו חלקים ולשלוח במייל.
יש לי כרגע את הסקריפט הזה ...
שפותח לי מייל חדש עם טקסט מסונן.
אני רוצה לסנן עוד שורות.
רוצה לסנן כל שורה שמתחילה ב XX וכן כל שורה שמתחילה ב XX
בנוסף אני רוצה למחוק את כל התווים / חוץ מבתאריך (זיהוי של תאריך אמור להיות לפי הפורמט הזה dd/mm/yyyy)
יש מצב שתכתוב לי לזה סקריפט בשורה אחת שאוכל להדביק בסימניה?
אחרי שתקבל משהו שעובד תנסה לבדוק איתו אם זה אפשרי גם שיפתח הודעה חדשה בלי לפתוח כרטיסיה חדשה (-שאלתי אותו עכשיו, זה מצריך התקשקשות - אתה צריך להדביק לו את האלמנטים מתוך כלי המפתחים כדי שיזהה אותם, וזה לא עבד לי באמת טוב..., הצלחתי לפתוח הודעה חדשה ובלי לכתוב בזה כותרת או טקסט בגוף ההודעה)

Sub ExportSentEmailsToExcel()
Dim objNamespace As Outlook.Namespace
Dim objFolder As Outlook.Folder
Dim objItem As Object
Dim objMail As Outlook.MailItem
Dim xlApp As Object
Dim xlWorkbook As Object
Dim xlWorksheet As Object
Dim i As Long
' פתיחת תיקייה "פריטים שנשלחו"
Set objNamespace = Application.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderSentMail)
' פתיחת אקסל
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlWorkbook = xlApp.Workbooks.Add
Set xlWorksheet = xlWorkbook.Sheets(1)
' כותרות
xlWorksheet.Cells(1, 1).Value = "שם"
xlWorksheet.Cells(1, 2).Value = "כתובת מייל"
' מעבר על המיילים שנשלחו
i = 2
For Each objItem In objFolder.Items
If TypeOf objItem Is Outlook.MailItem Then
Set objMail = objItem
' הוספת שם וכתובת המייל לאקסל
If objMail.To <> "" Then
xlWorksheet.Cells(i, 1).Value = objMail.To
xlWorksheet.Cells(i, 2).Value = objMail.SenderEmailAddress
i = i + 1
End If
End If
Next
MsgBox "סיום ייצוא הכתובות לאקסל!", vbInformation
' ניקיון זיכרון
Set objMail = Nothing
Set objItem = Nothing
Set objFolder = Nothing
Set objNamespace = Nothing
Set xlWorksheet = Nothing
Set xlWorkbook = Nothing
Set xlApp = Nothing
End Sub

לא עברתי על הקוד וכמובן שלא לוקח אחריות אם קורה משהו...
אתה צריך לבחור את הטקסט של ההודעה שקיבלת, ואת זה הוא מסנן ושולח....
@THMV כתב במחיקת חלקים ממיל אוטומט לפני שאנו מעבירים אותו הלאה:
מצורפת דוגמא חתוכה! (ללא פרטים אישים)
ה-V בסוף זה כי זה שם השאלה לא נורא אם זה ישאר
מצרף קוד לסימניה - תבחר את ההודעה במייל ותלחץ על הסימניה, זה יעתיק לך את הטקסט ויסנן את השורות שמתחילות במילה ציון
javascript:(()=>{try{let t=window.getSelection().toString();if(!t)return void alert("לא נבחר טקסט לסינון");navigator.clipboard.writeText(t.split('\n').filter(l=>!l.trim().startsWith("ציון")).join('\n')).then(()=>alert("הטקסט המסונן הועתק ללוח")).catch(e=>alert("אירעה שגיאה בהעתקת הטקסט: "+e))}catch(e){alert("שגיאה: "+e)}})();
אם אתה רוצה שיפתח לך גם מייל לשליחה תכתוב את הקוד הזה,
(שים לב לערוך את הכותרת ומיילים לשליחה)
javascript:(()=>{try{let t=window.getSelection().toString();if(!t)return void alert("לא נבחר טקסט לסינון");let filteredText=t.split('\n').filter(l=>!l.trim().startsWith("ציון")).join('\n');let mailtoUrl=`https://mail.google.com/mail/?view=cm&fs=1&to=mail1@gmail.com,mail2@gmail.com&su=כותרת&body=${encodeURIComponent(filteredText)}`;window.open(mailtoUrl,'_blank')}catch(e){alert("שגיאה: "+e)}})();
כמובן הקרדיט ל GPT.
אגב כן צירפת פרטים אישיים - רואים בצילומסך את מס' הטלפון שהשאיר את ההודעה.
תערוך את זה.
@THMV
תצרף דוגמא של המייל.
ימות המשיח?
בקובץ מצורף או בגוף המייל?
@one1010 כתב בקוד Node לקבלת נתונים מבנק הפועלים:
@יהודי-טוב בעצם הקוד ניגש בעצמו לדפדפן ופותח את החשבון?
כן.
רואים את זה על המסך?
בקוד שכתבתי כן, אתה יכול להסיר את השורה הזו, וזה יגרום שלא יראו את זה על המסך.
headless: false,
המחשב חייב להיות דלוק?
כן, המחשב מריץ את זה, ובקוד שלי זה גם הרצה חד"פ, אם אתה רוצה שזה ירוץ כל הזמן אתה צריך לדאוג לזה...
זה אפשרי גם בשאר הבנקים וחברות האשראי?
לא, הקוד הזה מתאים רק לבנק הפועלים.
לשאר הבנקים וחברות אשראי אתה יכול להשתמש בספריה israeli-bank-scrapers.
או להבין בעצמך מה התהליך שקורא כשאתה נכנס לבנק, ולכתוב לבד.
מה שכתבת שאני יכול לשלוח במייל, זה לא מופיע בקוד שלך, נכון?
נכון
זה לא קשור.
אם יש לך צורך ספציפי תכתוב (אולי באשכול חדש) ואולי יוכלו לכוון אותך לשם.
הקוד הזה בס"ה מביא את הנתונים.
@one1010 כתב בקוד Node לקבלת נתונים מבנק הפועלים:
איך? בהקלטת תעבורה?
או הקלטת תעבורה או לבדוק בנטוורק.
אגב אתה יכול גם לעשות העברות (אם כי - זה בד"כ מצריך קוד חד"פ כל העברה - ככה זה אצלי - ואם כן לא הרווחת מזה כלום)
@יוס
אתה רואה דפדפן שנפתח?
מה אתה רואה בדפדפן?
יכול להיות שפעם ראשונה צריך קוד חד"פ.
תנסה להוסיף אחרי הכניסה את השורות האלו
const currentUrl = page.url();
console.log(currentUrl);
אתה אמור לקבל את זה:
https://login.bankhapoalim.co.il/ng-portals/rb/he/homepage
@one1010
בדוגמא הזו אני מושך:
רשימה עם כל החשבונות בנק.
על כל חשבון פרטים בסיסיים ותנועות (מהשנה האחרונה או תאריכים שצוינו).
אם אתה רוצה למשוך משהו נוסף אתה יכול לבדוק באתר של הבנק לאיזה כתובת מתבצעת הפניה ולהוסיף את זה לmap שיוסיף את זה עבור כל חשבון.
@one1010 כתב בקוד Node לקבלת נתונים מבנק הפועלים:
אתה מצליח למשוך את המידע בפועל?
כן
אשמח להבין יותר מה אתה מקבל.
אני שומר את זה בקובץ json בתיקיה של הפרויקט.
אתה יכול לעשות עם זה מה שבא לך - ליצור מזה קובץ אקסל, לשלוח מייל, להריץ משימה שתבדוק כל הזמן אם יש נתונים חדשים ותתריע לך על זה וכו'...
אבל זה כבר לא קשור למשיכת הנתונים מהבנק.
מה שכתבתי זה לא מוצר שמתאים לצורך ספציפי - אלא רק מושך מהבנק נתונים על החשבון ואתה מחליט מה לעשות עם זה.
בנוסף שים לב שצריך להתקין את הספריות שאני מייבא.
ראיתי את הספריה 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');
@THMV
שאלתי אותו בשבילך..
תיצור סימניה חדשה בכרום,
ובערך של הURL תדביק את הטקסט הבא:
ותיכנס לאתר, ותלחץ על הסימניה ואח"כ תלחץ על העמודה שאתה רוצה להעתיק.
כשאתה מסיים תוכל ללחוץ שוב על הסימניה
בדקתי את זה על הטבלאות כאן וזה עבד מעולה, אם זה לא עובד באתר שאתה צריך יכול להיות שזה עובד בצורה שונה.
javascript:(function() { let active = false; let selectedColumnIndex = null; const highlightClass = 'highlight-column'; const style = document.createElement('style'); style.textContent = ` .${highlightClass} { background-color: rgba(255, 255, 0, 0.3); } `; document.head.appendChild(style); function clearHighlights(table) { table.querySelectorAll(`.${highlightClass}`).forEach(cell => { cell.classList.remove(highlightClass); }); } function mouseOverHandler(event) { const cell = event.target.closest('td, th'); if (cell && (cell.parentElement.parentElement.tagName === 'TBODY' || cell.parentElement.parentElement.tagName === 'THEAD')) { const table = cell.closest('table'); if (!table) return; clearHighlights(table); const columnIndex = [...cell.parentElement.children].indexOf(cell); selectedColumnIndex = columnIndex; table.querySelectorAll('tr').forEach(row => { const columnCell = row.children[columnIndex]; if (columnCell) { columnCell.classList.add(highlightClass); } }); } } function clickHandler(event) { const cell = event.target.closest('td, th'); if (cell && selectedColumnIndex !== null) { const table = cell.closest('table'); if (!table) return; const columnData = []; table.querySelectorAll('tr').forEach(row => { const columnCell = row.children[selectedColumnIndex]; if (columnCell) { columnData.push(columnCell.textContent.trim()); } }); navigator.clipboard.writeText(columnData.join('\n')).then(() => { alert('ההעתקה בוצעה בהצלחה!'); }).catch(err => { console.error('Failed to copy text: ', err); alert('שגיאה בהעתקה ללוח ההעתקה.'); }); } } if (!window.toggleTableColumnCopy) { window.toggleTableColumnCopy = function() { if (!active) { document.addEventListener('mouseover', mouseOverHandler); document.addEventListener('click', clickHandler); alert('הפונקציונליות הופעלה!'); } else { document.removeEventListener('mouseover', mouseOverHandler); document.removeEventListener('click', clickHandler); clearHighlights(document); alert('הפונקציונליות הופסקה!'); } active = !active; }; } toggleTableColumnCopy(); })();