diff --git a/binance/async_client.py b/binance/async_client.py index 7bd8442aa..1cbc74bb1 100644 --- a/binance/async_client.py +++ b/binance/async_client.py @@ -128,10 +128,23 @@ async def _request( uri = f"{uri}?{kwargs['params']}" kwargs.pop("params") + data = kwargs.get("data") + if data is not None: + del kwargs["data"] + + if signed and self.PRIVATE_KEY and data: # handle issues with signing using eddsa/rsa and POST requests + dict_data = Client.convert_to_dict(data) + signature = dict_data["signature"] if "signature" in dict_data else None + if signature: + del dict_data["signature"] + url_encoded_data = urlencode(dict_data) + data = f"{url_encoded_data}&signature={signature}" + async with getattr(self.session, method)( yarl.URL(uri, encoded=True), proxy=self.https_proxy, headers=headers, + data=data, **kwargs, ) as response: self.response = response diff --git a/binance/base_client.py b/binance/base_client.py index e36eff8a3..2b4ace83f 100644 --- a/binance/base_client.py +++ b/binance/base_client.py @@ -312,6 +312,11 @@ def _rsa_signature(self, query_string: str): def encode_uri_component(uri, safe="~()*!.'"): return _urlencode.quote(uri, safe=safe) + @staticmethod + def convert_to_dict(list_tuples): + dictionary = dict((key, value) for key, value in list_tuples) + return dictionary + def _ed25519_signature(self, query_string: str): assert self.PRIVATE_KEY res = b64encode( diff --git a/binance/client.py b/binance/client.py index c8dd14f8b..388aa5957 100755 --- a/binance/client.py +++ b/binance/client.py @@ -71,7 +71,19 @@ def _request( kwargs = self._get_request_kwargs(method, signed, force_params, **kwargs) - self.response = getattr(self.session, method)(uri, headers=headers, **kwargs) + data = kwargs.get("data") + if data is not None: + del kwargs["data"] + + if signed and self.PRIVATE_KEY and data: # handle issues with signing using eddsa/rsa and POST requests + dict_data = Client.convert_to_dict(data) + signature = dict_data["signature"] if "signature" in dict_data else None + if signature: + del dict_data["signature"] + url_encoded_data = urlencode(dict_data) + data = f"{url_encoded_data}&signature={signature}" + + self.response = getattr(self.session, method)(uri, headers=headers, data=data, **kwargs) return self._handle_response(self.response) @staticmethod