npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@rudymalhi/israeli-bank-scrapers

v2.0.5

Published

Provide scrapers for all major Israeli banks and credit card companies

Downloads

329

Readme

Israeli Bank Scrapers - Get closer to your own data

NPM

npm version dependencies Status devDependencies Status

Important!

The scrapers are set to use timezone Asia/Jerusalem to avoid conflicts in case you're running the scrapers outside Israel.

What's here?

What you can find here is scrapers for all major Israeli banks and credit card companies. That's the plan at least. Currently only the following banks are supported:

Prerequisites

To use this you will need to have Node.js >= 10.x installed.

Getting started

To use these scrapers you'll need to install the package from npm:

npm install israeli-bank-scrapers --save

Then you can simply import and use it in your node module:

import { CompanyTypes, createScraper } from "israeli-bank-scrapers";

(async function () {
  try {
    // read documentation below for available options
    const options = {
      companyId: CompanyTypes.leumi,
      startDate: new Date("2020-05-01"),
      combineInstallments: false,
      showBrowser: true,
    };

    // read documentation below for information about credentials
    const credentials = {
      username: "vr29485",
      password: "sometingsomething",
    };

    const scraper = createScraper(options);
    const scrapeResult = await scraper.scrape(credentials);

    if (scrapeResult.success) {
      scrapeResult.accounts.forEach((account) => {
        console.log(
          `found ${account.txns.length} transactions for account number ${account.accountNumber}`
        );
      });
    } else {
      throw new Error(scrapeResult.errorType);
    }
  } catch (e) {
    console.error(`scraping failed for the following reason: ${e.message}`);
  }
})();

Check the options declaration here for available options.

Regarding credentials, you should provide the relevant credentials for the chosen company. See this file with list of credentials per company.

The structure of the result object is as follows:

{
  success: boolean,
  accounts: [{
    accountNumber: string,
    balance?: number, // Account balance. Not implemented for all accounts.
    txns: [{
      type: string, // can be either 'normal' or 'installments'
      identifier: int, // only if exists
      date: string, // ISO date string
      processedDate: string, // ISO date string
      originalAmount: double,
      originalCurrency: string,
      chargedAmount: double,
      description: string,
      memo: string, // can be null or empty
      installments: { // only if exists
        number: int, // the current installment number
        total: int, // the total number of installments
      },
      status: string //can either be 'completed' or 'pending'
    }],
  }],
  errorType: "INVALID_PASSWORD"|"CHANGE_PASSWORD"|"ACCOUNT_BLOCKED"|"UNKNOWN_ERROR"|"TIMEOUT"|"GENERIC", // only on success=false
  errorMessage: string, // only on success=false
}

You can also use the SCRAPERS list to get scraper metadata:

import { SCRAPERS } from "israeli-bank-scrapers";

The return value is a list of scraper metadata:

{
  <companyId>: {
    name: string, // the name of the scraper
    loginFields: [ // a list of login field required by this scraper
      '<some field>' // the name of the field
    ]
  }
}

Two-Factor Authentication Scrapers

Some companies require two-factor authentication, and as such the scraper cannot be fully automated. When using the relevant scrapers, you have two options:

  1. Provide an async callback that knows how to retrieve real time secrets like OTP codes.
  2. When supported by the scraper - provide a "long term token". These are usually available if the financial provider only requires Two-Factor authentication periodically, and not on every login. You can retrieve your long term token from the relevant credit/banking app using reverse engineering and a MITM proxy, or use helper functions that are provided by some Two-Factor Auth scrapers (e.g. OneZero).
import { CompanyTypes, createScraper } from "israeli-bank-scrapers";
import { prompt } from "enquirer";

// Option 1 - Provide a callback

const result = await scraper.login({
  email: relevantAccount.credentials.email,
  password: relevantAccount.credentials.password,
  phoneNumber,
  otpCodeRetriever: async () => {
    let otpCode;
    while (!otpCode) {
      otpCode = await questions("OTP Code?");
    }

    return otpCode[0];
  },
});

// Option 2 - Retrieve a long term otp token (OneZero)
await scraper.triggerTwoFactorAuth(phoneNumber);

// OTP is sent, retrieve it somehow
const otpCode = "...";

const result = scraper.getLongTermTwoFactorToken(otpCode);
/*
result = {
  success: true;
  longTermTwoFactorAuthToken: 'eyJraWQiOiJiNzU3OGM5Yy0wM2YyLTRkMzktYjBm...';
}
 */

Getting deployed version of latest changes in master

This library is deployed automatically to NPM with any change merged into the master branch.

Israeli-bank-scrapers-core library

TL;DR this is the same library as the default library. The only difference is that it is using puppeteer-core instead of puppeteer which is useful if you are using frameworks like Electron to pack your application.

In most cases you will probably want to use the default library (read Getting Started section).

Israeli bank scrapers library is published twice:

  1. israeli-bank-scrapers - the default variation, great for common usage as node dependency in server application or cli.
  2. israeli-bank-scrapers-core - extremely useful for applications that bundle node_modules like Electron applications.

Differences between default and core variations

The default variation israeli-bank-scrapers is using puppeteer which handles the installation of local chroumium on its' own. This behavior is very handy since it takes care on all the hard work figuring which chromium to download and manage the actual download process. As a side effect it increases node_modules by several hundred megabytes.

The core variation israeli-bank-scrapers-core is using puppeteer-core which is exactly the same library as puppeteer except that it doesn't download chromium when installed by npm. It is up to you to make sure the specific version of chromium is installed locally and provide a path to that version. It is useful in Electron applications since it doesn't bloat the size of the application and you can provide a much friendlier experience like loading the application and download it later when needed.

To install israeli-bank-scrapers-core:

npm install israeli-bank-scrapers-core --save

Specific definitions per scraper

Bank Hapoalim scraper

This scraper expects the following credentials object:

const credentials = {
  userCode: <user identification code>,
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Bank Leumi scraper

This scraper expects the following credentials object:

const credentials = {
  username: <user name>,
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Discount scraper

This scraper expects the following credentials object:

const credentials = {
  id: <user identification number>,
  password: <user password>,
  num: <user identificaiton code>
};

This scraper supports fetching transaction from up to one year (minus 1 day).

Known Limitations

  • Missing memo field

Mizrahi scraper

This scraper expects the following credentials object:

const credentials = {
  username: <user identification number>,
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Beinleumi & Massad

These scrapers are essentially identical and expect the following credentials object:

const credentials = {
  username: <user name>,
  password: <user password>
};

Bank Otsar Hahayal scraper

This scraper expects the following credentials object:

const credentials = {
  username: <user name>,
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Visa Cal scraper

This scraper expects the following credentials object:

const credentials = {
  username: <user name>,
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Max scraper (Formerly Leumi-Card)

This scraper expects the following credentials object:

const credentials = {
  username: <user name>,
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Isracard scraper

This scraper expects the following credentials object:

const credentials = {
  id: <user identification number>,
  card6Digits: <6 last digits of card>
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Amex scraper

This scraper expects the following credentials object:

const credentials = {
  username: <user identification number>,
  card6Digits: <6 last digits of card>
  password: <user password>
};

This scraper supports fetching transaction from up to one year.

Yahav

This scraper expects the following credentials object:

const credentials = {
  username: <user name>,
  password: <user password>,
  nationalID: <user national ID>
};

This scraper supports fetching transaction from up to six months.

Beyhad Bishvilha

This scraper expects the following credentials object::

const credentials = {
  id: <user identification number>,
  password: <user password>
};

Known projects

These are the projects known to be using this module:

  • Israeli YNAB updater - A command line tool for exporting banks data to CSVs, formatted specifically for YNAB
  • Israel Finance Telegram Bot - A simple telegram bot that sends notifications about new transactions and interacts with them
  • Caspion - An app for automatically sending transactions from Israeli banks and credit cards to budget tracking apps
  • Finance Notifier - A simple script with the ability to send custom financial alerts to multiple contacts and platforms
  • Moneyman - Automatically save transactions from all major Israeli banks and credit card companies, using GitHub actions (or a self hosted docker image)

Built something interesting you want to share here? Let me know.

License

The MIT License