Как получить количество лайков и зрителей прямого эфира на ютубе?

Пишу на Java, хочу использовать JSoup для парсинга страницы со стримом. Не хочу использовать YT api, чтобы не упираться в квоту. Проблема в том, что я не знаю, как из полученного со стрима html кода вырвать эту информацию? Уже не могу разобраться самостоятельно, подскажите пожалуйста


Ответы (1 шт):

Автор решения: komla3

Вот код поиска нужного нам элемента для его парсинга

Document liveDocument = Jsoup.connect(href).get(); //получаем страницу со стримом
Elements elements1 = liveDocument.body().select("script[nonce]"); //получаем элементы по тегу script[nonce], потому что информация о зрителях и лайках находится именно здесь
for (Element element : elements1) { //перебираем полученные скрипты (элементы)
   if (element.dataNodes().toString().contains("Сейчас смотрят")) { //если у итерируемого элемента содержатся слова "Сейчас смотрят" (когда идет стрим, под ним написано "Сейчас смотрят: кол-во), то это нужный элемент
       String html = element.dataNodes().toString().replace("var ytInitialData = ", "");
       //делаем с полученным кодом что нам нужно...

    }
 }

А вот код для полного решения моей задачи (получение зрителей и лайков)

private void test(String html) {
    JsonObject mainInfo = new JsonParser().parse(html).getAsJsonArray()
            .get(0).getAsJsonObject()
            .getAsJsonObject("contents")
            .getAsJsonObject("twoColumnWatchNextResults")
            .getAsJsonObject("results")
            .getAsJsonObject("results")
            .getAsJsonArray("contents")
            .get(0).getAsJsonObject()
            .getAsJsonObject("videoPrimaryInfoRenderer");

    JsonObject likesInfo = mainInfo.getAsJsonObject("videoActions")
            .getAsJsonObject("menuRenderer")
            .getAsJsonArray("topLevelButtons")
            .get(0).getAsJsonObject()
            .getAsJsonObject("toggleButtonRenderer")
            .getAsJsonObject("defaultText");

    int viewers = Integer.parseInt(mainInfo.getAsJsonObject("viewCount")
                .getAsJsonObject("videoViewCountRenderer")
                .getAsJsonObject("viewCount")
                .getAsJsonArray("runs")
                .get(1).getAsJsonObject()
                .get("text")
                .getAsString().replaceAll("[^0-9]", "")
    );

    int likes = Integer.parseInt(likesInfo
            .getAsJsonObject("accessibility")
            .getAsJsonObject("accessibilityData")
            .get("label").getAsString().replaceAll("[^0-9]", "")
    );

    String simpleLikes = likesInfo.get("simpleText").getAsString();

    System.out.println("Зрителей: " + viewers);
    System.out.println("Упрощенное кол-во лайков: " + simpleLikes);
    System.out.println("Полное кол-во лайков: " + likes);
}
→ Ссылка