Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить состояние трансляции, Состояние плеера на странице 
:(
    Опции темы
mp3corp
Дата 13.5.2013, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.5.2013

Репутация: нет
Всего: нет



Всем доброго дня) Есть следующая задача:
есть такой сайт twitch.tv на котором крутятся разл. трансляции игр и прочего. Делаю приложение которое будет отслеживать состояние такой транслюции
(появляется иконка в трей, кр.-флажок--нет транслцяии, зеленый -есть). Изначально хотел сделать по след. алгоритму:
Через idHTTP, гружу страничку в какую нибудь переменную, потом парсингом ищу знач. тега активных смотрящих(когда трансляция не запущена там пусто(<span></span> - это для примера), на активной трансляции там появляется тег - Style, но вся проблема в том, что бы этот тег появился нужно на этой странице посидеть сек. 10-15, а при загрузки в переменную там как на незапущенной трансляции.
Следовательно вопрос, можно как нибудь опросить сам плеер и получить его состояние, либо какие еще есть варианты решения данной задачи?
PM MAIL   Вверх
RAIN666
Дата 4.3.2019, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 и подставить его в этот код. Без этого работать не будет!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1166 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.