Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 24 additions & 10 deletions assets/bank_beinleumi.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
from __future__ import print_function

import os
import re
import requests
from collections import OrderedDict
from .common import BankBase, format_value
from typing import List

from selenium.webdriver.support.ui import WebDriverWait
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import time
import os
from selenium.webdriver.support.ui import WebDriverWait

from . import stats
from .common import BankBase, format_value, print_value, AssetValues

headers = {"User-Agent": "Mozilla/5.0"}

Expand All @@ -26,6 +29,7 @@ def _wait_for_id(self, html_id):
WebDriverWait(self.selenium, 10).until(indicator)

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
os.environ["DISPLAY"] = ":1"
self.selenium = webdriver.Firefox()
self.selenium.get("https://online.fibi.co.il/")
Expand All @@ -48,17 +52,22 @@ def _establish_session(self, username, password):
return session

def _get_accounts(self):
# type: () -> List[str]
main_html = self._session.get(self.HOME_URL, headers=headers).text
return re.findall('option value="([^"]+)"', main_html)

def _switch_account(self, account):
# type: (str) -> None
main_html = self._session.get(self.HOME_URL, headers=headers).text
base_href = re.search('<base href="([^"]+)">', main_html).group(1)
form_action = re.search('<form method="post" action="([^"]+)" name="refreshPortletForm" id="refreshPortletForm">', main_html).group(1)
form_action = re.search(
'<form method="post" action="([^"]+)" name="refreshPortletForm" id="refreshPortletForm">', main_html).group(
1)
data = dict(PortletForm_ACTION_NAME="changeAccount", portal_current_account=account)
self._session.post(base_href + form_action, data=data, headers=headers)

def _get_values_from_main_page(self):
# type: () -> float
main_html = self._session.get(self.BALANCE_URL, headers=headers).text
match_obj = re.search(self.BALANCE_PATTERN, main_html, re.DOTALL)
if match_obj is None:
Expand All @@ -67,6 +76,7 @@ def _get_values_from_main_page(self):
return format_value(OSH)

def _get_stock_value(self):
# type: () -> float
stock_html = self._session.get(self.STOCK_URL, headers=headers).text
match_obj = re.search(self.STOCK_PATTERN, stock_html)
if match_obj is None:
Expand All @@ -75,12 +85,16 @@ def _get_stock_value(self):
return format_value(NIA)

def get_values(self):
# type: () -> AssetValues
bank = 0
stock = 0
for account in self._get_accounts():
self._switch_account(account)
bank += self._get_values_from_main_page()
stock += self._get_stock_value()
print("OSH: {:10,.2f}".format(bank))
print("NIA: {:10,.2f}".format(stock))
return OrderedDict([("Bank", bank), ("Deposit", 0), ("Stock", stock), ("Car", 0)])
print_value(bank, "OSH")
print_value(stock, "NIA")
return AssetValues(
OrderedDict([("Bank", bank), ("Deposit", 0), ("Stock", stock), ("Car", 0)]),
stats.StatsMapping([stats.StatBank(bank), stats.StatStockBroker(stock)])
)
32 changes: 21 additions & 11 deletions assets/bank_discount.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import re
import requests
from collections import OrderedDict
from .common import BankBase, format_value
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options as WebDriverOptions
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

from . import stats
from .common import BankBase, print_value, AssetValues


# username is in format <id>,<code>

Expand All @@ -21,6 +24,7 @@ def _wait_for_id(self, html_id):
WebDriverWait(self.selenium, 180).until(indicator)

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
uid, code = username.split(",")
options = WebDriverOptions()
options.headless = True
Expand All @@ -43,13 +47,19 @@ def _establish_session(self, username, password):
return session

def get_values(self):
# type: () -> AssetValues
accounts_data = self._session.get(self.ACCOUNTS_JSON_URL).json()
account_numbers = [account['FormatAccountID'] for account in accounts_data['UserAccountsData']['UserAccounts']]
bank = 0
stock = 0
for account_number in account_numbers:
bank += self._session.get(self.BALANCE_JSON_URL.format(account_number)).json()['AccountDetails']['AccountBalance']
stock += self._session.post(self.STOCK_JSON_URL, json={"AccountNumber": account_number}).json()['CurrentSecuritiesPortfolio']['PortfolioValue']
print("OSH: {:10,.2f}".format(bank))
print("NIA: {:10,.2f}".format(stock))
return OrderedDict([("Bank", bank), ("Deposit", 0), ("Stock", stock), ("Car", 0)])
bank += self._session.get(self.BALANCE_JSON_URL.format(account_number)).json()['AccountDetails'][
'AccountBalance']
stock += self._session.post(self.STOCK_JSON_URL, json={"AccountNumber": account_number}).json()[
'CurrentSecuritiesPortfolio']['PortfolioValue']
print_value(bank, "OSH")
print_value(stock, "NIA")
return AssetValues(
OrderedDict([("Bank", bank), ("Deposit", 0), ("Stock", stock), ("Car", 0)]),
stats.StatsMapping([stats.StatBank(bank), stats.StatStockBroker(stock)])
)
17 changes: 14 additions & 3 deletions assets/bank_leumi.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
import json
import re
from collections import OrderedDict
from typing import Dict

import requests
from .common import BankBase, HEADERS_USER_AGENT, print_value

from . import stats
from .common import BankBase, HEADERS_USER_AGENT, print_value, AssetValues


class BankLeumi(BankBase):
Expand All @@ -13,6 +17,7 @@ class BankLeumi(BankBase):
HOME_URL = "https://hb2.bankleumi.co.il/uniquesig0/ebanking/SO/SPA.aspx#/hpsummary"

def __init__(self, asset_section, print_info=True, **asset_options):
# type: (str, bool, ...) -> None
super(BankLeumi, self).__init__(asset_section, **asset_options)
home_response = self._session.get(self.HOME_URL, headers=HEADERS_USER_AGENT)
summary_page = home_response.text
Expand All @@ -28,7 +33,7 @@ def __init__(self, asset_section, print_info=True, **asset_options):
private_data = dict([(key, json.loads(value)) for key, value in private_data.items()])
session_id = private_data['SO_Signon']['SessionID']

self.__total_values = collections.defaultdict(int)
self.__total_values = collections.defaultdict(float)

for account_item in private_data['SHEMESHPREMIUM_AccountsItems_hpsummary']['AccountsItems']:
req_obj = {
Expand Down Expand Up @@ -69,17 +74,23 @@ def __init__(self, asset_section, print_info=True, **asset_options):
self.__total_values[account_type_name] = self.__total_values[account_type_name] + account_type_total

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
s = requests.Session()
s.get(self.LOGIN_URL, headers=HEADERS_USER_AGENT)
post_data = {'system': 'test', 'uid': username, 'password': password, 'command': 'login'}
s.post(self.LOGIN_POST_URL, data=post_data, headers=HEADERS_USER_AGENT)
return s

def get_values(self):
# type: () -> AssetValues
checking = self.__total_values['Checking']
holdings = self.__total_values['Holdings']
deposit = self.__total_values['Deposit']
return OrderedDict([("Checking", checking), ("Holdings", holdings), ("Deposit", deposit)])
return AssetValues(
OrderedDict([("Checking", checking), ("Holdings", holdings), ("Deposit", deposit)]),
stats.StatsMapping([stats.StatBank(checking + deposit), stats.StatStockBroker(holdings)])
)

def get_total_values(self):
# type: () -> Dict[str, float]
return self.__total_values
16 changes: 13 additions & 3 deletions assets/bank_otsar.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import re
import requests
from collections import OrderedDict
from .common import BankBase, format_value

import requests

from . import stats
from .common import BankBase, format_value, AssetValues


class BankOtsar(BankBase):
Expand All @@ -10,24 +13,31 @@ class BankOtsar(BankBase):
STOCK_URL = "https://online.bankotsar.co.il/wps/myportal/FibiMenu/Online/OnCapitalMarket/OnMyportfolio/AuthSecuritiesPrtfMyPFEquities"

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
s = requests.Session()
post_data = {"bankId": "OTSARPRTAL", "lang": "HE", "username": username, "password": password}
s.post(self.LOGIN_URL, data=post_data)
return s

def _get_values_from_main_page(self):
# type: () -> float
main_page_html = self._session.get(self.HOME_URL).text
OSH = re.search("current_balance[^>]+>\s*\S+\s*([^<]+)\s*", main_page_html)
OSH = OSH.group(1)
return format_value(OSH, 'OSH')

def _get_stock_value(self):
# type: () -> float
stock_html = self._session.get(self.STOCK_URL).text
NIA = re.findall("subtotal_val[^>]+>\s*\S+\s*([^<]+)\s*", stock_html)
NIA = NIA[-1]
return format_value(NIA, 'NIA')

def get_values(self):
# type: () -> AssetValues
bank = self._get_values_from_main_page()
stock = self._get_stock_value()
return OrderedDict([("Bank", bank), ("Deposit", 0), ("Stock", stock), ("Car", 0)])
return AssetValues(
OrderedDict([("Bank", bank), ("Deposit", 0), ("Stock", stock), ("Car", 0)]),
stats.StatsMapping([stats.StatBank(bank), stats.StatStockBroker(stock)])
)
37 changes: 23 additions & 14 deletions assets/card_cal.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import re
import requests
from .common import CardBase, format_value, print_value

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options as WebDriverOptions
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

from .common import CardBase, format_value, print_value


class CardCal(CardBase):
CARD_LOGIN_URL = "https://services.cal-online.co.il/card-holders/Screens/AccountManagement/Login.aspx"
Expand All @@ -16,14 +17,17 @@ class CardCal(CardBase):
CARD_VALUE_RE = """<span id="%s" class="money"><b>(.*?)</b></span>"""

def _wait_for_id(self, html_id):
# type: (str) -> None
indicator = EC.presence_of_element_located((By.ID, html_id))
WebDriverWait(self.selenium, 10).until(indicator)

def _wait_for_name(self, html_name):
# type: (str) -> None
indicator = EC.presence_of_element_located((By.NAME, html_name))
WebDriverWait(self.selenium, 10).until(indicator)

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
options = WebDriverOptions()
options.headless = True
self.selenium = webdriver.Firefox(options=options)
Expand All @@ -47,21 +51,26 @@ def _establish_session(self, username, password):

return session

def _get_card_value(self, card_data, card_code, print_name=None):
def __get_card_value(self, card_data, card_code, print_name=None):
# type: (str, str, str) -> float
val = re.search(self.CARD_VALUE_RE % (card_code,), card_data).group(1)
return format_value(val, print_name)

def _get_balance(self, card_code):
def __get_balance(self, card_code):
# type: (str) -> float
home_data = self._session.get(self.CARD_HOME_URL)
card_details_queries = re.findall("(\?cardUniqueID=\d+)", home_data.text)
card_details_queries = re.findall(r"(\?cardUniqueID=\d+)", home_data.text)
card_datas = [self._session.get(self.CARD_DETAIL_URL + card_details_query)
for card_details_query in card_details_queries]
return sum(self._get_card_value(card_data.text, card_code) for card_data in card_datas)
return sum(self.__get_card_value(card_data.text, card_code) for card_data in card_datas)

def get_credit(self):
card_total = self._get_balance("lblTotalRemainingSum")
def _get_credit(self):
# type: () -> float
card_total = self.__get_balance("lblTotalRemainingSum")
print_value(0 - card_total, "Credit")
return 0 - card_total

def get_next(self):
return self._get_balance("lblNextDebitSum")
def _get_next(self):
# type: () -> float
card_next = self.__get_balance("lblNextDebitSum")
return 0 - card_next
10 changes: 8 additions & 2 deletions assets/card_isracard.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import json

import requests

from .common import CardBase, format_value


Expand All @@ -10,13 +12,15 @@ class CardIsracard(CardBase):
CARD_DATA_URL = "https://digital.isracard.co.il/services/ProxyRequestHandler.ashx?reqName=DashboardCharges&format=Json&cardIdx=&returnDataStructureLevel=1&cardIndexes=&accountNumber=&actionCode=0&identityId="

def __init__(self, asset_section, user_id=None, card_suffix=None, **asset_options):
# type: (str, str, str, ...) -> None
self.__user_id = user_id
self.__card_suffix = card_suffix
if not self.__user_id or not self.__card_suffix:
raise Exception("{} user ID or card suffix are missing".format(asset_section.capitalize()))
super(CardIsracard, self).__init__(asset_section, user="dummy", **asset_options)

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
headers = {"content-type": "application/x-www-form-urlencoded; charset=UTF-8"}
s = requests.Session()
s.get(self.LOGIN_URL)
Expand Down Expand Up @@ -45,11 +49,13 @@ def _establish_session(self, username, password):
s.post(self.LOGIN_POST_URL, data=post_data_str, headers=headers)
return s

def get_credit(self):
def _get_credit(self):
# type: () -> float
card_data_raw = self._session.get(self.CARD_DATA_URL).text
card_data = json.loads(card_data_raw)
upcoming_billing = card_data["DashboardChargesBean"]["inOut"][0]["nextTotalsInOut"][0]["billingSumSekelInOut"]
return format_value("-" + upcoming_billing, 'Credit')

def get_next(self):
def _get_next(self):
# type: () -> float
return 0
11 changes: 9 additions & 2 deletions assets/card_leumi.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import requests

from .bank_leumi import BankLeumi
from .common import CardBase, print_value

Expand All @@ -6,16 +8,21 @@ class CardLeumi(CardBase):
TOTAL_RE = r'{\\"AccountType\\":\\"CREDITCARD\\",\\"TotalPerAccountType\\":(.+?)}'

def __init__(self, asset_section, **asset_options):
# type: (str, ...) -> None
super(CardLeumi, self).__init__(asset_section, **asset_options)
self.__bank_instance = BankLeumi(asset_section, print_info=False, **asset_options)

def _establish_session(self, username, password):
# type: (str, str) -> requests.Session
# noinspection PyTypeChecker
return None

def get_credit(self):
def _get_credit(self):
# type: () -> float
credit = self.__bank_instance.get_total_values()['Creditcard']
print_value(credit, 'Credit')
return credit

def get_next(self):
def _get_next(self):
# type: () -> float
return 0
Loading