1

Trying to work through this signed request example script with no success.

I notice both "http_method" and "params" in "def send_signed_request" are both greyed out to indicate unused code.

I have tried to add the params to the request as below, but that's not going to solve the unused code issue, both are still showing as unused code.

response = send_signed_request('POST', '/sapi/v1/margin/loan', {"asset": "", "isIsolated": "TRUE", "symbol": "", "amount": ""} ) print(response)

I'm just learning Python and maybe missing some assumed knowledge I guess and have been reading a lot to no avail before posting.

I read somewhere that Binance are seeing lots of traders spending hours trying to solve signature authentication as I am, and maybe this will help others in the same situation.

thx in advance to anyone that takes a look.

Just to clarify the script didn't come from Binance and I would have to dig for the link if anyone wants it.

import hmac
import time
import hashlib
import requests
from urllib.parse import urlencode

KEY = ''
SECRET = ''
BASE_URL = 'https://sapi.binance.com' # production base url
#BASE_URL = 'https://testnet.binancefuture.com' # testnet base url


''' ======  begin of functions, you don't need to touch ====== '''
def hashing(query_string):
    return hmac.new(SECRET.encode('utf-8'), query_string.encode('utf-8'), hashlib.sha256).hexdigest()

def get_timestamp():
    return int(time.time() * 1000)

def dispatch_request(http_method):
    session = requests.Session()
    session.headers.update({
        'Content-Type': 'application/json;charset=utf-8',
        'X-MBX-APIKEY': KEY
    })
    return {
        'GET': session.get,
        'DELETE': session.delete,
        'PUT': session.put,
        'POST': session.post,
    }.get(http_method, 'GET')


# used for sending request requires the signature
def send_signed_request(http_method, url_path, payload={}):
    query_string = urlencode(payload)
    
    url = BASE_URL + url_path + '?' + query_string + '&signature=' + hashing(query_string)
    
    params = {'url': url, 'params': {}}
    

    # used for sending public data request
    # def send_public_request(url_path, payload={}):
    #     query_string = urlencode(payload, True)
    #     url = BASE_URL + url_path
    #     if query_string:
    #         url = url + '?' + query_string
    #     print("{}".format(url))
    #     response = dispatch_request('GET')(url=url)
    #     return response.json()

    response = send_signed_request('POST', '/sapi/v1/margin/loan', params )
    print(response)

Below is a working script if anyone has the same issue

import hmac
import time
import hashlib
import requests
from urllib.parse import urlencode

KEY = ''
SECRET= '' 

BASE_URL = 'https://api.binance.com' # production base url
#BASE_URL = 'https://testnet.binancefuture.com' # testnet base url


''' ======  begin of functions, you don't need to touch ====== '''
def hashing(query_string):
    return hmac.new(SECRET.encode('utf-8'), query_string.encode('utf-8'), hashlib.sha256).hexdigest()

def get_timestamp():
    return int(time.time() * 1000)

def dispatch_request(http_method):
    session = requests.Session()
    session.headers.update({
        'Content-Type': 'application/json;charset=utf-8',
        'X-MBX-APIKEY': KEY
    })
    return {
        'GET': session.get,
        'DELETE': session.delete,
        'PUT': session.put,
        'POST': session.post,
    }.get(http_method, 'GET')


# used for sending request requires the signature
def send_signed_request(http_method, url_path, payload={}):
    query_string = urlencode(payload)
    # replace single quote to double quote
    query_string = query_string.replace('%27', '%22')
    if query_string:
        query_string = "{}&timestamp={}".format(query_string, get_timestamp())
    else:
        query_string = 'timestamp={}'.format(get_timestamp())

    url = BASE_URL + url_path + '?' + query_string + '&signature=' + hashing(query_string)
    print("{} {}".format(http_method, url))
    params = {'url': url, 'params': {}}
    response = dispatch_request(http_method)(**params)
    print(response)
    return response.json()

# used for sending public data request
def send_public_request(url_path, payload={}):
    query_string = urlencode(payload, True)
    url = BASE_URL + url_path
    if query_string:
        url = url + '?' + query_string
    print("{}".format(url))
    response = dispatch_request('GET')(url=url)
    return response.json()

#response = send_signed_request('GET', '/api/v3/time')
#print(response)

response = send_signed_request('POST', '/sapi/v1/margin/loan', {"asset": "SHIB", "isIsolated": "TRUE", "symbol": "SHIBUSDT", "amount": "1000.00"} )
print(response)
Edda
  • 11
  • 3

0 Answers0