Repository navigation
Expand file tree
/
Copy pathclient.py
More file actions
93 lines (74 loc) · 2.95 KB
/
Copy pathclient.py
File metadata and controls
93 lines (74 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import monobank
from datetime import datetime, date, timedelta
from monobank.utils import to_timestamp
from monobank.signature import SignKey
from monobank.transport import api_request
class ClientBase(object):
def _get_headers(self, url):
raise NotImplementedError("Please implement _get_headers")
def make_request(self, method, path, **kwargs):
headers = self._get_headers(path)
return api_request(method, path, headers=headers, **kwargs)
def get_currency(self):
return self.make_request("GET", "/bank/currency")
def get_client_info(self):
return self.make_request("GET", "/personal/client-info")
def get_statements(self, account, date_from, date_to=None):
if date_to is None:
date_to = date_from
assert date_from <= date_to, "date_from must be <= date_to"
if isinstance(date_to, date):
# dates converted to timestamps of the same day but 00:00
# which is not very practical
# in that case we moving 24 hours ahead to include desired date:
date_to += timedelta(days=1)
t_from, t_to = to_timestamp(date_from), to_timestamp(date_to)
url = f"/personal/statement/{account}/{t_from}/{t_to}"
return self.make_request("GET", url)
def create_webhook(self, url):
return self.make_request("POST", "/personal/webhook", json={"webHookUrl": url,})
class Client(ClientBase):
"Personal API"
def __init__(self, token):
self.token = token
def _get_headers(self, url):
return {
"X-Token": self.token,
}
class CorporateClient(ClientBase):
"Corporate API"
def __init__(self, request_id, private_key):
self.request_id = request_id
self.key = SignKey(private_key)
def _get_headers(self, url):
headers = {
"X-Key-Id": self.key.key_id(),
"X-Time": str(to_timestamp(datetime.now())),
"X-Request-Id": self.request_id,
}
data = headers["X-Time"] + headers["X-Request-Id"] + url
headers["X-Sign"] = self.key.sign(data)
return headers
def check(self):
"Checks if user approved access request"
try:
self.make_request("GET", "/personal/auth/request")
return True
except monobank.Error as e:
if e.response.status_code == 401:
return False
raise
def access_request(permissions, private_key, callback_url=None):
"Creates an access request for corporate api user"
key = SignKey(private_key)
headers = {
"X-Key-Id": key.key_id(),
"X-Time": str(to_timestamp(datetime.now())),
"X-Permissions": permissions,
}
if callback_url:
headers["X-Callback"] = callback_url
path = "/personal/auth/request"
sign_str = headers["X-Time"] + headers["X-Permissions"] + path
headers["X-Sign"] = key.sign(sign_str)
return api_request("POST", path, headers=headers)