Интеграция Twitch API в Discord Bot - более эффективный способ?

В настоящее время я пишу Discord Bot на C #. Я сделал большую часть работы с ботом, но в этом следующем обновлении я хочу добавить возможность проверки, если Streamer ушел вживую. В настоящее время я опрашиваю Twitch API и извлекаю файл JSON, который у него есть, и проверяю, является ли объект потока JSON нулевым или нет. Но это занимает 3-5 минут после запуска стримера, прежде чем он наконец увидит, что Stream не равен нулю, хотя я опрашиваю JSON каждые 5 секунд. Есть ли способ сделать это более эффективно? Мой код ниже:

       private const string Url = "https://api.twitch.tv/kraken/streams/streamer";
        var request = (HttpWebRequest)WebRequest.Create(Url);

        request.Method = "Get";
        request.Timeout = 12000;
        request.ContentType = "application/vnd.twitchtv.v5+json";
        request.Headers.Add("Client-ID", "ID");

        using (var s = request.GetResponse().GetResponseStream())
        {
            using (var sr = new System.IO.StreamReader(s))
            {

                var jsonObject = JObject.Parse(sr.ReadToEnd());
                var jsonStream = jsonObject["stream"];

                // twitch channel is online if stream is not null.
                LastTwitchStatus = jsonStream.Type != JTokenType.Null;
            }
        }

person Zack Arnett    schedule 28.04.2017    source источник


Ответы (1)


Похоже, это предполагаемое поведение Twitch API. Они определенно больше сосредоточены на потоковой передаче, а не на немедленном предоставлении данных через API.

Хотя может существовать подобное ограничение, вы можете попробовать удалить страницу, если время имеет решающее значение и вы не хотите ждать 3-5 минут, чтобы увидеть что-то, что уже произошло. Одна из идей состоит в том, чтобы опрашивать страницу каждые 5 секунд или около того, а затем запрашивать документ HTML на предмет каких-либо характеристик, которые отличают офлайн и онлайн канал.

Идея утилизации в JavaScript (просто реплицируйте в .NET):

Например, я попытался запросить страницы пользователей (https://www.twitch.tv/ имя пользователя) в JavaScript с помощью:

$(".recent-past-broadcast").length > 0

и для пользователя, который не транслирует, он дает true, а для пользователя, который транслирует, дает false. Проблема может быть в том, что пользователь не имеет истории последних трансляций.

Вы можете попробовать проверить страницу видео (https://www.twitch.tv/ имя пользователя / videos / all) для своего живого индикатора тоже вроде:

$(".cn-livestatus__circle").length > 0

Это даст true для пользователя потоковой передачи и false для пользователя, который не выполняет потоковую передачу (даже если он / она находится в сети).

Конечно, это наименее эффективный способ сделать это и требует большой загрузки по сравнению с простым опросом, но ... все же он кажется более актуальным, чем запрашивать API каждые 5 секунд и при этом получать фактическое состояние с задержкой на 3-5 минут.

Просто реплицируйте запросы, как указано выше, в .NET, и все готово.

Вы также можете смешать два подхода, и если вы увидите, что кто-то начал потоковую передачу, просто отключите удаление страниц и переключитесь только на вызовы API, чтобы проверить, обновлены ли вы.

Полезный инструмент для сдачи в лом:

Для синтаксического анализа HTML-документов используйте парсеры, такие как AngleSharp, чтобы сделать это в .NET: https://github.com/AngleSharp/AngleSharp

person mwilczynski    schedule 28.04.2017