Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Btc-e bot api

флуд, оффтопик и т.д.
Post Reply
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Btc-e bot api

Post by drabadan »

Как обычно из-за дурной головы ноги болят...
Пытаюсь понять как авторизоваться на делфи к бирже БТЦ-е, ничегошеньки даже и рядом у меня не получается!
Вот к чему пришел но оно не работает, не могу понять как декодить строку в нормальный формат ну или вообще я туда копаю или нет?

Условия авторизации:

Code: Select all

Авторизация происходит посредством отправки следующих HTTP заголовков:
Key — API-ключ. пример API-ключа: 46G9R9D6-WJ77XOIP-XH9HH5VQ-A3XN3YOZ-8T1R8I8T;
Sign — POST данные (?param=val&param1=val1), подписанные секретным ключом методом HMAC-SHA512;
Отправленных на https://btc-e.com/tapi .
Так же необходимо посылать POST-параметр nonce с инкрементным числовым значением.(>0)
вот к чему дошел я:

Code: Select all

function EncryptHMACSHA512(const Input : String; const AKey : String) : PChar;
begin
  IdSSLOpenSSL.LoadOpenSSLLibrary;
  with TIdHMACSHA512.Create do
    try
      Key := ToBytes(AKey);
      result := PChar(HashValue(ToBytes(Input)));
    finally
      Free;
    end;
end;

procedure PostMessage(const Text : String);
var
  PostData : TStringList;
  Response : TStringStream;
begin
  try
    Response := TStringStream.Create('');
    PostData := TStringList.Create;
    PostData.Clear;
    PostData.Add('Key=' + Key + '&');    
    PostData.Add('Sign=' + WideString(EncryptHMACSHA512(Key, Sign)));
    Form1.Edit2.Text := PostData.Text;
    Form1.IdHTTP1.Post('https://btc-e.com/tapi', PostData, Response);
    Form1.Edit1.Text := Response.DataString;
  finally
    Response.Free;
    PostData.Free;
  end;
end;
Если кто понимает о чем тут идет речь - подскажите в какую сторону копать, гугл стаковерфлов перечитан.

З.Ы. https://github.com/DmT021/BtceApi реализация на шарпе.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Btc-e bot api

Post by Vizit0r »

Code: Select all

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdServerIOHandler, IdSSL, IdSSLOpenSSL,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  Vcl.StdCtrls, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdHMACSHA1, IdGlobal,
  Generics.Collections, IdURI, IdSSLOpenSSLHeaders;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    IdHTTP1: TIdHTTP;
    IdSSLOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Key : String;
  hasher : TIdHMACSHA512;
  nonce : Integer;
  PostStringsArray : TDictionary<String,String>;

implementation

{$R *.dfm}

function EncryptHMACSHA512(bytes : TIdBytes) : String;
begin
{.$DEFINE STRING_IS_ANSI}
  result := ToHex(hasher.HashValue(bytes));
{.$UNDEF STRING_IS_ANSI}
end;

function BuildPostData(StringArray : TDictionary<String,String>) : String;
var StringBuilder : TStringBuilder;
    item : TPair<String,String>;
begin
  StringBuilder := TStringBuilder.Create;
  if StringArray.Count = 0 then Exit('');
  for item in StringArray do
  begin
    StringBuilder.AppendFormat('%s=%s', [item.Key, item.Value]);
    StringBuilder.Append('&');
  end;
  if StringBuilder.Length > 0 then
    StringBuilder.Remove(StringBuilder.Length - 1, 1);
  Result := StringBuilder.ToString;
end;

procedure PostMessage(const Text : String);
var
  PostData : TStringList;
  Response : TStringStream;
  datastr : String;
begin
  try
    Response := TStringStream.Create('');
    PostData := TStringList.Create;

    PostStringsArray.Add('method', 'getInfo');
    PostStringsArray.Add('nonce', nonce.ToString);
    datastr := BuildPostData(PostStringsArray);
    PostData.Clear;
    PostData.Add('Key=' + Key + '&');
    PostData.Add('Sign=' + EncryptHMACSHA512(ToBytes(datastr)).Replace('-','').ToLower);
    Form1.Edit2.Text := PostData.Text;
    Form1.IdHTTP1.Post('https://btc-e.com/tapi', PostData, Response);
    Form1.Edit1.Text := Response.DataString;
  finally
    Response.Free;
    PostData.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var datastr : String;
begin
PostStringsArray.Add('method', 'getInfo');
PostStringsArray.Add('nonce', nonce.ToString);
datastr := BuildPostData(PostStringsArray);

Edit3.Text := 'Key=' + Key;
Edit4.Text := 'Sign=' + EncryptHMACSHA512(ToBytes(datastr)).Replace('-','').ToLower;

end;

const
    SecPerDay = 86400;
    Offset1970 = 25569;

procedure TForm1.FormCreate(Sender: TObject);
begin
PostStringsArray := TDictionary<String,String>.Create;
LoadOpenSSLLibrary;
Key := Edit1.Text;
hasher := TIdHMACSHA512.Create;
hasher.Key := ToBytes(Edit2.Text);
nonce := Trunc((Now - Offset1970) * SecPerDay);
end;

end.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Btc-e bot api

Post by drabadan »

Vizit0r wrote:[большой код]
если найду твою фотку - поставлю как икону!
*здец...
Post Reply