Новичок
Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2019
Репутация: нет Всего: нет
|
Раз уж тема валяется без ответа, то надо ответить. Вдруг еще кто-то ищет. Код | unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.WinInet, System.JSON, Vcl.StdCtrls;
type TForm1 = class(TForm) btnCheck: TButton; function CheckLive(ChannelName : string) : Boolean; procedure btnCheckClick(Sender: TObject); private { Private declarations } public { Public declarations } end;
const TWITCH_CLIENT_ID : string = '<ваш Client-ID>'; TWITCH_USER_LOGIN_URL = 'https://api.twitch.tv/kraken/users?login=<channame>'; TWITCH_CHANNEL_STREAM_LIVE = 'https://api.twitch.tv/kraken/streams/<channel_id>';
var Form1: TForm1;
implementation
{$R *.dfm}
function Https_Get(sURL : string; var res : string; var ErrorCode : Integer) : Boolean; const sUserAgent = 'Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101'; var hInet : HINTERNET; hConnect : HINTERNET; hRequest : HINTERNET; lpdwBufferLength: DWORD; lpdwReserved : DWORD; dwBytesRead : DWORD; lpdwNumberOfBytesAvailable : DWORD; b, _pos : Cardinal; ResponseText : AnsiString; ServerName, Resource, Header : string; p : PChar; begin Result := False; res := ''; _pos := Pos('://', sURL); Header := Copy(sURL, 1, _pos + 2); Delete(sURL, 1, _pos + 2); _pos := Pos('/', sURL); ServerName := Copy(sURL, 1, _pos - 1); Delete(sURL, 1, _pos - 1); Resource := sURL; hInet := InternetOpen(PChar(sUserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned(hInet) then begin hConnect := InternetConnect(hInet, PChar(ServerName), INTERNET_DEFAULT_HTTPS_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0); if Assigned(hConnect) then begin p := PChar('Accept: application/vnd.twitchtv.v5+json' + #0); hRequest := HttpOpenRequest(hConnect, 'GET', PChar(Resource), HTTP_VERSION, '', @p, INTERNET_FLAG_SECURE, 0); if Assigned(hRequest) then begin Header := 'Client-ID: ' + TWITCH_CLIENT_ID; if not HttpSendRequest(hRequest, PChar(Header), Length(Header), nil, 0) then begin InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInet); Exit; end;
lpdwBufferLength := SizeOf(dword); lpdwReserved := 0; if not HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, @ErrorCode, lpdwBufferLength, lpdwReserved) then begin InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInet); Exit; end;
if ErrorCode = 200 then begin _Pos := 1; ResponseText := ''; repeat if not InternetQueryDataAvailable(hRequest, lpdwNumberOfBytesAvailable, 0, 0) then begin Result := False; InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInet); Exit; end; SetLength(ResponseText, Length(ResponseText) + lpdwNumberOfBytesAvailable); if InternetReadFile(hRequest, @ResponseText[_pos], lpdwNumberOfBytesAvailable, b) then Inc(_Pos, b); until b = 0; res := UTF8ToString(ResponseText); Result := True; end; InternetCloseHandle(hRequest); end; InternetCloseHandle(hConnect); end; InternetCloseHandle(hInet); end; end;
function GetUserID(UserLogin : string; var res : string) : Boolean; var Json : TJSONObject; JsonArr : TJSONArray; t : string; i : Integer; begin Result := False; t := StringReplace(TWITCH_USER_LOGIN_URL, '<channame>', UserLogin, [rfReplaceAll]); if Https_Get(t, t,i) then begin Json := TJSONObject.ParseJSONValue(t) as TJSONObject; JsonArr := (json.Get('users').JsonValue as TJSONArray); if JsonArr.Count > 0 then begin res := (JsonArr.Get(0) as TJSONObject).Get('_id').JsonValue.Value; Result := True; end else begin Result := False; res := ''; end; end else res := ''; end;
function TForm1.CheckLive(ChannelName : string) : Boolean; var id, JsonText : string; c : Integer; json : TJSONObject; jv : TJSONValue; begin if GetUserID(ChannelName, id) then begin if Https_Get(StringReplace(TWITCH_CHANNEL_STREAM_LIVE, '<channel_id>', id, [rfReplaceAll]), JsonText, c) then begin json := TJSONObject.ParseJSONValue(JsonText) as TJSONObject; jv := json.Get('stream').JsonValue; if not (jv is TJSONNull) then Result := True else Result := False; end; end else begin Result := False; end; end;
procedure TForm1.btnCheckClick(Sender: TObject); begin if CheckLive('miramisu') then ShowMessage('трансляция есть') else ShowMessage('трансляции нет или ошибка получения данных'); end;
end.
|
Чтобы это работало, надо зарегистрироваться на dev-сайте твича, сгенерировать там свой Client-ID и подставить его в этот код. Без этого работать не будет!
|