TypeError: must be str, not bytes - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: TypeError: must be str, not bytes (/thread-7356.html) Pages:
1
2
|
TypeError: must be str, not bytes - Zhsv - Jan-06-2018 Hi ! Error in this code: Traceback (most recent call last): File "C:/Cloud/Cripto/3.py", line 53, in <module> print (api_query("GetBalance")) File "C:/Cloud/Cripto/3.py", line 34, in api_query signature = API_KEY + "POST" + urllib.parse.quote_plus( url ).lower() + nonce + requestContentBase64String TypeError: must be str, not bytes Please help, code below. Thank you! import time import hmac import urllib import requests import hashlib import base64 import sys import json API_KEY = 'ac85417173...abdf98138e...02' API_SECRET = 'KY9R6bgPfQeDr2kV...rwm4aoGk0EvQwU...eduafbsk' def api_query( method, req = None ): if not req: req = {} print ("def api_query( method = " + method + ", req = " + str( req ) + " ):") time.sleep( 1 ) public_set = set([ "GetCurrencies", "GetTradePairs", "GetMarkets", "GetMarket", "GetMarketHistory", "GetMarketOrders" ]) private_set = set([ "GetBalance", "GetDepositAddress", "GetOpenOrders", "GetTradeHistory", "GetTransactions", "SubmitTrade", "CancelTrade", "SubmitTip" ]) if method in public_set: url = "https://www.cryptopia.co.nz/api/" + method if req: for param in req: url += '/' + str( param ) r = requests.get( url ) elif method in private_set: url = "https://www.cryptopia.co.nz/Api/" + method nonce = str( int( time.time() ) ) post_data = json.dumps( req ); m = hashlib.md5() m.update(post_data.encode('utf-8')) requestContentBase64String = base64.b64encode(m.digest()) signature = API_KEY + "POST" + urllib.parse.quote_plus( url ).lower() + nonce + requestContentBase64String hmacsignature = base64.b64encode(hmac.new(base64.b64decode( API_SECRET ), signature, hashlib.sha256).digest()) header_value = "amx " + API_KEY + ":" + hmacsignature + ":" + nonce headers = { 'Authorization': header_value, 'Content-Type':'application/json; charset=utf-8' } r = requests.post( url, data = post_data, headers = headers ) response = r.text print ("( Response ): " + response) return response.replace("false","False").replace("true","True").replace('":null','":None' ) # Public: # + # print api_query("GetCurrencies") # + print (api_query("GetMarket", [ 100, 6 ] )) # {"Success":True,"Message":None,"Data":{"TradePairId":100,"Label":"DOT/BTC","AskPrice":0.00000020,"BidPrice":0.00000019,"Low":0.00000019,"High":0.00000021,"Volume":1263556.65136394,"LastPrice ":0.00000019,"LastVolume":774.83684404,"BuyVolume":50896673.08961847,"SellVolume":33046510.52562918,"Change":0.0},"Error ":None} # Private: print (api_query("GetBalance")) # + # print api_query("GetBalance", {'CurrencyId':2} ) RE: TypeError: must be str, not bytes - Zhsv - Jan-06-2018 import time import hmac import urllib import requests import hashlib import base64 import sys import json API_KEY = 'ac85417173...abdf98138e...02' API_SECRET = 'KY9R6bgPfQeDr2kV...rwm4aoGk0EvQwU...eduafbsk' def api_query( method, req = None ): if not req: req = {} print ("def api_query( method = " + method + ", req = " + str( req ) + " ):") time.sleep( 1 ) public_set = set([ "GetCurrencies", "GetTradePairs", "GetMarkets", "GetMarket", "GetMarketHistory", "GetMarketOrders" ]) private_set = set([ "GetBalance", "GetDepositAddress", "GetOpenOrders", "GetTradeHistory", "GetTransactions", "SubmitTrade", "CancelTrade", "SubmitTip" ]) if method in public_set: url = "https://www.cryptopia.co.nz/api/" + method if req: for param in req: url += '/' + str( param ) r = requests.get( url ) elif method in private_set: url = "https://www.cryptopia.co.nz/Api/" + method nonce = str( int( time.time() ) ) post_data = json.dumps( req ); m = hashlib.md5() m.update(post_data.encode('utf-8')) requestContentBase64String = base64.b64encode(m.digest()) signature = API_KEY + "POST" + urllib.parse.quote_plus( url ).lower() + nonce + requestContentBase64String hmacsignature = base64.b64encode(hmac.new(base64.b64decode( API_SECRET ), signature, hashlib.sha256).digest()) header_value = "amx " + API_KEY + ":" + hmacsignature + ":" + nonce headers = { 'Authorization': header_value, 'Content-Type':'application/json; charset=utf-8' } r = requests.post( url, data = post_data, headers = headers ) response = r.text print ("( Response ): " + response) return response.replace("false","False").replace("true","True").replace('":null','":None' ) # Public: # + # print api_query("GetCurrencies") # + #print (api_query("GetMarket", [ 101, 6 ] )) # {"Success":True,"Message":None,"Data":{"TradePairId":100,"Label":"DOT/BTC","AskPrice":0.00000020,"BidPrice":0.00000019,"Low":0.00000019,"High":0.00000021,"Volume":1263556.65136394,"LastPrice":0.00000019,"LastVolume":774.83684404,"BuyVolume":50896673.08961847,"SellVolume":33046510.52562918,"Change":0.0},"Error":None} # Private: print (api_query("GetBalance")) # + # print api_query("GetBalance", {'CurrencyId':2} ) RE: TypeError: must be str, not bytes - wavic - Jan-06-2018 base64.b64encode(m.digest()) returns bytes. You have to convert it to string. RE: TypeError: must be str, not bytes - Zhsv - Jan-06-2018 (Jan-06-2018, 04:22 PM)wavic Wrote: base64.b64encode(m.digest()) returns bytes. You have to convert it to string. Thank You very much! And how to do it ? RE: TypeError: must be str, not bytes - wavic - Jan-06-2018 line 33: requestContentBase64String = base64.b64encode(m.digest()).decode('utf-8') RE: TypeError: must be str, not bytes - Zhsv - Jan-06-2018 (Jan-06-2018, 04:33 PM)wavic Wrote: line 33:Thank You very much! Now a new error Traceback (most recent call last): File "C:/Cloud/Cripto/3.py", line 53, in <module> print (api_query("GetBalance")) File "C:/Cloud/Cripto/3.py", line 35, in api_query hmacsignature = base64.b64encode(hmac.new(base64.b64decode( API_SECRET ), signature, hashlib.sha256).digest()) File "C:\Users\Сергей\AppData\Local\Programs\Python\Python36-32\lib\base64.py", line 87, in b64decode return binascii.a2b_base64(s) binascii.Error: Incorrect padding RE: TypeError: must be str, not bytes - wavic - Jan-06-2018 There is something with the API_SECRET value. See the altchars parameter. RE: TypeError: must be str, not bytes - Zhsv - Jan-06-2018 (Jan-06-2018, 05:16 PM)wavic Wrote: There is something with the API_SECRET value. See the altchars parameter. Thank you very much! I'll figure it out. Need to organize the query API to place the order. Trying to use existing code, as it is not out yet. RE: TypeError: must be str, not bytes - wavic - Jan-06-2018 Consider that base64.b64encode(hmac.new(base64.b64decode( API_SECRET ), signature, hashlib.sha256).digest()) will return bytes again. So you have to convert it to string. As before
RE: TypeError: must be str, not bytes - Zhsv - Jan-06-2018 (Jan-06-2018, 06:16 PM)wavic Wrote: Consider that Thank you very much! Now you will understand and change code. (Jan-06-2018, 06:25 PM)Zhsv Wrote:(Jan-06-2018, 06:16 PM)wavic Wrote: Consider that So changed. The error persists elif method in private_set: url = "https://www.cryptopia.co.nz/Api/" + method nonce = str( int( time.time() ) ) post_data = json.dumps( req ); m = hashlib.md5() m.update(post_data.encode('utf-8')) requestContentBase64String = base64.b64encode(m.digest()).decode('utf-8') signature = API_KEY + "POST" + urllib.parse.quote_plus( url ).lower() + nonce + requestContentBase64String hmacsignature = base64.b64encode(hmac.new(base64.b64decode( API_SECRET ), signature, hashlib.sha256).digest()).decode('utf-8') header_value = "amx " + API_KEY + ":" + hmacsignature + ":" + nonce headers = { 'Authorization': header_value, 'Content-Type':'application/json; charset=utf-8' } r = requests.post( url, data = post_data, headers = headers ) response = r.text
|