API:Исследователь:Example3

Материал из КардиоКВАРК
Перейти к: навигация, поиск
{
  Используется:
    Synapse - при компиляции
    OpenSSL - libeay32.dll и ssleay32.dll поместить рядом с example.exe
}
program example;

uses
  fpjson,
  httpsend,
  jsonparser,
  ssl_openssl,
  sysutils;

const
  API = 'https://b-api.cardioqvark.ru:1443/';
  Cloud = 'https://b-g1.cardioqvark.ru/';
  CertCAFile = 'cardio-ca-crt.pem';
  CertificateFile = 'cardio-account-XXXX-crt.pem';
  PrivateKeyFile = 'cardio-account-XXXX-key.pem';

function Get(Url: String; Status: Integer; Header: String): String;
var
  S: THTTPSend;
begin
  S := THTTPSend.Create;
  if Length(Header) > 0 then
    S.Headers.Add(Header);
  S.Sock.CreateWithSSL(TSSLOpenSSL);
  S.Sock.SSLDoConnect;
  S.Sock.SSL.CertCAFile := CertCAFile;
  S.Sock.SSL.CertificateFile := CertificateFile;
  S.Sock.SSL.PrivateKeyFile := PrivateKeyFile;
  try
    S.HTTPMethod('GET', URL);
    if S.ResultCode = Status then
      SetString(Result, PChar(S.Document.Memory), S.Document.Size div sizeof(Char))
    else
      raise Exception.Create('Unexpected HTTP status code: ' + IntToStr(S.ResultCode));
  finally
    S.Free;
  end;
end;

function Token(Id: Integer): String;
var
  Str: String;
  JObj: TJSONObject;
begin
  Str := Get(API + 'token/' + IntToStr(Id), 200, '');
  JObj := TJSONObject(GetJSON(Str));
  Result := JObj.Get('token');
end;

procedure Download(Id: Integer; T: Integer; Token: String; FileName: String);
var
  S: THTTPSend;
begin
  S := THTTPSend.Create;
  S.Headers.Add('Authorization: Token ' + Token);
  S.Sock.CreateWithSSL(TSSLOpenSSL);
  S.Sock.SSLDoConnect;
  try
    S.HTTPMethod('GET', Cloud + 'file/' + IntToStr(Id) + '/' + IntToStr(T));
    if S.ResultCode = 200 then
      S.Document.SaveToFile(FileName)
    else
      raise Exception.Create('Unexpected HTTP status code: ' + IntToStr(S.ResultCode));
  finally
    S.Free;
  end;
end;

var
  I, Id: Integer;
  Str: String;
  JObj: TJSONObject;
  JArr: TJSONArray;
begin
{ читаем 10 файлов }
Str := Get(API + 'cardiogram?minDuration=60&desc=1', 200, 'Range: items=0-9');
JArr := TJSONArray(GetJSON(Str));
for I := 0 to JArr.Count - 1 do
  begin
  JObj := JArr.Objects[I];
  Id := JObj.Get('id');
  Str := Token(Id);
  Download(Id, 100, Str, IntToStr(Id) + '-1K-raw.wav');
  Writeln(Id, ' ok');
  end;
end.