BitBay 3.0 API - problem z POST request

Początkujący
Posty: 2
Rejestracja: 18 lipca 2018
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: wojtekr » środa, 18 lipca 2018, 17:25

Witam,

Na wstepie
Mam problem z API request ktore wymaga podania parametrow (np. placing orders). Problem tyczy sie nowego API 3.0 na gieldzie bitbay.net.
Przepisuje dzialajacy kod z API 2.0 do API 3.0. Trzymam sie oficjalnej dokumentacji https://docs.bitbay.net/v3.1.0/docs

Moj kod w python3.6 (wciecia sie wyrownaly niestety ale mysle ze jest czytelnie)
import requests
import json
import uuid
import time
import hashlib
import hmac

credentials = {'priv': 'xxx', 'pub': 'xxx'}
payload = {
'url':'https://api.bitbay.net/rest/trading/offer/BTC-PLN',
'params':{
'mode':'limit',
'offerType':'Sell',
'amount':'0.01',
'rate':'30000.0',
}
}
timestamp = str(int(time.time()))
string_data = credentials ['pub'] + timestamp + str(payload['params'])
sign = hmac.new(
credentials['priv'].encode(),
string_data.encode(),
hashlib.sha512
)
payload['headers'] = {
'API-Hash':sign.hexdigest(),
'API-Key': credentials['pub'],
'Request-Timestamp': timestamp,
'Operation-Id': str(uuid.uuid4())}
server_response = requests.post(**payload).json()
Problem
Powyzszy kod zwraca blad: INVALID_HASH_SIGNATURE
Zaznaczam ze podobny kod tylko bez parametrow, ktory korzysta z requests.get() dziala poprawnie (np. balance query), wiec domyslam sie ze problem tkwi w tym jak przekazuje parametry. Kontaktowalem sie juz z supportem z bitbay ale sa malo pomocni, mam wrazenie ze przydzielili do mnie jakiegos praktykanta...

Czy ktos bylby w stanie mi w tym pomoc?

Pozdrawiam,
Wojtek

Początkujący
Posty: 40
Rejestracja: 12 lipca 2017
Reputacja: 18
Reputacja postu: 
0
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: grzgrzgrz3 » środa, 18 lipca 2018, 17:51

Nie dam Ci gotowego rozwiązania ale Ci podpowiem, pomęcz się sam.

Podpowiedz:

:idea: json != dict

Kod: Zaznacz cały

grzegorz@grzegorz-VirtualBox:~/tmp/cypher$ python3 -c 'print({"test": "test"})' | jq
parse error: Invalid numeric literal at line 1, column 8

Kod: Zaznacz cały

grzegorz@grzegorz-VirtualBox:~/tmp/cypher$ man jq | head -5
JQ(1) 

NAME
       jq - Command-line JSON processor

EDIT: zmieniłem trochę podpowiedz :)

Początkujący
Posty: 2
Rejestracja: 18 lipca 2018
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: wojtekr » czwartek, 19 lipca 2018, 11:14

@grzgrzgrz3 dzieki za podpowiedz, dalo rade. Daj adres BCH albo DASH to ci wysle tipa;) na transakcje BTC mnie nie stac.

A wiec, dla kolejnych zagubionych.

W powyzszym kodzie sa dwa bledy.
1. dane do requesta nalezy podac jako "data" a nie "params"
2. "data" nalezy podac jako string (albo json.dumps()) a nie dict
3. nie jest to obowiazkowe ale powinno sie rowniez okreslic parametry 'postOnly', 'hidden' oraz 'fillOrKill'
4. rowniez nie obowiazkowo, ale w nowej dokumentacji znalazlem ze nalezy rowniez podac header 'Content-Type' - nie wiem po co to jest, dziala bez tego

Poprawiony, dzialajacy kod:
import requests
import json
import uuid
import time
import hashlib
import hmac

credentials = {'priv': 'xxx', 'pub': 'xxx'}
payload = {
'url':'https://api.bitbay.net/rest/trading/offer/BTC-PLN',
'data':str(
{
'amount':0.01,
'rate':30000.0,
'offerType':'sell',
'mode':'limit',
'postOnly':False,
'hidden':False,
'fillOrKill':False,
}
)
}

timestamp = str(int(time.time()))
string_data = credentials['pub'] + timestamp + payload['data']
sign = hmac.new(
credentials['priv'].encode(),
string_data.encode(),
hashlib.sha512
)
payload['headers'] = {
'API-Hash':sign.hexdigest(),
'API-Key': credentials['pub'],
'Request-Timestamp': timestamp,
'operation-id': str(uuid.uuid4()),
'Content-Type':'application/json',
}
raw_response = requests.post(**payload).json()
Pozatym bitbay udostepnil wzbogacona dokumentacje ktora jest o wiele bardziej kompletna
https://docs.bitbay.net/v3.2.1/

Pozdrawiam,
Wojtek;)

Początkujący
Posty: 101
Rejestracja: 20 kwietnia 2019
Reputacja: 118
Reputacja postu: 
0
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: bitex » poniedziałek, 18 stycznia 2021, 03:25

Witam

Sorry za odgrzebanie :p Mam podobny problem z API Bitbaya. Korzystam z https://docs.bitbay.net/reference

Użyłem powyższego kodu z ostatniego posta i dostawałem bład IVALUD_REQUEST

to chyba temu, że bitbay nie obsługuje już POSTa w api prywatnym? Zmieniłem nieco kod i teraz dostaje INVALID_HASH_SIGNATURE

Mój kod wygląda tak:

import requests
import json
import uuid
import time
import hashlib
import hmac

credentials = {'priv': 'xxx', 'pub': 'yyy'}

payload = {
'url':'https://api.bitbay.net/rest/trading/offer/BTC-PLN',
'data':str(
{
'amount':0.0001,
'rate':150000.0,
'offerType':'sell',
'mode':'limit',
'postOnly':False,
'hidden':False,
'fillOrKill':False,
}
)
}

timestamp = str(int(time.time()))
print(timestamp)

string_data = credentials['pub'] + timestamp + payload['data']

sign = hmac.new(
credentials['priv'].encode(),
string_data.encode(),
hashlib.sha512
)

headers = {
'API-Hash': sign.hexdigest(),
'API-Key': credentials['pub'],
'Request-Timestamp': timestamp,
'operation-id': str(uuid.uuid4()),
'Content-Type':'application/json',
}

#raw_response = requests.post(**payload).json()

response = requests.get( url=payload['url'], headers=headers, data=payload['data'])

print(response.text)

Trochę tego nie rozumiem, bo szukając rozwiązania, wszyscy mają bardzo podobnie. Nagłówki się zgadzają, API-hash też, bo sprawdzałem ręcznie przy takich samych wejściach.

Byłby ktoś w stanie pomóc?

Gaduła
Posty: 307
Rejestracja: 20 maja 2011
Reputacja: 28
Reputacja postu: 
1
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: doooku » poniedziałek, 18 stycznia 2021, 12:24

mam tylko kod w scali a nie pythonie ale mozę cię nakieruje. Pamietam że tez sporo się bujałem zanim się udało połączyć.
  private def getMyTransactionsRec(start: DateTime, end: DateTime, pair: CurrencyPair, cursor: String,alreadyDownloaded :Int): Future[Try[MyBitbayTrades]] = {
    val time = DateTime.now().getMillis / 1000
    val params = s"""{"nextPageCursor":"$cursor"}"""
    val algo = Algo.hmac(privateKey).sha512
    val data = s"$publicKey${time}"
    val hash: String = algo(data).hex
    val request = ws.url(s"https://api.bitbay.net/rest/trading/history/transactions?query=${URLEncoder.encode(params, "UTF-8")}")
      .addHttpHeaders(
        "API-Key" -> publicKey,
        "API-Hash" -> hash,
        "operation-id" -> UUID.randomUUID().toString,
        "Request-Timestamp" -> s"$time",
        "content-type" -> s"application/json"
      )
      .withFollowRedirects(true)
    request.get
      .flatMap { response =>
        response.status match {
          case 200 =>
            response.json.validate[MyBitbayTrades] match {
              case JsSuccess(oldItems, path) => {
                if ((oldItems.totalRows.toInt - (oldItems.items.size + alreadyDownloaded))>0)
                  getMyTransactionsRec(start, end, pair, oldItems.nextPageCursor.get,alreadyDownloaded+oldItems.items.size) map {
                    case Success(newItems) => Success(newItems.addItems(oldItems.items))
                    case Failure(exception) => Failure(exception)
                  }
                else
                  Future(Success(oldItems))
              }
              case JsError(error) =>
                logger.error(error.toString())
                Future(Failure(new Exception(s"Invalid response body")))
            }
          case code: Int =>
            logger.error("invalid response code")
            logger.error(response.toString)
            logger.error(response.body)
            Future(Failure(new Exception(s"Invalid response code:$code")))
        }
      }
  }

Początkujący
Posty: 101
Rejestracja: 20 kwietnia 2019
Reputacja: 118
Reputacja postu: 
0
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: bitex » poniedziałek, 18 stycznia 2021, 19:28

Hmm, spróbowałem też pobrać historie transakcji jak w twoim przypadku (Z tym że nadal wszystko w pythonie) i o dziwo działa. W kodzie w zasadzie nie zmieniałem nic co związane z autentykacją i kluczami, zmieniłem jedynie URL i payload.

Mógłbyś się podzielić kodem do tworzenia nowej transakcji? Albo jaki kolwiek, którymś coś zlecasz a nie pobierasz.

I takie pytanie. Czy ty używasz gdzieś w ogóle posta, czy wszystko robisz GETem ?

Gaduła
Posty: 307
Rejestracja: 20 maja 2011
Reputacja: 28
Reputacja postu: 
0
Napiwki za post: 0 BTC

BitBay 3.0 API - problem z POST request

Postautor: doooku » poniedziałek, 18 stycznia 2021, 20:51

Niestety nie robiłem żadnych postów. Z tego co pamiętam kluczowe było wybranie elementów potrzebnych do podpisu.

Zamiast słownika pythonowego spróbuj zeby payload['data'] był stringiem zawierającym JSONa. Na potrzeby posta słownik elegancko zmienia się w stringa, ale wydaje mi się że biblioteka od podpisów traktuje to trochę inaczej.

Wróć do „Programowanie i wdrożenia”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości