Wpis z mikrobloga

Uszanowanko,
Używał ktoś z was z private API #bitbay? Mam problem z zapytaniem - Cały czas dostaję 400 Bad Request.

Na stronie z opisem API:
400 At least one parameter wasn't set

Przykład z Bitbay w PHP:

$params["method"] = “info”;
$params["moment"] = time();
$post = http_build_query($params, "", "&");
$sign = hash_hmac("sha512", $post, $secret);
$headers = array(
"API-Key: " . $key,
"API-Hash: " . $sign,
);

function BitBay_Trading_Api($method, $params = array())
{
$key = "123";
$secret = "321";

$params["method"] = $method;
$params["moment"] = time();

$post = http_build_query($params, "", "&");
$sign = hash_hmac("sha512", $post, $secret);
$headers = array(
"API-Key: " . $key,
"API-Hash: " . $sign,
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, "[https://bitbay.net/API/Trading/tradingApi.php");](https://bitbay.net/API/Trading/tradingApi.php");)
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$ret = curl_exec($curl);

return $ret;
}

Mój kod w C++:

curl_global_init(CURL_GLOBAL_ALL);

CURL* curl = curl_easy_init();

if(curl)
{
string post = "method=info&moment=" + to_string(ntp.getNow());
string privateKey(PRIVATE_KEY);
string* hash = sha512.hash(&post, &privateKey);

struct curl_slist* header = NULL;
header = curl_slist_append(header, string("Content-Type: text/plain; charset=utf-8").c_str());
header = curl_slist_append(header, string("API-Key: " + string(PUBLIC_KEY)).c_str());
header = curl_slist_append(header, string("API-Hash: " + *hash).c_str());

delete hash;

CURLcode res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);

curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_URL, PRIVATE_API_URL);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, post.length());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post.c_str());

res = curl_easy_perform(curl);

if(res != CURLE_OK)
{
cerr< Send header, 0000000260 bytes (0x00000104)
0000: 50 4f 53 54 20 2f 41 50 49 2f 54 72 61 64 69 6e POST /API/Tradin
0010: 67 2f 74 72 61 64 69 6e 67 41 70 69 2e 70 68 70 g/tradingApi.php
0020: 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a HTTP/1.1..Host:
0030: 20 62 69 74 62 61 79 2e 6e 65 74 0d 0a 41 63 63 bitbay.net..Acc
0040: 65 70 74 3a 20 2a 2f 2a 0d 0a 43 6f 6e 74 65 6e ept: */*..Conten
0050: 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 t-Type: text/pla
0060: 69 6e 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d in; charset=utf-
0070: 38 0d 0a 41 50 49 2d 4b 65 79 3a 20 33 66 34 37 8..API-Key: 3f47
[…]
00a0: 0d 0a 41 50 49 2d 48 61 73 68 3a 20 f0 f9 9d 93 ..API-Hash: ....
00b0: 23 79 84 48 bc bc 67 c3 41 4a 58 6c 3f 7a 2d 70 #y.H..g.AJXl?z-p
00c0: 37 1e 5d f1 e6 43 8b 41 f7 10 e9 ad 75 cd 63 8c 7.]..C.A....u.c.
00d0: 0e 56 b6 39 42 42 4e 96 74 e2 09 93 c2 2a ae c4 .V.9BBN.t....*..
00e0: 0c a0 ca 62 90 1b 44 21 bd 84 e5 76 0d 0a 43 6f ...b..D!...v..Co
00f0: 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 32 39 ntent-Length: 29
0100: 0d 0a 0d 0a ....
=> Send data, 0000000029 bytes (0x0000001d)
0000: 6d 65 74 68 6f 64 3d 69 6e 66 6f 26 6d 6f 6d 65 method=info&mome
0010: 6e 74 3d 31 35 32 35 39 35 32 36 36 35 nt=1525952665
== Info: upload completely sent off: 29 out of 29 bytes
<= Recv header, 0000000026 bytes (0x0000001a)
0000: 48 54 54 50 2f 31 2e 31 20 34 30 30 20 42 61 64 HTTP/1.1 400 Bad
0010: 20 52 65 71 75 65 73 74 0d 0a Request..

https://bitbay.net/pl/api-prywatne

Jakieś sugestie, co może być nie tak?

#kryptowaluty #bitbay #programowanie #webdev
  • 10
  • Odpowiedz
@Amelcio: Tak, jestem pewien:
1. Tylko kilka znaków klucza publicznego, którym i tak możesz tylko zapychać limit zapytań.
2. Hash to hash - działa w jedną stronę, nie wyciągniesz z tego klucza prywatnego
3. Użyte klucze pozwalają tylko na pobieranie podstawowych informacji.

Bardziej obawiam się że stracę trochę na błędach programu, który robię. Na razie piszę adapter do zapytań i wysyłam je tylko po to aby sprawdzić czy wszystko ok i
  • Odpowiedz
@Amelcio: Piszę coś co ma docelowo być botem. Mały wolumen nie będzie akurat dla niego problemem. Całość projektuję i robię tak, aby część odpowiadająca za komunikację z giełdą była odizolowana od reszty. Zmiana giełdy będzie tylko kwestią napisania adaptera do jej API i jego podmienienia.
  • Odpowiedz
@Amelcio: To zależy od bota i togo co robi.

Pozycje będę otwierał sam, a bot będzie miał za zadanie obracać tym co mam w pewien sposób. Jeżeli kurs się za bardzo wahnie to nie będzie problem bo i tak pozycje są długoterminowe. Proof of concept zrobiony obracając ręcznie. Bot powinien radzić sobie dużo lepiej ode mnie.
  • Odpowiedz
@tenLoginTezJestZajety: Upewnij się że masz czas w dobrym formacie i ogólnie że jest dobry - pewnie wymagają UTC. Najlepiej odpal też kod w php i dla takich samych danych wejściowych (klucz/time/cokolwiek innego) sprawdź czy dostajesz takie same hashe (to co przesyłasz jako "API-Hash")

EDIT:
Nie ustawiasz też tego z PHP, ale nie wiem czy wymagane:
curlsetopt($curl, CURLOPTRETURNTRANSFER, true);
  • Odpowiedz
@MaybeTomorrow: Czas mam w takim samym formacie jaki zwraca time() w PHP i jaki był w innych różnych postach na temat tego API. Sam czas też się zgadza - widać to po części tego co curl wywala do standardowego wyjścia, a czego tu nie wstawiłem. Tak, to jest UTC. Tak czy inaczej dostałbym 503 w odpowiedzi. Z odpaleniem w PHP pomysł dobry. W wypadku złego hasha powinienem jednak dostać 502. CURLOPTRETURNTRANSFER
  • Odpowiedz