Created
March 30, 2020 18:34
-
-
Save franga2000/eb794aaaeebbebf57e37d7d0c7def517 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from requests import Session | |
import pickle | |
import os | |
from os import path | |
from sys import exit | |
from getpass import getpass | |
class BNNotAuthenticatedException(Exception): | |
pass | |
class BankaNet(): | |
def __init__(self, url_base="https://bankanet.nkbm.si", user_agent="Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/74.0"): | |
self._url_base = url_base | |
self._api_base = self._url_base + "/bnk/resources/v1/" | |
self._sess = Session() | |
self._headers = { | |
"User-Agent": user_agent, | |
"nkbmSourceSystem": "bnk" | |
} | |
def _request(self, method, url, params={}, data={}, headers={}): | |
if headers: | |
headers = headers.clone() | |
headers.update(self._headers) | |
else: | |
headers = self._headers | |
return self._sess.request(method, url, params=params, data=data, headers=headers) | |
def _api_get(self, endpoint, *args, **kwargs): | |
resp = self._request("GET", self._api_base + endpoint, *args, **kwargs) | |
if resp.status_code == 401: | |
raise BNNotAuthenticatedException() | |
return resp.json() | |
def save_session(self, file): | |
if type(file) == str: | |
file = open(file, "wb") | |
pickle.dump(self._sess.cookies, file) | |
if type(file) == str: | |
file.close() | |
def load_session(self, file): | |
if type(file) == str: | |
file = open(file, "rb") | |
self._sess.cookies.update(pickle.load(file)) | |
if type(file) == str: | |
file.close() | |
def get_user_info(self): | |
self._request("GET", self._url_base + "/auth/prijava") | |
resp = self._api_get("/userApi/user/info") | |
return resp | |
def get_accounts(self): | |
resp = self._api_get("accountApi/accounts?balanceGet=true") | |
return resp | |
def login(self, username, password): | |
data = { | |
"p1": username, | |
"p2": password, | |
"action": "login", | |
"generateChallenge": 1, | |
"error": "loginAgain", | |
"platform": "web", | |
"version": 4.0 | |
} | |
self._request("GET", self._url_base + "/auth/prijava") | |
resp = self._request("POST", self._url_base + "/prijava/bnk", data=data) | |
print(resp, resp.headers, resp.request.headers, resp.request.body, resp.text) | |
return resp.text | |
def sms_otp(self, username, token): | |
data = { | |
"p1": username, | |
"p2": token, | |
"action": "login", | |
"authenticationType": "hsmsoob", | |
"error": "loginAgain", | |
"platform": "web", | |
"version": 4.0 | |
} | |
tr = self._request("GET", self._url_base) | |
resp = self._request("POST", self._url_base + "/prijava/bnk", data=data) | |
print(resp, resp.headers, resp.request.headers, resp.request.body, resp.text) | |
return resp.text | |
def check_logged_in(self): | |
try: | |
self.get_user_info() | |
return True | |
except BNNotAuthenticatedException: | |
return False | |
if __name__ == '__main__': | |
bn = BankaNet() | |
userinfo = None | |
SESSION_FILE = "bn_session.pickle" | |
if path.exists(SESSION_FILE): | |
print("Found session file; loading...") | |
bn.load_session(SESSION_FILE) | |
try: | |
userinfo = bn.get_user_info() | |
except BNNotAuthenticatedException: | |
print("Session was invalid; deleting...") | |
#os.remove(SESSION_FILE) | |
if not userinfo: | |
username = input("Username: ") | |
password = getpass("Password: ") | |
resp = bn.login(username, password) | |
if "invalid" in resp: | |
print("Prijava ni uspela:", login) | |
exit(1) | |
resp = bn.sms_otp(username, getpass("SMS token: ")) | |
if "invalid" in resp: | |
print("Prijava ni uspela:", login) | |
exit(1) | |
bn.save_session(SESSION_FILE) | |
userinfo = bn.get_user_info() | |
print("Welcome! You are logged in as", userinfo["username"], "-", userinfo["name"]) | |
print("ACCOUNTS:") | |
accounts = bn.get_accounts()["result"] | |
for account in accounts: | |
print("\t", account["contractName"] + ":") #+ "(" + account["contract"] + "):") | |
for balance in account["balances"]: | |
print("\t\t", str(balance["balance"]) + " " + balance["currency"]["name"], "(avail.", str(balance["balanceAvailable"]) + " " + balance["currency"]["name"] + ")") | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment