Skip to content

Commit 9b5a32f

Browse files
committed
v2.0.0
* Automated Payouts * Support to BlockBee Checkout page * Various improvements
1 parent 79046cd commit 9b5a32f

File tree

6 files changed

+775
-63
lines changed

6 files changed

+775
-63
lines changed

README.md

Lines changed: 448 additions & 21 deletions
Large diffs are not rendered by default.

blockbee/BlockBee.py

Lines changed: 126 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
"""
44

55
import requests
6+
import json
67
from requests.models import PreparedRequest
78

9+
from urllib.parse import urljoin, urlencode
10+
811

912
class BlockBeeHelper:
1013
BLOCKBEE_URL = 'https://api.blockbee.io/'
@@ -47,7 +50,7 @@ def get_address(self):
4750
if self.own_address is not None:
4851
params['address'] = self.own_address
4952

50-
_address = BlockBeeHelper.process_request(coin, endpoint='create', params=params)
53+
_address = BlockBeeHelper.process_request_get(coin, endpoint='create', params=params)
5154
if _address:
5255
self.payment_address = _address['address_in']
5356
return _address
@@ -71,7 +74,7 @@ def get_logs(self):
7174
'apikey': self.api_key
7275
}
7376

74-
_logs = BlockBeeHelper.process_request(coin, endpoint='logs', params=params)
77+
_logs = BlockBeeHelper.process_request_get(coin, endpoint='logs', params=params)
7578

7679
if _logs:
7780
return _logs
@@ -82,16 +85,21 @@ def get_qrcode(self, value='', size=300):
8285
if self.coin is None:
8386
return None
8487

88+
address = self.payment_address
89+
90+
if not address:
91+
address = self.get_address().get('address_in')
92+
8593
params = {
86-
'address': self.payment_address,
94+
'address': address,
8795
'size': size,
8896
'apikey': self.api_key
8997
}
9098

9199
if value:
92100
params['value'] = value
93101

94-
_qrcode = BlockBeeHelper.process_request(self.coin, endpoint='qrcode', params=params)
102+
_qrcode = BlockBeeHelper.process_request_get(self.coin, endpoint='qrcode', params=params)
95103

96104
if _qrcode:
97105
return _qrcode
@@ -108,7 +116,7 @@ def get_conversion(self, from_coin, value, api_key):
108116
'apikey': api_key
109117
}
110118

111-
_value = BlockBeeHelper.process_request(self.coin, endpoint='convert', params=params)
119+
_value = BlockBeeHelper.process_request_get(self.coin, endpoint='convert', params=params)
112120

113121
if _value:
114122
return _value
@@ -120,7 +128,7 @@ def get_info(coin, api_key):
120128
if api_key is None:
121129
raise Exception("API Key Missing")
122130

123-
_info = BlockBeeHelper.process_request(coin, endpoint='info', params={
131+
_info = BlockBeeHelper.process_request_get(coin, endpoint='info', params={
124132
'apikey': api_key
125133
})
126134

@@ -161,33 +169,110 @@ def get_estimate(coin, addresses=1, priority='default', api_key=''):
161169
'apikey': api_key
162170
}
163171

164-
_estimate = BlockBeeHelper.process_request(coin, endpoint='estimate', params=params)
172+
_estimate = BlockBeeHelper.process_request_get(coin, endpoint='estimate', params=params)
165173

166174
if _estimate:
167175
return _estimate
168176

169177
return None
170178

171179
@staticmethod
172-
def create_payout(coin, address, value, api_key=''):
173-
if api_key is None:
174-
raise Exception("API Key Missing")
180+
def create_payout(coin, payout_requests, api_key, process=False):
181+
if not payout_requests:
182+
raise ValueError('No requests provided')
183+
184+
body = {'outputs': payout_requests}
185+
186+
endpoint = 'payout/request/bulk'
187+
188+
if process:
189+
endpoint = endpoint + '/process'
190+
191+
_payout = BlockBeeHelper.process_request_post(coin, endpoint, api_key, body, True)
192+
193+
if _payout.get('status') == 'success':
194+
return _payout
195+
196+
return None
197+
198+
@staticmethod
199+
def list_payouts(coin, status = 'all', page = 1, api_key = '', payout_request=False):
200+
if not api_key:
201+
return None
175202

176203
params = {
177-
'value': value,
178-
'address': address,
179-
'apikey': api_key
204+
'apikey': api_key,
205+
'status': status,
206+
'page': page
180207
}
181208

182-
_payout = BlockBeeHelper.process_request(coin, endpoint='payout/request/create', params=params)
209+
endpoint = 'payout/list'
210+
211+
if payout_request:
212+
endpoint = 'payout/request/list'
213+
214+
_payouts = BlockBeeHelper.process_request_get(coin, endpoint, params)
215+
216+
if _payouts.get('status') == 'success':
217+
return _payouts
218+
219+
return None
220+
221+
@staticmethod
222+
def get_payout_wallet(coin, api_key, balance=False):
223+
wallet = BlockBeeHelper.process_request_get(coin, 'payout/address', {'apikey': api_key})
224+
225+
if wallet.get('status') != 'success':
226+
return None
227+
228+
output = {'address': wallet.get('address')}
229+
230+
if balance:
231+
wallet_balance = BlockBeeHelper.process_request_get(coin, 'payout/balance', {'apikey': api_key})
232+
233+
if wallet_balance.get('status') == 'success':
234+
output['balance'] = wallet_balance.get('balance')
235+
236+
return output
183237

184-
if _payout:
238+
@staticmethod
239+
def create_payout_by_ids(api_key, payout_ids):
240+
if not payout_ids:
241+
raise ValueError('Please provide the Payout Request(s) ID(s)')
242+
243+
_payout = BlockBeeHelper.process_request_post('', 'payout/create', api_key, {'request_ids': ','.join(map(str, payout_ids))})
244+
245+
if _payout.get('status') == 'success':
185246
return _payout
186247

187248
return None
188249

189250
@staticmethod
190-
def process_request(coin='', endpoint='', params=None):
251+
def process_payout(api_key, payout_id):
252+
if not payout_id:
253+
return None
254+
255+
_process = BlockBeeHelper.process_request_post('', 'payout/process', api_key, {'payout_id': payout_id})
256+
257+
if _process.get('status') == 'success':
258+
return _process
259+
260+
return None
261+
262+
@staticmethod
263+
def check_payout_status(api_key, payout_id):
264+
if not id:
265+
raise ValueError('Please provide the Payout ID')
266+
267+
_status = BlockBeeHelper.process_request_post('', 'payout/status', api_key, {'payout_id': payout_id})
268+
269+
if _status.get('status') == 'success':
270+
return _status
271+
272+
return None
273+
274+
@staticmethod
275+
def process_request_get(coin='', endpoint='', params=None):
191276
if coin != '':
192277
coin += '/'
193278

@@ -202,3 +287,28 @@ def process_request(coin='', endpoint='', params=None):
202287
)
203288

204289
return response.json()
290+
291+
@staticmethod
292+
def process_request_post(coin='', endpoint='', apiKey='', body=None, isJson=False):
293+
if coin:
294+
coin_path = coin.replace('_', '/') + '/'
295+
else:
296+
coin_path = ''
297+
298+
url = urljoin(BlockBeeHelper.BLOCKBEE_URL, f"{coin_path}{endpoint}/")
299+
url += '?' + urlencode({'apikey': apiKey})
300+
301+
headers = {
302+
'Host': BlockBeeHelper.BLOCKBEE_HOST,
303+
}
304+
305+
if isJson:
306+
headers['Content-Type'] = 'application/json'
307+
data = json.dumps(body)
308+
else:
309+
headers['Content-Type'] = 'application/x-www-form-urlencoded'
310+
data = urlencode(body)
311+
312+
response = requests.post(url, headers=headers, data=data)
313+
314+
return response.json()

blockbee/BlockBeeCheckout.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
"""
2+
BlockBee's Checkout Python Helper
3+
"""
4+
5+
import requests
6+
from requests.models import PreparedRequest
7+
8+
9+
class BlockBeeCheckoutHelper:
10+
BLOCKBEE_URL = 'https://api.blockbee.io/'
11+
BLOCKBEE_HOST = 'api.blockbee.io'
12+
13+
def __init__(self, api_key, parameters=None, bb_params=None):
14+
if parameters is None:
15+
parameters = {}
16+
17+
if bb_params is None:
18+
bb_params = {}
19+
20+
if api_key is None:
21+
raise Exception("API Key Missing")
22+
23+
self.parameters = parameters
24+
self.bb_params = bb_params
25+
self.api_key = api_key
26+
27+
def payment_request(self, redirect_url, value):
28+
if redirect_url is None or value is None:
29+
return None
30+
31+
if self.parameters:
32+
req = PreparedRequest()
33+
req.prepare_url(redirect_url, self.parameters)
34+
redirect_url = req.url
35+
36+
params = {
37+
'redirect_url': redirect_url,
38+
'apikey': self.api_key,
39+
'value': value,
40+
**self.bb_params}
41+
42+
_request = BlockBeeCheckoutHelper.process_request('', endpoint='checkout/request', params=params)
43+
if _request['status'] == 'success':
44+
return _request
45+
return None
46+
47+
@staticmethod
48+
def payment_logs(token, api_key):
49+
if token is None or api_key is None:
50+
return None
51+
52+
params = {
53+
'apikey': api_key,
54+
'token': token
55+
}
56+
57+
_request = BlockBeeCheckoutHelper.process_request('', endpoint='checkout/logs', params=params)
58+
59+
if _request['status'] == 'success':
60+
return _request
61+
return None
62+
63+
def deposit_request(self, notify_url):
64+
if notify_url is None:
65+
return None
66+
67+
if self.parameters:
68+
req = PreparedRequest()
69+
req.prepare_url(notify_url, self.parameters)
70+
notify_url = req.url
71+
72+
params = {
73+
'notify_url': notify_url,
74+
'apikey': self.api_key,
75+
**self.bb_params}
76+
77+
_request = BlockBeeCheckoutHelper.process_request('', endpoint='deposit/request', params=params)
78+
79+
if _request['status'] == 'success':
80+
return _request
81+
return None
82+
83+
@staticmethod
84+
def deposit_logs(token, api_key):
85+
if token is None or api_key is None:
86+
return None
87+
88+
params = {
89+
'apikey': api_key,
90+
'token': token
91+
}
92+
93+
_request = BlockBeeCheckoutHelper.process_request('', endpoint='deposit/logs', params=params)
94+
95+
if _request['status'] == 'success':
96+
return _request
97+
return None
98+
99+
@staticmethod
100+
def process_request(coin='', endpoint='', params=None):
101+
if coin != '':
102+
coin += '/'
103+
104+
response = requests.get(
105+
url="{base_url}{coin}{endpoint}/".format(
106+
base_url=BlockBeeCheckoutHelper.BLOCKBEE_URL,
107+
coin=coin.replace('_', '/'),
108+
endpoint=endpoint,
109+
),
110+
params=params,
111+
headers={'Host': BlockBeeCheckoutHelper.BLOCKBEE_HOST},
112+
)
113+
114+
return response.json()

blockbee/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
from .BlockBee import BlockBeeHelper
1+
from .BlockBee import BlockBeeHelper
2+
from .BlockBeeCheckout import BlockBeeCheckoutHelper

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
name='python-blockbee',
1212

13-
version='1.1.1',
13+
version='2.0.0',
1414

1515
packages=find_packages(),
1616

0 commit comments

Comments
 (0)