Skip to content

Instantly share code, notes, and snippets.

@franga2000
Created March 30, 2020 18:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save franga2000/eb794aaaeebbebf57e37d7d0c7def517 to your computer and use it in GitHub Desktop.
Save franga2000/eb794aaaeebbebf57e37d7d0c7def517 to your computer and use it in GitHub Desktop.
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